2011-08-04 18 views
4

私はJacobianをSciPyのOptimizeライブラリのleastsq関数で動作させようとしています。SciPy LeastSq Dfun Usage

私は、次のコードを持っている:私はこれを実行したとき、私は私のリターンとしてplsq=[10,10,10]を取得し、今

#!/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 

を。私がDfun=dfunc, col_deriv=1を取ったとき、私はp_realの近くの何かを得る。

誰でも教えてください。あるいは、SciPyが提供するものよりも優れたドキュメントのソースを指摘してください。

ちなみに、私はヤコビ行列を使用しています。なぜなら、私は(おそらく誤って)信念があるために収束が速くなるからです。その負の

+0

あなたの誘導体は、それがどうあるべきかの否定であるようですが、私には見えます - あなたの残差は実際の関数ではなく実際の関数であるからです。 – Owen

+1

興味のある方のために。関数z = quad(x、y)で記述された3Dデータに5940の2次曲面を当てはめる上記のコードを同様に適用すると、ヤコビ行列を使用して平均0.5〜0.6秒のスピードアップが得られました。 – Richard

+0

typo:y_messyはy_valsではありませんか? – denis

答えて

4

変更residuals

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

、あなたが

[ 3. 5. 1.] 

を取得希望これは役立ちます:)

+0

オーウェン、残余をこのように配置する理由を知っていますか? – Richard

+0

@Richard:leastsqでは、勾配はフィットしている関数の勾配です - この場合は 'residuals'です - したがって、' residuals'の導関数を微分と同じにしたい'func'の – Owen

+0

私はあなたが持っているグラデーションのネガティブを取ることが別の選択肢になると思います。 – Owen