我正在尝试使用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矩阵有任何建议?
谢谢!
答案 0 :(得分:2)
解决方法对我来说似乎是正确的。
对于问题的第二部分,在每个优化问题中都有一个您希望最大化或最小化的函数(使用各种算法,稍后会详细介绍)。您可以最小化错误功能。误差函数的一种可能设计是函数之间的L2距离(或者在您的情况下,原始数据曲线与模型在每个时间步长给出的曲线之间的点的平方距离之和) )。根据您已有的代码,这应该相当简单。
现在你有一个函数,其参数是p0,输出是你的错误。最小值显然为0,并且函数是确定性的。我的猜测是它应该相当平滑,但我没有证据。现在要最小化它,有很多方法(最简单的方法是梯度下降和牛顿方法)。但是Matlab中的 fminsearch 功能应该可以解决问题。确保测试几个起点,因为您可能会发现几个局部最小值。