【发布时间】:2022-01-07 11:11:34
【问题描述】:
我有一对 ODE,我目前正试图将它们拟合到我拥有的一个小数据集,但是我在优化两个参数(a 和 c)时遇到了一些问题。 ODE 采用稍微改变的 Lotka-Volterra 形式,由以下公式给出:
dT/dt = aT - bTL/(T+L+G)
dL/dt = cTL/(T+L+G) - dL
其中 b、G 和 d 是已知的,并且有一个小数据集可用于 T(t)(但不是 L(t))。
目前我已经尝试使用 odeint 来求解方程组,并定义了要在 lmfit.Minimize 中使用的残差函数,但是无论在 lmfit.Minimize 中选择哪种方法,我的解决方案都不太适合数据改变边界。
目前的代码如下:
def eqns(y, t, paras):
T,L=y
try:
c = paras['c'].value
a = paras['a'].value
except KeyError:
c, a = paras
b = 60*24
G = 1.7E9
d = 0.068
return [a*T-b*L*(T/(G+T+L)),c*T*(L/(G+T+L))-d*L]
# Solution to differential equations T'(t) = model(t,x,paras), given initial condition T0
def sol(t, x0, paras):
return odeint(eqns, x0, t, args=(paras,),rtol=1e-8,hmin=0.001,hmax=0.1)
# Define function to compute residuals
def residual(paras, t, data):
arg0 = paras['T0'].value, paras['L0'].value
model = sol(t, arg0, paras)
x2_model = model[:, 0]
return ((x2_model - data)**2).ravel()
# Set initial conditions
T0 = 50000
L0 = 1
y0 = [T0, L0]
# Measured data
t_measured = np.array([18,21,26,28,33])
T_measured = np.array([12667366.43,24917043.97,74910183.58,122959334.2,157298406])
# Set parameters including bounds
params = Parameters()
params.add('T0', value=T0, vary=False)
params.add('L0', value=L0, vary=False)
params.add('c', value=3, min=0.1, max=100)
params.add('a', value=0.2, min=0.01, max=10)
# Fit model
result = minimize(residual, params, args=(t_measured, T_measured), method='leastsq')
# Check effectiveness of fit
data_fitted = sol(np.linspace(0., 100, 1000), y0, result.params)
# Statistics of Fit
report_fit(result)
我相当肯定 a 和 c 的限制是合理的给定系统,但是拟合仍然不起作用。残差函数有问题吗?
【问题讨论】:
-
您说“我相当肯定 a 和 c 的限制在系统的情况下是合理的,但是适合仍然不起作用。我”您担心的依据是什么?除了帮我解决这个问题,还有什么问题需要解决?
-
抱歉,这个问题不太清楚。 a 和 c 的限制是合理的,因此不需要更改,但是在绘制时,解决方案与测量数据不符并产生巨大的误差线(来自 report_fit)。所以问题是,这可能是由于残差函数造成的吗?还是整合?
标签: python optimization ode