Sec Hotspot 首页  排行榜  收藏本站  技术博客  RSS
统计信息
已收录文章数量:15677 篇
已收录公众号数量:89 个
本站文章为爬虫采集,如有侵权请告知
已收录微信公众号
网信中国 区块链大本营 白说区块链 区块链投资家 区块链官微 区块链铅笔Blockchain HACK学习呀 二道情报贩子 合天智汇 小白帽学习之路 小米安全中心 弥天安全实验室 SAINTSEC SecPulse安全脉搏 TideSec安全团队 360安全卫士 游侠安全网 计算机与网络安全 安全祖师爷 安全学习那些事 腾讯安全联合实验室 黑客技术与网络安全 安全圈 腾讯御见威胁情报中心 Python开发者 Python之禅 编程派 Python那些事 Python程序员 安全威胁情报 吾爱破解论坛 行长叠报 安在 i春秋 嘶吼专业版 E安全 MottoIN 网信防务 网安杂谈 数说安全 互联网安全内参 漏洞战争 安全分析与研究 邑安全 ChaMd5安全团队 天融信阿尔法实验室 安全牛 SecWiki 安全学术圈 信安之路 漏洞感知 浅黑科技 Secquan圈子社区 奇安信集团 奇安信 CERT 国舜股份 雷神众测 盘古实验室 美团安全应急响应中心 瓜子安全应急响应中心 顺丰安全应急响应中心 蚂蚁金服安全响应中心 携程安全应急响应中心 滴滴安全应急响应中心 字节跳动安全中心 百度安全应急响应中心 腾讯安全应急响应中心 网易安全应急响应中心 OPPO安全应急响应中心 京东安全应急响应中心 Bypass CNNVD安全动态 安恒应急响应中心 天融信每日安全简报 奇安信威胁情报中心 看雪学院 黑白之道 水滴安全实验室 安全客 木星安全实验室 云鼎实验室 绿盟科技安全预警 白帽汇 深信服千里目安全实验室 腾讯玄武实验室 长亭安全课堂 FreeBuf 绿盟科技 nmask
如何用python解方程?
本文来自公众号:编程派   2020.11.21 11:40:11


点击上方“ 编程派 ”,选择设为“ 设为星标

优质文章,第一时间送达!



1

前言

在科学计算中,我们经常会遇到数值计算,可能遇到高数,线性代数等,在实际的解题中可能会比较麻烦,还会容易出错,这里就对于python在科学计算中,做一简单介绍,涉及非齐次方程组,多元一次方程组,符号运算,因式分解等。

在使用python进行线性方程组求解的时候,需要您去安装相应的程序包,scipy或者sympy,其官方文档分别为https://www.scipy.org/、https://docs.sympy.org/latest/index.html。

这里只做抛砖引玉之举,更多可参考官方指南。

2

scipy非线性方程组求解

求解线性方程组比较简单,只需要用到一个函数(scipy.linalg.solve)就可以了。比如我们要求以下方程的解,这是一个非齐次线性方程组:

程序代码:

 1import numpy as np
2from scipy.linalg import solve
3#输出系数矩阵
4a=np.array([[3,1,-2],[1,-1,4],[2,0,3]])
5#值
6b=np.array([5,-2,2.5])
7#计算
8x=solve(a,b)
9#打印结果
10print(x)

结果

1[0.5 4.5 0.5]
2[Finished in 1.2s]


3

sympy 数学方程求解


SymPy是比较强大的,可以做到符号的化简,求值等。SymPy是符号数学的Python库。它的目标是成为一个全功能的计算机代数系统,同时保持代码简洁、易于理解和扩展。SymPy完全是用Python写的,并不需要外部的库。

可以做到先设置变量,然后打印不需要设置值的功能,例如:在我们日常书写中 print(x+y) 是会报错的,然而使用了如下就不会报错了:

1from sympy import *
2x,y= symbols('x,y')
3print(x + y)

3.1

方程表示

公式与代码之间转换:

  • 加号 +

  • 减号 -

  • 除号 /

  • 乘号 *

  • 指数 **

  • 对数 log()

  • e的指数次幂 exp()

3.2

简单的方程求解

这里以一元一次方程为例,对 2x-4=0 进行求解,具体实现如下:

代码:

1from sympy import *
2x= symbols('x')
3print(solve(x*2-4,x))

结果:

1[2]
2[Finished in 1.3s]

需要说明的是:solve:第一个参数为要解的方程,要求右端等于0,第二个参数为要解的未知数。还有一些 其他的参数,想了解更多的可以去看官方文档。

3.3

二元一次方程方程的求解

以下介绍如何求解二元一次方程,具体如下:

代码:

1from sympy import *
2x,y= symbols('x,y')
3print(solve([2*x-y-3,3*x+y-7],[x,y]))

结果:

1{x2, y: 1}
2[Finished in 1.2s]

3.4

一元二次方程的求解

以下介绍如何求解一个一元二次方程,具体如下:

代码:

1from sympy import *
2x= symbols('x')
3print(solve(x**2+2*x+1,x))

结果:

1[-1]
2[Finished in 1.0s]

3.5

多项式化简并计算


以下介绍如何解多项式:x*x+a*a=0,然后带入a=3,求得的结果,具体如下:


代码:

1from sympy import *
2x,a= symbols('x,a')
3#计算多项式的结果,表达式方式的结果
4result_or=solve(x**2+a**2,x)
5print(result_or)
6#带入数值,这里设置a=3
7for temp in result_or:
8    print(temp.subs([(a,3)]))

结果:

1[-I*a, I*a]
2-3*I
33*I
4[Finished in 1.2s]


4

拓展 使用sympy 计算


以下是求解nature cubic spline中在三点情况下的曲线方程过程,计算比较简单。

 1from sympy import *
2
3a1,b1,c1,d1,a2,b2,c2,d2=symbols('a1,b1,c1,d1,a2,b2,c2,d2')
4x0,x1,x2,y0,y1,y2=symbols('x0,x1,x2,y0,y1,y2')
5result=solve([a1+b1*x0+c1*x0*x0+d1*x0*x0*x0-y0,
6    a1+b1*x1+c1*x1*x1+d1*x1*x1*x1-y1,
7    a2+b2*x1+c2*x1*x1+d2*x1*x1*x1-y1,
8    a2+b2*x2+c2*x2*x2+d2*x2*x2*x2-y2,
9    b1+2*c1*x1+3*d1*x1*x1-b2-2*c2*x1-3*d2*x1*x1,
10    c1+3*d1*x1-c2-3*d2*x1,
11    c1+3*d1*x0,
12    c2+3*d2*x2],[a1,b1,c1,d1,a2,b2,c2,d2])
13#设置参数
14cs=[(x0,6),(x1,9),(x2,12),(y0,0),(y1,3),(y2,0)]
15
16# print(result[a1])
17# print(result[b1])
18# print(result[c1])
19# print(result[d1])
20# print(result[a2])
21# print(result[b2])
22# print(result[c2])
23# print(result[d2])
24
25a1=result[a1].subs(cs)
26b1=result[b1].subs(cs)
27c1=result[c1].subs(cs)
28d1=result[d1].subs(cs)
29a2=result[a2].subs(cs)
30b2=result[b2].subs(cs)
31c2=result[c2].subs(cs)
32d2=result[d2].subs(cs)
33print(a1)
34print(b1)
35print(c1)
36print(d1)
37print(a2)
38print(b2)
39print(c2)
40print(d2)


回复下方「关键词」,获取优质资源


回复关键词「 pybook03」,立即获取主页君与小伙伴一起翻译的《Think Python 2e》电子版

回复关键词「入门资料」,立即获取主页君整理的 10 本 Python 入门书的电子版

回复关键词「m」,立即获取Python精选优质文章合集

回复关键词「book 数字」,将数字替换成 0 及以上数字,有惊喜好礼哦~


推荐阅读



题图:pexels,CC0 授权。