【问题标题】:Bifurcation diagram of discrete SIR model in MATLABMATLAB中离散SIR模型的分岔图
【发布时间】:2021-04-08 22:46:28
【问题描述】:

我的 MATLAB 代码无法显示离散 SIR 模型的分岔图。

我的模型是:

S(n+1) = S(n) - h*(0.01+beta*S(n)*I(n)+d*S(n)-gamma*R(n))

I(n+1) = I(n) + h*beta*S(n)*I(n)-h*(d+r)*I(n)

R(n+1) = R(n) + h*(r*I(n)-gamma*R(n));

我尝试了下面的代码,但它让 MATLAB 忙了将近 30 分钟,并且没有显示任何数字。

MATLAB 代码:

close all;
clear all;
clc;

%Model parameters

beta = 1/300;
gamma = 1/100;
D = 30;                  % Simulate for D days
N_t = floor(D*24/0.1);   % Corresponding no of hours
d = 0.001;
r = 0.07;

%Time parameters

dt = 0.01;
N = 10000;

%Set-up figure and axes

figure;

ax(1) = subplot(2,1,1);
hold on
xlabel ('h');
ylabel ('S');

ax(2) = subplot(2,1,2);
hold on
xlabel ('h');
ylabel ('I');

%Main loop

for h = 2:0.01:3

    S = zeros(N,1);
    I = zeros(N,1);
    R = zeros(N,1);

    S(1) = 8;
    I(1) = 5;
    R(1) = 0;

    for n = 1:N_t
        S(n+1) = S(n) - h*(0.01+beta*S(n)*I(n)+d*S(n)-gamma*R(n)); 
        I(n+1) = I(n) + h*beta*S(n)*I(n)-h*(d+r)*I(n);
        R(n+1) = R(n) + h*(r*I(n)-gamma*R(n));
    end

    plot(ax(1),h,S,'color','blue','marker','.');
    plot(ax(2),h,I,'color','blue','marker','.');

end

有什么建议吗?

【问题讨论】:

    标签: matlab modeling


    【解决方案1】:

    这非常慢,因为您正在绘制单个值 h 与具有 7200 个点的向量 S。我假设您只想绘制Sh 的最后一个值。所以在plot 命令中用S(end) 替换S 会改变一切。你真的不需要使用hold,最好为每个轴调用一次 plot,所以我会这样做:

    beta = 1/300;
    gamma = 1/100;
    D = 30;                 % Simulate for D days
    N_t = floor(D*24/0.1);   % Corresponding no of hours
    d = 0.001;
    r = 0.07;
    
    %%Time parameters
    dt = 0.01;
    N = 10000;
    
    %%Main loop
    h = 2:0.01:3;
    S_end = zeros(size(h));
    I_end = zeros(size(h));
    for idx = 1:length(h)
        S = zeros(N_t,1);
        I = zeros(N_t,1);
        R = zeros(N_t,1);
        S(1) = 8;
        I(1) = 5;
        R(1) = 0;
    
        for n=1:(N_t - 1)
            S(n+1) = S(n) - h(idx)*(0.01+beta*S(n)*I(n)+d*S(n)-gamma*R(n)); 
            I(n+1) = I(n) + h(idx)*beta*S(n)*I(n) - h(idx)*(d+r)*I(n);
            R(n+1) = R(n) + h(idx)*(r*I(n)-gamma*R(n));
        end
        S_end(idx) = S(end);
        I_end(idx) = I(end);
    end
    
    figure(1)
    subplot(2,1,1);
    plot(h,S_end,'color','blue','marker','.');
    xlabel ('h');
    ylabel ('S');
    
    subplot(2,1,2);
    plot(h,I_end,'color','blue','marker','.');xlabel ('h');
    xlabel ('h');
    ylabel ('I');
    

    现在在我的电脑上运行只需 0.2 秒。

    【讨论】:

    • 感谢您的解决方案。现在工作得非常快。但仍然会导致其他问题。 S I 和 R 中包含的值在每次迭代后返回 0。
    • 如果您在计算 S_end 并绘制 S 的行之前放置一个断点,您会看到它下降到大约 -10,然后跳到零并停留在那里。那是因为您将 S 初始化为 N (10,000) 的长度,但仅在 for 循环中将值分配到 N_t + 1 (7201),因此 S 的最终值将始终为零。我将编辑我的解决方案以进行更新。我不知道结果应该是什么样子,也不知道它在建模什么,所以我无法判断它是对还是错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多