scipy.optimizeの「leastsq」関数を使用する関数最小化ルーチンを高速化しようとしています。つまり、私は次のことを行っています。
def errfn(pars):
return myfn(ts,pars)-data
pfit,success = scipy.optimize.leastsq(errfn,p0,Dfun=Dfun,col_deriv=1)
errfnは、残差を返す関数です。DfunはJacobian行列を返します。p0は初期パラメーターの推測です。純粋なnumpyでは、これは機能します。たとえば、myfn(またはDfun)を変更してweave.inlineを使用してCコードを組み込むと、weave.inlineコンパイラが機能しなくなります。関数を単独で呼び出すと、正しい値が返されます。コンパイラーが機能しなくなるのは、leastsq関数によって呼び出される場合のみです。ここで何が起こっているのか考えはありますか?以下は、weave.inlineの使用方法です。
def myfn(t,p):
eta = p[0]
theta = p[1]
c = p[2]
tau = p[3]
nt = len(t)
fs = zeros(nt)
code = """
double T = 10000;
for (int i=0; i<nt; i++){
double tprime = T*sin(pi*(t(i)-tau)/T)/pi/eta;
fs(i) = 1-theta + 0.5*theta*(2 - tanh(c*(tprime + 0.5)) + tanh(c*(tprime - 0.5)));
}
"""
weave.inline(code,['fs','nt','eta','theta','c','tau','t','pi'],type_converters=converters.blitz)
return fs