Python levenberg-marquardt的最小二乘法求参数

Python levenberg-marquardt的最小二乘法求参数,python,parameters,ode,least-squares,levenberg-marquardt,Python,Parameters,Ode,Least Squares,Levenberg Marquardt,我正试图为我的leastsq模型和方程绘制数据,因为我不断得到形状误差。我只是想猜测符合数据的参数,但如果看不到图表,我就做不到 以下是我到目前为止的情况: from scipy.integrate import odeint Import numpy as np Import matplotlib.pyplot as plt #data didata1 = np.loadtxt("diauxic1.txt") time = didata1[:,0] pop2 = didata1[:,1]

我正试图为我的leastsq模型和方程绘制数据,因为我不断得到形状误差。我只是想猜测符合数据的参数,但如果看不到图表,我就做不到

以下是我到目前为止的情况:

from scipy.integrate import odeint
Import numpy as np
Import matplotlib.pyplot as plt

#data
didata1 = np.loadtxt("diauxic1.txt")
time = didata1[:,0]
pop2 = didata1[:,1]

# model equations
def diauxic_ode(x,t,params):
    r1,r2,k = params  
    y,S1,S2 = x
    derivs = [r1*S1*y+(k/(k+S1))*r2*S2*y, -r1*S1*y, -(k/(k+S1))*r2*S2*y]
    return derivs

# runs a simulation and returns the population size
def diauxic_run(pars,t):
    r1,r2,k,y0,S10,S20 = pars
    ode_params=[r1,r2,k]
    ode_starts=[y0,S10,S20]
    out = odeint(diauxic_ode, ode_starts, t, args=(ode_params,))
    return out[:,0] 

# residual function
def diauxic_resid(pars,t,data):
    r1,r2,k,y0,S10,S20 = pars
    ode_params=[r1,r2,k]
    ode_starts=[y0,S10,S20]
    out = odeint(diauxic_ode, ode_starts, t, args=(ode_params,))
    return diauxic_run(pars,t)-data


p0 =[1,1,1,1,1,1]
lsq_out = leastsq(diauxic_resid, p0, args=(time,pop2))

plt.plot(time,pop2,'o',time,diauxic_resid(p0,time,lsq_out[0]))

plt.show()


直接错误是调用diauxic\u resid(p0,time,lsq\u out[0])

  • 是否确实要在同一绘图中绘制原始数据和错误
  • resid
    run
    的参数都是错误的。在要绘制调整后的结果的参数中有一个初始点
    p0
    ,这已经很清楚了,即有些地方不正确
因此,用diauxic\u run(lsq\u out[0],time)替换。甚至更好的方法是,拆分打印命令并增加曲线的采样密度

plt.plot(时间,pop2,'o');
时间=np.linspace(时间[0],时间[-1],长度(时间)*10-9)
plt.plot(时间,二次运行(lsq输出[0],时间))

根据生成的测试数据

ptest = [0.5, 0.2, 20, 0.2,3.,1.5]
time = np.linspace(0,10,21);
pop2 = diauxic_run(ptest, time)+ np.random.randn(len(time))*0.01
导致拟合参数

lsq_out[0]: [ 0.23199391  0.5998453  20.67961621  0.19636029  2.16841159  2.32688635]