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]