对旧的 MATLAB 脚本进行故障排除:"Not enough input arguments"
Troubleshooting an old MATLAB script: "Not enough input arguments"
我目前正在回顾以前的 MATLAB 大学作业。自从我使用 MATLAB 以来已经有一段时间了,我无法找出这个脚本的错误,大概 运行 当我写它并提交它时 ~4 年前 - 我提交的正确图如下输出中的代码。也许 MATLAB 语法略有变化?
作业是 运行 使用 ODE 求解器的 SIR(传染病)模拟。下面是代码:
%%FUNCTION:
function rhs = SIR_rhs_seasonal(t,u,p,D,G)
%Right-hand side of SIR model
%Assumes 52 weeks in a year
B=((15*(1/7))/3000000)*(1+p*cos(2*pi*t/365));
S = u(1);
E = u(2);
I = u(3);
R = u(4);
rhs = [ -B*S*I; (B*S*I)-(D*E); (D*E)-(G*I); G*I ];
%%ODE SOLVER:
%% parameters
tend = 700;
D=1/7;
G=1/7;
p=.1;
N=3000000
%% initial condition
u = [ N*.99; N*0; N*.01; N*0 ];
%% solve ODE
[T,U] = ode45(@(t,u) SIR_rhs_seasonal(t,u,p,D,G),[0:0.1:tend],u);
%% plot results
figure(1);
plot(T,U(:,1),'b',T,U(:,2),'r',T,U(:,3),'k',T,U(:,4),'g');
axis([0 10 0 3000000]);
xlabel('time = weeks');
ylabel('population');
title('susceptibles (blue), latent (red), infectious (black), recovered/removed (green)');
figure(2);
plot(T,U(:,2)./(U(:,2)+U(:,3)),'b')
axis([0 tend -.25 1]);
xlabel('time = days');
ylabel('E(t)/(E(t)+I(t))');
title('Latent proportion of infectives');
目前得到的错误是:
SIRmodel2 Not enough input arguments.
Error in SIRmodel2 (line 6)
B=((15*(1/7))/3000000)*(1+p*cos(2*pi*t/365));
如有任何见解,我们将不胜感激!
首先要验证的一件事:
- 错误消息表明您使用了一个函数
SIRmodel2
,但是在您的 post 中打印的函数称为 SIR_rhs_seasonal
。文件名为 SIRmodel2.m
,即这真的是正在执行的函数吗?
如果这是正在执行的函数,那么错误将在第 6 行抛出,因为它是函数的一些输入参数的第一行,即 p
和 t
被使用。很可能您在调用该函数时未指定这些输入。
如何调用函数?
您还可以通过在第 6 行放置一个断点(将光标移动到第 6 行并按 F12)和 运行 代码来验证情况。它会在执行该行之前停止。现在将鼠标悬停在变量 p
和 t
上。至少其中一项不会被定义。
我目前正在回顾以前的 MATLAB 大学作业。自从我使用 MATLAB 以来已经有一段时间了,我无法找出这个脚本的错误,大概 运行 当我写它并提交它时 ~4 年前 - 我提交的正确图如下输出中的代码。也许 MATLAB 语法略有变化?
作业是 运行 使用 ODE 求解器的 SIR(传染病)模拟。下面是代码:
%%FUNCTION:
function rhs = SIR_rhs_seasonal(t,u,p,D,G)
%Right-hand side of SIR model
%Assumes 52 weeks in a year
B=((15*(1/7))/3000000)*(1+p*cos(2*pi*t/365));
S = u(1);
E = u(2);
I = u(3);
R = u(4);
rhs = [ -B*S*I; (B*S*I)-(D*E); (D*E)-(G*I); G*I ];
%%ODE SOLVER:
%% parameters
tend = 700;
D=1/7;
G=1/7;
p=.1;
N=3000000
%% initial condition
u = [ N*.99; N*0; N*.01; N*0 ];
%% solve ODE
[T,U] = ode45(@(t,u) SIR_rhs_seasonal(t,u,p,D,G),[0:0.1:tend],u);
%% plot results
figure(1);
plot(T,U(:,1),'b',T,U(:,2),'r',T,U(:,3),'k',T,U(:,4),'g');
axis([0 10 0 3000000]);
xlabel('time = weeks');
ylabel('population');
title('susceptibles (blue), latent (red), infectious (black), recovered/removed (green)');
figure(2);
plot(T,U(:,2)./(U(:,2)+U(:,3)),'b')
axis([0 tend -.25 1]);
xlabel('time = days');
ylabel('E(t)/(E(t)+I(t))');
title('Latent proportion of infectives');
目前得到的错误是:
SIRmodel2 Not enough input arguments.
Error in SIRmodel2 (line 6) B=((15*(1/7))/3000000)*(1+p*cos(2*pi*t/365));
如有任何见解,我们将不胜感激!
首先要验证的一件事:
- 错误消息表明您使用了一个函数
SIRmodel2
,但是在您的 post 中打印的函数称为SIR_rhs_seasonal
。文件名为SIRmodel2.m
,即这真的是正在执行的函数吗?
如果这是正在执行的函数,那么错误将在第 6 行抛出,因为它是函数的一些输入参数的第一行,即 p
和 t
被使用。很可能您在调用该函数时未指定这些输入。
如何调用函数?
您还可以通过在第 6 行放置一个断点(将光标移动到第 6 行并按 F12)和 运行 代码来验证情况。它会在执行该行之前停止。现在将鼠标悬停在变量 p
和 t
上。至少其中一项不会被定义。