Loading

Python最小二乘法解非线性超定方程组

求解非线性超定方程组,网上搜到的大多是线性方程组的最小二乘解法,对于非线性方程组无济于事。

这里分享一种方法: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)的朋友望告知。

 


posted @ 2017-08-04 16:26  gamesun  阅读(7243)  评论(2编辑  收藏  举报