原文链接: python scipy fsolve 非线性方程组求解
上一篇: python numpy 和 opencv 图像拼接
下一篇: python scipy 奇异值分解 SVD
fsolve 非线性方程组求解
fsolve(fun,x0) 其中fun是计算方程组误差的函数,他的参数x是一个数组,其值为方程组 的一组可能解,fun返回将x带入方程组之后得到的每个方差的误差,x0是未知数的一组初始值
假设要对下列方程组求解
f1(u1,u2,u3)=0
f2(u1,u2,,u3)=0
f3(u1,u2,u3)=0
则fun函数可定义为
def fun(x):
u1,u2,u3 = x
return [f1(u1,u2,u3),f1(u1,u2,u3),f1(u1,u2,u3)]
例子
from math import sin, cos
from scipy import optimize
def f(x):
x0, x1, x2 = x.tolist()
return [
5 * x1 + 3,
4 * x0 ** 2 - 2 * sin(x1 * x2),
x1 * x2 - 1.5
]
result = optimize.fsolve(f, [1, 1, 1])
print(result)
print(f(result))
[-0.70622057 -0.6 -2.5 ]
[0.0, -9.126033262418787e-14, 5.329070518200751e-15]
在求解时,会自动计算方程组在某个点对各个未知数变量的偏导数,这些偏导数组成一个二维数组,数学上成为雅可比矩阵,如果未知数过多,
而与每个方程相关连的未知数较少,即雅可比矩阵比较稀疏时,通过传递雅可比矩阵可以提高运算速度
from math import sin, cos
from scipy import optimize
def f(x):
x0, x1, x2 = x.tolist()
return [
5 * x1 + 3,
4 * x0 ** 2 - 2 * sin(x1 * x2),
x1 * x2 - 1.5
]
def j(x):
x0, x1, x2 = x.tolist()
return [
[0, 5, 0],
[8 * x0, -2 * x2 * cos(x1 * x2), -2 * x1 * cos(x1 * x2)],
[0, x2, x1]
]
result = optimize.fsolve(f, [1, 1, 1], fprime=j)
print(result)
print(f(result))
[-0.70622057 -0.6 -2.5 ]
[0.0, -9.126033262418787e-14, 5.329070518200751e-15]
版权归原作者 阿豪boy 所有, 如有侵权,请联系我们删除。