optimize库中的fsolve函数可以用来对非线性方程组进行求解。它的基本调用形式如下:
fsolve(func, x0)func(x)是计算方程组误差的函数,它的参数x是一个矢量,表示方程组的各个未知数的一组可能解,func返回将x代入方程组之后得到的误差;x0为未知数矢量的初始值。
由于fsolve函数在调用函数f时,传递的参数为数组,因此如果直接使用数组中的元素计算的话,计算速度将会有所降低,因此这里先用float函数将数组中的元素转换为Python中的标准浮点数,然后调用标准math库中的函数进行运算。
在对方程组进行求解时,fsolve会自动计算方程组的雅可比矩阵,如果方程组中的未知数很多,而与每个方程有关的未知数较少时,即雅可比矩阵比较稀疏时,传递一个计算雅可比矩阵的函数将能大幅度提高运算速度。在一个模拟计算的程序中需要大量求解近有50个未知数的非线性方程组的解。每个方程平均与6个未知数相关,通过传递雅可比矩阵的计算函数使计算速度提高了4倍。
雅可比矩阵
雅可比矩阵是一阶偏导数以一定方式排列的矩阵,它给出了可微分方程与给定点的最优线性逼近,因此类似于多元函数的导数。
上代码:
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
方程组:
5*x1 + 3 = 0
4*x0*x0 - 5*(x1*x2) = 0
x1*x2 - 2.5 = 0
'''
from scipy.optimize import fsolve,leastsq
# from math import sin,cos
def f(x):
x0 = float(x[0])
x1 = float(x[1])
x2 = float(x[2])
return [
5*x1+3,
4*x0*x0 - 5*(x1*x2),
x1*x2 - 2.5
]
x0 = [1,1,1]
result = fsolve(f,x0)
print("===================")
print()
print("求解函数名称:",fsolve.__name__)
print("解:",result)
print("各向量值:",f(result))
#拟合函数来求解
h = leastsq(f,x0)
print("===================")
print()
print("求解函数名称:",leastsq.__name__)
print("解:",h[0])
print("各向量的值:",f(h[0]))输出结果:
===================
求解函数名称: fsolve
解: [-1.76776695 -0.6 -4.16666667]
各向量值: [0.0, 1.7763568394002505e-14, 1.7763568394002505e-15]
===================
求解函数名称: leastsq
解: [ 1.76776695 -0.6 -4.16666667]
各向量的值: [0.0, 1.7763568394002505e-15, 0.0]