答用户10441454
这段代码中,sol的第三个参数是历史时间范围,第二个参数是初值。在这里,[2 2]表示有两个初值,即S和I的初值。如果将其改为[2 2 2],则表示有三个初值,即S、I和R的初值。因此,如果想要成功运行,需要将sol的第二个参数和第三个参数的长度保持一致,即改为[2 2 0]或[2 2 2]。以下是修改后的代码:
clear;clc
%初始参数设置
N = 1;%人口总数
I = 0.01;%感染者
S = N-I;%易感者
R=0;%恢复者
a=0.3;%感染率
c=0.1;%恢复率
d=0.08;%无知投资者免疫率
e=0.1;%移出率
f=0.5;%由感染者再度进入易感状态的概率
g=0.3;%免疫丧失率
b=0.1;%常数输入
m=0.2;%调控
n=0.2;%调控
h=0.08;%无知投资者免疫率
ddex1dez = @(t,y,Z) [b-(a*Z(1,1)*Z(2,1))/(1+m*Z(1,1)+n*Z(2,1))-(e+h)*y(1)+f*y(2)+g*y(3);
(a*Z(1,1)*Z(2,1))/(1+m*Z(1,1)+n*Z(2,1))-c*y(2)-f*y(2);
c*y(2)+h*y(1)-(e+g)*y(3)];
sol = dde23(ddex1dez,[0.1, 0.3],[2,2,2],[0, 50]);%dde23(@....,tau,history,tspan);
%[0.1, 0.3]是时滞,[2 2]是初值,[0, 50]是时间范围
figure;
% plot(sol.x,sol.y)
hold on
plot(sol.x,sol.y(1,:) )
plot(sol.x,sol.y(2,:),'-.' )
plot(sol.x,sol.y(3,:) )
hold off
title('时滞微分方程组');
xlabel('time t');
ylabel('solution y');
legend('S','I','R');
以下是运行结果:
图片