如何使用python进行常规方程求解(Sympy or Scipy)(非线性方程组,一元二次方程,多元一次方程,因式分解等)

前言

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

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

scipy非线性方程组求解

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

可以做到先设置变量,然后打印不需要设置值的功能,例如:在我们日常书写中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))

结果:

[2]
[Finished in 1.3s]

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

二元一次方程方程的求解

求解方程:

2 x − y = 3 3 x + y = 7 2x-y=3\\3x+y=7 2xy=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]

拓展 使用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)

你可能感兴趣的:(Basic,Python)