求解非线性超定方程组,网上搜到的大多是线性方程组的最小二乘解法,对于非线性方程组无济于事。
这里分享一种方法:SciPy库的scipy.optimize.leastsq函数。
import numpy as np from scipy.optimize import leastsq from math import sqrt def func(i): x,y,z = i return np.asarray(( x**2-x*y+4, x**2+y**2-x*z-25, z**2-y*x+4, x**3+y**3+z**3-127.6 )) root = leastsq(func, np.asarray((1,1,1))) # 初始猜测值 print(root[0])
运行结果:
[ 1.00886951 5.00607313 1.036197 ]
缺点:只是普通的最小二乘解法,对于参数过于相近的情况,比如病态雅克比矩阵的求解效果不好。
有知道L-M算法(Levenberg-Marquardt algorithm)的朋友望告知。