我正在尝试加快使用 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 返回雅可比矩阵;p0 是初始参数猜测。在纯 numpy 中,这是有效的。现在,例如,如果我更改 myfn(或 Dfun)以使用 weave.inline 合并 C 代码,则 weave.inline 编译器会中断。当我自己调用该函数时,它会返回正确的值;只有在被最小平方函数调用的上下文中,编译器才会中断。有什么想法吗?以下是我使用 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