SciPy LeastSq Dfun 用法

4 投票
1 回答
3770 浏览
提问于 2025-04-16 22:56

我正在尝试让我的雅可比矩阵与SciPy的优化库中的leastsq函数一起工作。

我有以下代码:

#!/usr/bin/python
import scipy
import numpy
from scipy.optimize import leastsq

#Define real coefficients
p_real=[3,5,1]

#Define functions
def func(p, x):         #Function
    return p[0]*numpy.exp(-p[1]*x)+p[2]

def dfunc(p, x, y):     #Derivative
    return [numpy.exp(-p[1]*x),-x*p[0]*numpy.exp(-p[1]*x), numpy.ones(len(x))]

def residuals(p, x, y):
    return y-func(p, x)

#Generate messy data
x_vals=numpy.linspace(0,10,30)
y_vals=func(p_real,x_vals)
y_messy=y_vals+numpy.random.normal(size=len(y_vals))

#Fit
plsq,cov,infodict,mesg,ier=leastsq(residuals, [10,10,10], args=(x_vals, y_vals), Dfun=dfunc, col_deriv=1, full_output=True)

print plsq

现在,当我运行这个代码时,我得到的返回值是 plsq=[10,10,10]。如果我去掉 Dfun=dfunc, col_deriv=1,那么我得到的结果就接近于 p_real

有没有人能告诉我这是怎么回事?或者能推荐比SciPy提供的文档更好的资料吗?

顺便说一下,我使用雅可比矩阵是因为我有一个(可能是错误的)想法,认为这样可以更快地收敛。

1 个回答

4

residuals 变成它的负值:

def residuals(p, x, y):
    return func(p, x)-y

这样你就得到了

[ 3.  5.  1.]

希望这对你有帮助 :)

撰写回答