前言

在科学计算中,我们经常会遇到数值计算,可能遇到高数,线性代数等,在实际的解题中可能会比较麻烦,可能还会出错,这里就对于python在科学计算中对线性方程组,做一简单介绍。

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

scipy非线性方程组求解

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

程序代码:

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)

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

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

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

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

方程表示

公式与代码之间转换:

  • 加号 +
  • 减号 -
  • 除号 /
  • 乘号 *
  • 指数 **
  • 对数 log()
  • e的指数次幂 exp()

简单的方程求解

2x-4=0的一元一次方程求解

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

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

结果:

[2]
[Finished in 1.3s]

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

二元一次方程方程的求解

求解方程:

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

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]

一元二次方程的求解

求解:

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

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)]))

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]

拓展 使用sympy 计算

求解八元一次方程,有兴趣的可以了解一下

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)

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)