点击上方“编程派”,选择设为“设为星标”
优质文章,第一时间送达!
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{x: 2, 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 及以上数字,有惊喜好礼哦~
推荐阅读
2019年,大家都是怎么用 Pandas 的?
一篇文章读懂 Python 多线程
效率翻倍!再也不用手动改测试接口的参数了
一行代码弄懂数据,pandas最佳搭档就是ta了
让你赚钱更省力的 10 个开源项目!
题图:pexels,CC0 授权。