在科学计算中,我们经常会遇到数值计算,可能遇到高数,线性代数等,在实际的解题中可能会比较麻烦,可能还会出错,这里就对于python在科学计算中对线性方程组,做一简单介绍。
在使用python进行线性方程组求解的时候,需要您去安装相应的程序包,scipy或者sympy,其官方文档分别为https://www.scipy.org/、https://docs.sympy.org/latest/index.html。
求解线性方程组比较简单,只需要用到一个函数(scipy.linalg.solve)就可以了。比如我们要求以下方程的解,这是一个非齐次线性方程组:
3 x 1 + x 2 − 2 x 3 = 5 x 1 − x 2 + 4 x 3 = − 2 2 x 1 + 3 x 3 = 2.5 3x_1+x_2-2x_3=5\\x_1-x_2+4x_3=-2\\2x_1+3x_3=2.5 3x1+x2−2x3=5x1−x2+4x3=−22x1+3x3=2.5
程序代码:
import numpy as np
from scipy.linalg import solve
#输出系数矩阵
a=np.array([[3,1,-2],[1,-1,4],[2,0,3]])
#值
b=np.array([5,-2,2.5])
#计算
x=solve(a,b)
#打印结果
print(x)
结果:
[0.5 4.5 0.5]
[Finished in 1.2s]
SymPy是比较强大的,可以做到符号的化简,求值等。SymPy是符号数学的Python库。它的目标是成为一个全功能的计算机代数系统,同时保持代码简洁、易于理解和扩展。 SymPy完全是用Python写的,并不需要外部的库。
可以做到先设置变量,然后打印不需要设置值的功能,例如:在我们日常书写中print(x+y)
是会报错的,然而使用了如下就不会报错了:
from sympy import *
x,y= symbols('x,y')
print(x + y)
公式与代码之间转换:
对2x-4=0
的一元一次方程求解
from sympy import *
x= symbols('x')
print(solve(x*2-4,x))
结果:
[2]
[Finished in 1.3s]
需要说明的是:solve:第一个参数为要解的方程,要求右端等于0,第二个参数为要解的未知数。还有一些 其他的参数,想了解的可以去看官方文档。
求解方程:
2 x − y = 3 3 x + y = 7 2x-y=3\\3x+y=7 2x−y=33x+y=7
from sympy import *
x,y= symbols('x,y')
print(solve([2*x-y-3,3*x+y-7],[x,y]))
结果:
{x: 2, y: 1}
[Finished in 1.2s]
求解:
x 2 + 2 x + 1 = 0 x^2+2x+1=0 x2+2x+1=0
from sympy import *
x= symbols('x')
print(solve(x**2+2*x+1,x))
结果:
[-1]
[Finished in 1.0s]
from sympy import *
x,a= symbols('x,a')
#计算多项式的结果,表达式方式的结果
result_or=solve(x**2+a**2,x)
print(result_or)
#带入数值,这里设置a=3
for temp in result_or:
print(temp.subs([(a,3)]))
结果:
[-I*a, I*a]
-3*I
3*I
[Finished in 1.2s]
求解八元一次方程,有兴趣的可以了解一下
from sympy import *
a1,b1,c1,d1,a2,b2,c2,d2=symbols('a1,b1,c1,d1,a2,b2,c2,d2')
x0,x1,x2,y0,y1,y2=symbols('x0,x1,x2,y0,y1,y2')
result=solve([a1+b1*x0+c1*x0*x0+d1*x0*x0*x0-y0,
a1+b1*x1+c1*x1*x1+d1*x1*x1*x1-y1,
a2+b2*x1+c2*x1*x1+d2*x1*x1*x1-y1,
a2+b2*x2+c2*x2*x2+d2*x2*x2*x2-y2,
b1+2*c1*x1+3*d1*x1*x1-b2-2*c2*x1-3*d2*x1*x1,
c1+3*d1*x1-c2-3*d2*x1,
c1+3*d1*x0,
c2+3*d2*x2],[a1,b1,c1,d1,a2,b2,c2,d2])
#设置参数
cs=[(x0,6),(x1,9),(x2,12),(y0,0),(y1,3),(y2,0)]
# print(result[a1])
# print(result[b1])
# print(result[c1])
# print(result[d1])
# print(result[a2])
# print(result[b2])
# print(result[c2])
# print(result[d2])
a1=result[a1].subs(cs)
b1=result[b1].subs(cs)
c1=result[c1].subs(cs)
d1=result[d1].subs(cs)
a2=result[a2].subs(cs)
b2=result[b2].subs(cs)
c2=result[c2].subs(cs)
d2=result[d2].subs(cs)
print(a1)
print(b1)
print(c1)
print(d1)
print(a2)
print(b2)
print(c2)
print(d2)