Wang Haihua
🍈 🍉🍊 🍋 🍌
下表的数据是从测量酵母培养物增长的实验收集而来的,请建立数学模型,模拟酵母培养物的增长过程。
时刻/小时 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
生物量/克 | 9.6 | 18.3 | 29.0 | 47.2 | 71.1 | 119.1 | 174.6 | 257.3 | 350.7 | 441.0 |
时刻/小时 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | |
生物量/克 | 513.3 | 559.7 | 594.8 | 629.4 | 640.8 | 651.1 | 655.9 | 659.6 | 661.8 |
记表中的第 $k$ 小时的酵母生物量为 $x_{k}(k=0,1, \cdots, 18)$ 克。为了构建数学模型, 首先绘制 $x_{k}$ 关于 $k$ 的散点图。观测 $x_{k}$ 关于 $k$ 的散点图, 可以发现 $x_{k}$ 关于 $k$ 的散点沿 $\mathrm{S}$ 型曲线分布, $x_{k}$ 随着 $k$ 单调增加, $x_{k}$ 可能趋于 稳定值。因而我们选择离散 Logistic 模型研究酵母生物量的变化趋势。
根据上述问题分析, 我们选择离散 Logistic 模型 $$ x_{k+1}=x_{k}+r x_{k}\left(1-\frac{x_{k}}{N}\right), \quad k=0,1,2, \cdots $$ 其中, $r$ 为固有增长率, $N$ 为系统最大容量。
要求解模型, 需要先拟合模型中的末知参数 $r, N$, 我们使用最小二乘法拟合参数 $r, N$ 。首先把上式式改写为 $$ r x_{k}-s x_{k}^{2}=x_{k+1}-x_{k}, $$ 其中, $s=r / N$ ,把已知的 19 个观测值代入 (13.24) 式,得到关于 $r, s$ 的超定线性方程组
$$ \left[\begin{array}{cc} x_{0} & -x_{0}^{2} \\ x_{1} & -x_{1}^{2} \\ \vdots & \vdots \\ x_{17} & -x_{17}^{2} \end{array}\right]\left[\begin{array}{c} r \\ s \end{array}\right]=\left[\begin{array}{c} x_{1}-x_{0} \\ x_{2}-x_{1} \\ \vdots \\ x_{18}-x_{17} \end{array}\right], $$利用 Python 软件, 求得 $r=0.5577, s=0.00085, N=654.0487$ 。 已知原始数据和拟合值对比如图下图:
经检验模型对已知点预测的最大相对误差为31.47%,也就是中间数据点的预测值的偏差有点大,模型还有进一步改进的必要。
离散Logistic模型不仅可以应用于酵母培养物的变化趋势研究,还可以应用于其他具有S型变化趋势的种群问题。
代码
import numpy as np
from matplotlib.pyplot import rc, plot, show, legend, figure
rc('font',size=16); rc('font',family='SimHei')
a=np.loadtxt("Pdata13_6.txt");
plot(np.arange(0,19),a,'*'); show()
b=np.c_[a[:-1],-a[:-1]**2]
c=np.diff(a); x=np.linalg.pinv(b).dot(c)
r=x[0]; N=x[0]/x[1]
print("r,s,N的拟合值分别为:",r,'\t',x[1],'\t',N)
Tx=np.zeros(19); Tx[0]=9.6; x0=9.6
for i in range(1,19):
xn=x0+r*x0*(1-x0/N)
Tx[i]=xn; x0=xn
figure; plot(np.arange(0,19),a,'*')
plot(np.arange(19), Tx,'o-')
legend(("原始数据点","拟合值"), loc='best'); show()
delta=np.abs((Tx-a)/a);
print("所有已知点的预测值的相对误差",delta)
print("最大相对误差:",delta.max())
参考资料
import numpy as np
from matplotlib.pyplot import rc, plot, show, legend, figure, savefig
rc('font',size=16); rc('font',family='SimHei')
a=np.loadtxt("data/yeast.txt");
plot(np.arange(0,19),a,'*');
savefig('images/diff1501.png')
show()
b=np.c_[a[:-1],-a[:-1]**2]
c=np.diff(a); x=np.linalg.pinv(b).dot(c)
r=x[0]; N=x[0]/x[1]
print("r,s,N的拟合值分别为:",r,'\t',x[1],'\t',N)
Tx=np.zeros(19); Tx[0]=9.6; x0=9.6
for i in range(1,19):
xn=x0+r*x0*(1-x0/N)
Tx[i]=xn; x0=xn
figure; plot(np.arange(0,19),a,'*')
plot(np.arange(19), Tx,'o-')
legend(("原始数据点","拟合值"), loc='best');
savefig('images/diff1502.png')
show()
delta=np.abs((Tx-a)/a);
print("所有已知点的预测值的相对误差",delta)
print("最大相对误差:",delta.max())
r,s,N的拟合值分别为: 0.557685110296146 0.000852666006998164 654.0487198023678
所有已知点的预测值的相对误差 [0. 0.18714779 0.20751036 0.25108755 0.24055326 0.3146622 0.30433425 0.31355683 0.29135431 0.24159705 0.17086125 0.09147712 0.03899245 0.02798153 0.01087147 0.0097392 0.00919947 0.01124355 0.01296336] 最大相对误差: 0.3146622036442505