我想知道如何提取状态变量的初始值。
基本上,初始值也被视为参数。
我提供了初始值,因为它们是集成所必需的。但是,这些值有时被视为附加参数(模型参数旁边),因此提供的初始值也被认为是初始猜测。事实上,在做生长实验时,我们有一些初始条件,但我们可能并不知道所有这些(取决于具体的实验条件和所研究的系统)。
考虑一个简单的微生物生长模型,其生长速率 mu 由著名的 Monod 动力学(参数 mumax 和 ks)和恒定的生物质底物产量(参数 yxs)和与生长相关的产物形成(参数 ypx)控制。请参阅下面的代码。
对于进一步的实现,我想计算随时间变化的一阶灵敏度、参数相关性等。
from symfit import variables, parameters, ODEModel, Fit, D
import numpy as np
from matplotlib import pyplot as plt
# define ODE model
ks, mumax, ypx, yxs = parameters('ks, mumax, ypx, yxs')
p, s, x, t = variables('p, s, x, t')
model_dict = {
D(x, t): mumax * s / (ks + s) * x,
D(s, t): -1/yxs * mumax * s / (ks + s) * x,
D(p, t): ypx * mumax * s / (ks + s) * x,
}
ode_model = ODEModel(model_dict, initial={t:0.0, x:0.1, s:20.0, p:0.0})
# Generate noisy measurement data
tSample = np.array([1, 2, 4, 6, 8, 12])
pSample, sSample, xSample = ode_model(t=tSample, ks=0.01, mumax=0.4, ypx=0.2, yxs=0.5)
xRelErr = 0.05
sRelErr = 0.10
pRelErr = 0.10
xNoise = xSample + xSample * xRelErr * np.random.randn(xSample.size)
sNoise = sSample + sSample * sRelErr * np.random.randn(sSample.size)
pNoise = pSample + pSample * pRelErr * np.random.randn(pSample.size)
# constraints for parameters
ks.min = 0.0
mumax.min = 0.0
ypx.min = 0.0
yxs.min = 0.0
# initial guesses for parameters
ks.value = 0.01
mumax.value = 0.4
ypx.value = 0.2
yxs.value = 0.5
# perform fitting
fit = Fit(ode_model, t=tSample, x=xNoise, s=sNoise, p=pNoise)
fit_result = fit.execute()
# show fit
print(fit_result)
print(fit_result.covariance_matrix)