关于#matlab#的问题:画图

请问为什么最后画出来的图是这样的呢,只有一条直线

img


想要下面这样的

img


clc;clear
N = 1;  
i0 = 0.001; 
c = jet(5);  
for i = 1:5
    ALPHA = 0.01*i;
    [t,x]=ode45(@(t,x) usir2(t,x,ALPHA),[1:60],[N-i0 0 i0 0]);  
    x = round(x); 
    figure(2)
    plot(t, x(:,3), '-', 'color', c(i,:),'DisplayName',num2str(ALPHA),'Linewidth',1.5) 
    hold on
end
legend show  
function dx=usir2(t,x,ALPHA)   % 大家可以修改里面的参数,来看结果的变化
    beta = 0.1;  % 传播率
    lambda = 0.5; %接触率
    gamma = 0.5;  % 康复率
    dx = zeros(4,1);  % x(1)表示U  x(2)表示S  x(3)表示I  x(4)表示R
    dx(1) = -lambda*x(1)*x(3)-ALPHA*x(1);
    dx(2) = lambda*x(1)*x(3)-beta*x(2);
    dx(3) = ALPHA*x(1)+beta*x(2)-gamma*x(3);
    dx(4) = lambda*x(3);
end


clc;clear
N = 1;  
i0 = 0.001; 
c = jet(5);  
for i = 1:5
    ALPHA = 0.01*i;
    [t,x]=ode45(@(t,x) usir2(t,x,ALPHA),[1:60],[N-i0 0 i0 0]);  
   % x = round(x); 
    figure(2)
    plot(t, x(:,3), '-', 'color', c(i,:),'DisplayName',num2str(ALPHA),'Linewidth',1.5) 
    hold on
end
legend show  

img

根据提供的代码和问题描述,可以看出问题在于每次循环时,只画了每个模型在感染人数(x(:,3))随时间变化的一条曲线,而没有将所有模型的曲线画在同一张图上。因此需要改进代码,将所有模型的曲线画在同一张图上。具体实现方法如下:

clc;clear
N = 1;  
i0 = 0.001; 
c = jet(5);  
figure(2) % 在循环外先创建画布,保证所有的曲线都画在同一张图上
hold on
for i = 1:5
    ALPHA = 0.01*i;
    [t,x]=ode45(@(t,x) usir2(t,x,ALPHA),[1:60],[N-i0 0 i0 0]);  
    x = round(x); 
    plot(t, x(:,3), '-', 'color', c(i,:),'DisplayName',num2str(ALPHA),'Linewidth',1.5) % 将所有曲线画在同一张图上
end
legend show

改进后的代码中,需要在循环外先创建画布,并在循环内添加所有模型的曲线。同时,由于现在在循环内需要多次画图,因此将hold on放在循环外,保证所有曲线都可以画在同一张图上。

另外,由于题目要求的是画出与参考资料中展示的几种疫情模型的曲线不太一样,因此这里不提供具体的参考资料。不过根据matlab作图基础和常见的疫情模型,可以自行尝试绘制SI,SIR,SEIR等模型随时间变化的曲线。