使用scipy 求解非线性方程组实例
'''
5 * x1 - 25 = 0
5 * x0 * x0 - x1 * x2 = 0
x2 * x0 -27 = 0
scipy.optimize fsolve(func, x)
所使用的scipy中的库optimize以及方法fsolve
func 是自己构造的函数
'''
from scipy.optimize import fsolve
def func(x):
x0, x1, x2 = x
return [
5 * x1 - 25,
5 * x0 * x0 - x1 * x2,
x2 * x0 - 27
]
r = fsolve(func, [1, 1, 1])
print(r)
# [3. 5. 9.]
使用求导矩阵加速
'''
5 * x1 + 3 = 0
5 * x0 * x0 - 2
sin(x1 * x2) = 0
x1 * x2 - 1.5 = 0
'''
from scipy.optimize import fsolve
from math import sin, cos
def func(x):
x0, x1, x2 = x
return [
5 * x1 + 3,
5 * x0 * x0 - 2 * sin(x1 * x2),
x1 * x2 - 1.5
]
def j(x):
x0, x1, x2 = x
return [
[0, 5, 0], # 分别对x0, x1, x2 求偏导
[10 * x0, -2 * x2 * cos(x1 * x2),
-2 * x1 * cos(x1 * x2)], [0, x2, x1]
]
r = fsolve(func, [1, 1, 1], fprime=j)
# 使用求导矩阵传入时可以提高4倍效率
print(r)
# [-0.63166288 -0.6 -2.5]