将数据拟合到常微分方程系统 - 使用 lambda 函数和 Scipy/Numpy/Python 的类型错误



我在运行代码时收到以下错误:

类型错误:lambda() 正好需要 4 个参数(给定 3 个)

这是我的代码 - 我的错误来自最后一行代码(我认为),我正在尝试实现 Scipy 的优化算法fmin

from pylab import * 
import pylab as pl
from numpy import *
from scipy.optimize import fmin
from scipy import integrate
import numpy as np
def ode(s,t,k1,k2):
    A = s[0]
    B = s[1]
    C = s[2]
    dA = -k1*A
    dB = k1*A-k2*B
    dC = k2*B
    ds = [dA,dB,dC]
    return ds
def myllsq(teta,s0,t,s):
    y_obs = s
    k1 = teta[0]
    k2 = teta[1]
    s = integrate.odeint(ode,s0,t,args=(k1,k2))
    y_cal = s[:,1]
    lsq = sum(y_obs-y_cal)**2
    return lsq 
e = lambda teta,s0,t,s: myllsq(teta,s0,t,s)
if __name__ == '__main__': 
    n = 10
    tmin = 0.0
    tmax = 9
    k1 = 0.3
    k2 = 0.2
    s0 = [1,0,0]
    t = linspace(tmin,tmax,n)
    s = [0.000,0.416,0.489,0.595,0.506,0.493,0.458,0.394,0.335,0.309]
    teta = [k1,k2]
    print e(teta,s0,t,s)
    fmin(e,teta,args=(t,s),maxiter=10000,maxfun=10000)

我认为它应该是这样的:

fmin(e,teta,args=(s0,t,s),maxiter=10000,maxfun=10000)

而不是:

fmin(e,teta,args=(t,s),maxiter=10000,maxfun=10000)

您没有将s0列表传递给您的函数。

作为旁注,这里不需要lambda。 你可以直接传递myllsq - e只是myllsq的一个效率较低的版本。

最新更新