1

我正在尝试使用 SIR 模型模拟流感流行:http ://en.wikipedia.org/wiki/Epidemic_model#The_SIR_Model 。

它基本上需要我同时求解 3 个微分方程。

我的任务是将图表拟合到一组数据中,我只是想知道我应该如何去做。

我设法设置了一个系统来解决这样的 ODE:

function dydt = sir_ode(t,y,p)
B = p(1);
r = p(2);
S = y(1);
I = y(2);
R = y(3);
dydt = [-B*I*S; B*I*S - r*I; r*I];

和 m 文件来调用它:

time = 1:24;
y0 = [400 1 0];
tspan = time;
p0 = [.01 .5];
[t,y] = ode45(@sir_ode,tspan,y0,[],p0);

所以我有一个 tspan,我有一个 S、I 和 R 的 y0 矩阵。对于我的函数,输出包含 3 个微分方程,因此我可以与 ode45 函数一起求解它们。

现在我需要做的就是找到合适的 p0 矩阵,这样我就可以将曲线拟合到我的数据中。

首先,任何人都可以看到我的求解方法中的任何缺陷,其次,谁会对我如何找到最佳 p0 矩阵有任何建议?

谢谢!!

4

1 回答 1

2

解决方法对我来说似乎是正确的。

对于您问题的第二部分,在每个优化问题中都有一个您想要最大化或最小化的函数(使用各种算法,稍后会详细介绍)。在这里你可以最小化一个误差函数。误差函数的一种可能设计是函数之间的 L2 距离(或者在您的情况下,原始数据曲线与模型在每个时间步给出的曲线之间的点的平方距离之和)。考虑到您已经拥有的代码,这应该相当简单。

现在你有一个函数,它的参数是 p0 并且输出是你遇到的错误。最小值显然是 0,并且函数是确定性的。我的猜测是它应该相当顺利,但我没有证据证明这一点。现在要最小化它,有很多方法(最简单的是梯度下降法和牛顿法)。但是 Matlab 中的fminsearch函数应该可以解决问题。确保测试多个起点,因为您可能会发现几个局部最小值。

于 2013-05-23T08:19:34.463 回答