我正在努力让我的Jacobian使用SciPy的Optimize库的minimalsq函数。
我有以下代码:
#!/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提供的更好的文档来源?
顺便说一下,我正在使用雅各布派,因为我有(可能被误导)的信念,它会导致更快的收敛。
答案 0 :(得分:4)
将residuals
更改为否定:
def residuals(p, x, y):
return func(p, x)-y
你得到了
[ 3. 5. 1.]
希望这会有所帮助:)