【问题标题】:Not enough input arguments没有足够的输入参数
【发布时间】:2014-03-26 05:32:08
【问题描述】:

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

【问题讨论】:

  • 首先,您为什么不直接复制问题中的代码?其次,能不能说明一下你是怎么调用函数sir(t,x);的?
  • 问题中的代码:
  • 函数 dx = sir(t,x) dx=[0; 0; 0];贝塔 = .003;增量 = 1; dx(1)= -beta x(1)*x(2); dx(2)=betax(1)*x(2)-deltax(2); dx(3)=deltax(2); %options = odeset('RelTol', 1e-4, 'NonNegative', [1 2 3]); [t,x] = ode45('sir', [0 10], [1000 1 0], 选项);情节(t,x); %legend('S', 'I', 'R');
  • 有人告诉我,我必须在函数外部调用才能绘制我的解决方案 - 我该怎么做?谢谢
  • 还要注意 ode45('sir', [0 10], [1000 1 0], options);由于使用的名字是先生,你会无限次回忆你的功能,你需要重命名它。

标签: matlab ode differential-equations


【解决方案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)。这称为递归,不是您应该在这里做的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多