# 使用Python求解方程

32 篇文章 325 订阅

### Numpy 求解线性方程组

x + 2y = 3
4x ＋ 5y = 6


In [1]: import numpy as np
...: A = np.mat('1,2; 4,5')    # 构造系数矩阵 A
...: b = np.mat('3,6').T       # 构造转置矩阵 b （这里必须为列向量）
...: r = np.linalg.solve(A,b)  # 调用 solve 函数求解
...: print r
...:
Out[1]: [[-1.]
[ 2.]]


x + 2y = 3
4x ＋ 5y = 6


x + 2y = 7
4x ＋ 5y = 8


In [2]: import numpy as np
...: A = np.mat('1,2; 4,5')          # 构造系数矩阵 A
...: b = np.array([[3,6], [7,8]]).T  # 构造转置矩阵 b （这里必须为列向量），
...: 注意这里用的是 array
...: r = np.linalg.solve(A,b)        # 调用 solve 函数求解
...: print r
...:
Out[2]: [[-1.         -6.33333333]
[ 2.          6.66666667]]


### SciPy 求解非线性方程组

scipy.optimize.fsolve(func, x0, args=(), fprime=None, full_output=0, col_deriv=0, xtol=1.49012e-08, maxfev=0, band=None, epsfcn=None, factor=100, diag=None)[source]


x + 2y + 3z - 6 = 0
5 * (x ** 2) + 6 * (y ** 2) + 7 * (z ** 2) - 18 = 0
9 * (x ** 3) + 10 * (y ** 3) + 11 * (z ** 3) - 30 = 0


In [3]: from scipy.optimize import fsolve
...:
...: def func(i):
...:     x, y, z = i[0], i[1], i[2]
...:     return [
...:             x + 2 * y + 3 * z - 6,
...:             5 * (x ** 2) + 6 * (y ** 2) + 7 * (z ** 2) - 18,
...:             9 * (x ** 3) + 10 * (y ** 3) + 11 * (z ** 3) - 30
...:            ]
...:
...: r = fsolve(func,[0, 0, 0])
...: print r
...:
Out[3]: [ 1.00000001  0.99999998  1.00000001]


### SymPy 通吃一切

x + 2 * (x ** 2) + 3 * (x ** 3) - 6 = 0


In [4]: from sympy import *
...: x = symbols('x')
...: solve(x + 2 * (x ** 2) + 3 * (x ** 3) - 6, x)
Out[4]: [1, -5/6 - sqrt(47)*I/6, -5/6 + sqrt(47)*I/6]


@Wayne Shi

### SymPy简介

SymPy的官方教程：

https://github.com/sympy/sympy/wiki/Quick-examples

https://docs.sympy.org/latest/tutorial/index.html

SymPy是符号数学的Python库。它的目标是成为一个全功能的计算机代数系统，同时保持代码简洁、易于理解和扩展。

In [1]:from sympy import *
In [2]:x = Symbol('x')
In [3]:y = Symbol('y')123


#### 展开与折叠

expand( )展开方程

In [8]: ((x+y)**2).expand()
Out[8]: x**2 + 2*x*y + y**212


facrot( )折叠方程

In [13]: factor(x**2 + 2*x*y + y**2)
Out[13]: (x + y)**212


#### 分离与合并

apart( )分离整式

In [14]: together(1 + 2/(x - 1))
Out[14]: (x + 1)/(x - 1)12


together( )合并整式

In [10]: together(1/x+1/y+1/z)
Out[10]: (x*y + x*z + y*z)/(x*y*z)12


#### 简化表达式

simplify( )普通的化简

In [15]: simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
Out[15]: x - 112


trigsimp( )三角化简

In [18]: trigsimp(sin(x)/cos(x))
Out[18]: tan(x)12


powsimp( )指数化简

In [21]: powsimp(x**a*x**b)
Out[21]: x**(a + b)12


#### solve( )解方程

In [7]:solve(x * 3 - 6, x)
[2]12


In [8]: solve([2 * x - y - 3, 3 * x + y - 7],[x, y])
Out[8]: {x: 2, y: 1}12


#### limit( )求极限

dir=’+’表示求解右极限，dir=’-‘表示求解左极限

In [10]: limit(1/x,x,oo,dir='+')
Out[10]: 0
In [11]: limit(1/x,x,oo,dir='-')
Out[11]: 01234


#### integrate( )求积分

In [12]: integrate(sin(x),x)
Out[12]: -cos(x)12


In [13]: integrate(sin(x),(x,0,pi/2))
Out[13]: 112


#### diff( )求导

In [14]: diff(x**3,x)
Out[14]: 3*x**2

In [15]: diff(x**3,x,2)
Out[15]: 6*x12345


#### dsolve( )解微分方程

In [17]: f =Function('f')
In [18]: dsolve(diff(f(x),x) - 2*f(x)*x,f(x))
Out[18]: Eq(f(x), C1*exp(x**2))123


#### 矩阵化简

In [19]:x1,x2,x3 = symbols('x1 x2 x3')
In [20]:a11,a12,a13,a22,a23,a33 = symbols('a11 a12 a13 a22 a23 a33')
In [21]:m = Matrix([[x1, x2, x3]])
In [22]:n = Matrix([[a11, a12, a13], [a12, a22, a23], [a13, a23, a33]])
In [23]:v = Matrix([[x1], [x2], [x3]])
In [24]:f = m * n * v
In [25]:f[0].subs({x1:1, x2:1, x3:1})

Out[26]:Matrix([[x1*(a11*x1 + a12*x2 + a13*x3) + x2*(a12*x1 + a22*x2 + a23*x3) + x3*(a13*x1 + a23*x2 + a33*x3)]])
Out[27]:a11 + 2*a12 + 2*a13 + a22 + 2*a23 + a33
1234567891011


### （一）求解多元一次方程-solve()

#### 2.源代码：

"""
解下列二元一次方程
2x-y=3
3x+y=7
"""
# 导入模块
from sympy import *

# 将变量符号化
x = Symbol('x')
y = Symbol('y')
z = Symbol('z')

# 解一元一次方程
expr1 = x*2-4
r1 = solve(expr1, x)
r1_eq = solve(Eq(x*2, 4), x)
print("r1:", r1)
print("r1_eq:", r1_eq)

# 解二元一次方程
expr2 = [2*x-y-3, 3*x+y-7]
r2 = solve(expr2, [x, y])
print("r1:", r2)

# 解三元一次方程
f1 = x+y+z-2
f2 = 2*x-y+z+1
f3 = x+2*y+2*z-3
r3 = solve([f1, f2, f3], [x, y, z])
print("r3:", r3)


### （二）解线性方程组-linsolve（）

#### 1.说明：

1. 默认等式为0的形式：linsolve(eq, [x, y, z])
2. 矩阵形式：linsolve(eq, [x, y, z])
3. 增广矩阵形式：linsolve(A，b, x, y, z)

#### 2.源代码：

"""
x+y+z-2=0
2x-y+z+1=0
x+2y+2z-3=0
"""
from sympy import *

x, y, z = symbols("x y z")

# 默认等式为0的形式
print("======默认等式为0的形式 =======")
eq = [x+y+z-2, 2*x-y+z+1, x+2*y+2*z-3]
result = linsolve(eq, [x, y, z])
print(result)
print(latex(result))

# 矩阵形式
print("======矩阵形式 =======")
eq = Matrix(([1, 1, 1, 2], [2, -1, 1, -1], [1, 2, 2, 3]))
result = linsolve(eq, [x, y, z])
print(result)
print(latex(result))

# 增广矩阵形式
print("======增广矩阵形式 =======")
A = Matrix([[1, 1, 1], [2, -1, 1], [1, 2, 2]])
b = Matrix([[2], [-1], [3]])
system = A, b
result = linsolve(system, x, y, z)
print(result)
print(latex(result))


### （三）解非线性方程组-nonlinsolve（）

#### 1.说明：

nonlinsolve()用于求解非线性方程组，例如二次方，三角函数，，，等方程

#### 2.源代码：

"""
x**2+y**2-2=0
x**3+y**3=0
"""

import sympy as sy
x, y = sy.symbols("x y")

eq = [x**2+y**3-2, x**3+y**3]
result = sy.nonlinsolve(eq, [x, y])
print(result)
print(sy.latex(result))


#### 3.输出：

{(−1,1),(−1,−12−3i2),(−1,−12+3i2),(1−i,−1+i),(1+i,−1−i),(1−i−63+122−i−23+42,12+32+2−2+32),(1−−12−632+−4−232,−32+12−−8+(−3+1)22),(1−−4−232+−12−632,−32+12+−8+(−3+1)22),(1+−4+232+−12+632,12+32−2−2+32)}

### （四）求解微分方程-dsolve（）

#### 1.说明：

f = symbols(‘f’, cls=Function)的作用是声明f()是一个函数。

#### 2.源代码：

from sympy import *

# 初始化
x = symbols('x')
f = symbols('f', cls=Function)

# 表达式
expr1 = Eq(f(x).diff(x, x) - 2*f(x).diff(x) + f(x), sin(x))

# 求解微分方程
r1 = dsolve(expr1, f(x))

print(r1)
print("原式：", latex(expr1))
print("求解后：", latex(r1))


#### 3.输出：

f(x)−2ddxf(x)+d2dx2f(x)=sin⁡(x)

f(x)=(C1+C2x)ex+cos⁡(x)2

• 23
点赞
• 184
收藏
觉得还不错? 一键收藏
• 打赏
• 0
评论
06-17 1714
07-13 1万+
09-28 1077
05-20 6078
10-14 1万+
04-23
05-29
11-21 5万+
02-25 1257
08-22 1万+
08-13 909
11-26 6171

¥1 ¥2 ¥4 ¥6 ¥10 ¥20

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、付费专栏及课程。