2014-03-25 56 views
2

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

首先,你为什么不直接复制问题中的代码?其次,你能告诉你如何调用函数'sir(t,x);'? – tashuhka

+0

问题中的代码: –

+0

函数dx = sir(t,x) dx = [0; 0; 0]; beta = .003; delta = 1; (1)= -beta * x(1)* x(2); (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); (t,x); plot(t,x); %legend('S','I','R'); –

回答

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

注意,步骤1 限定sir功能和步骤2 使用它。这需要在两个单独的步骤中发生,以防止sir自行调用(或者更确切地说,在您的情况下,调用函数ode45,它再次调用sir)。这被称为递归,而不是你应该在这里做什么。

相关问题