没有足够的输入参数

时间:2014-03-25 14:40:27

标签: matlab ode differential-equations

我正在尝试创建一个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

1 个答案:

答案 0 :(得分:1)

我认为你对函数调用和递归的工作方式存在严重的误解,或者你可能只是不熟悉编程。你需要两件事:

  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);

  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');

  3. 请注意,第1步定义 sir函数,第2步使用。这需要在两个单独的步骤中进行,以防止sir调用自身(或者更确切地说,在您的情况下,调用函数ode45,再次调用sir)。这称为递归,而不是你应该在这里做的。