SIR传染病模型的MATLAB优化

SIR传染病模型的MATLAB优化,matlab,curve-fitting,Matlab,Curve Fitting,我正在尝试使用SIR模型来模拟流感疫情: 它基本上要求我同时解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]

我正在尝试使用SIR模型来模拟流感疫情:

它基本上要求我同时解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矩阵提出建议


谢谢

在我看来,解决方法似乎是正确的

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

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