我正在尝试创建一个SIR模型(用两个参数求解3个微分方程)并在MATLAB上为此绘制解决方案并且我不断得到错误'没有足够的输入参数'。我真的不知道自己哪里出错了。这是代码:
function dx = sir(t,x)
dx=[0; 0; 0];
beta = .003;
delta = 1;
dx(1)= -beta *x(1)*x(2);
dx(2)=beta*x(1)*x(2)-delta*x(2);
dx(3)=delta*x(2);
%options = odeset('RelTol', 1e-4, 'NonNegative', [1 2 3]);
[t,x] = ode45('sir', [0 10], [1000 1 0], options);
plot(t,x);
%legend('S', 'I', 'R');
end
答案 0 :(得分:1)
我认为你对函数调用和递归的工作方式存在严重的误解,或者你可能只是不熟悉编程。你需要两件事:
定义一个函数并将其另存为sir.m
。这定义了您的ODE。它应包含:
function dx = sir(t,x)
beta = .003;
delta = 1;
dx(1)= -beta *x(1)*x(2);
dx(2)=beta*x(1)*x(2)-delta*x(2);
dx(3)=delta*x(2);
运行代码以解决您的ODE。只要sir.m
位于您的路径或当前目录中,就可以将其直接粘贴到命令窗口中:
options = odeset('RelTol', 1e-4, 'NonNegative', [1 2 3]);
[t,x] = ode45('sir', [0 10], [1000 1 0], options);
plot(t,x);
legend('S', 'I', 'R');
请注意,第1步定义 sir
函数,第2步使用。这需要在两个单独的步骤中进行,以防止sir
调用自身(或者更确切地说,在您的情况下,调用函数ode45
,再次调用sir
)。这称为递归,而不是你应该在这里做的。