MATLAB ode45功能'输入错误太多'

时间:2016-07-19 01:10:55

标签: matlab syntax equations ode45

我的功能是:

function [tout, yout] = Lorenz (rho, x0)
%define constants
sigma = 10;
beta = 8/3;

%initial conditions
y0 = [x0; 1; 0];

f = @(t, y) [sigma*(y(2)-y(1)); (y(1)*(rho-y(3)))-y(2); (y(1)*y(2)) - (beta*y(3))];

[tout, yout] = ode45(f, [0 100], y0, 'RelTol', 1e-6, 'AbsTol', 1e-8);
end

当我在命令窗口中使用

运行该功能时
Lorenz(14,0)

我回来了

Error using Lorenz>@(t,y)[sigma*(y(2)-y(1));(y(1)*(rho-y(3)))-y(2);(y(1)*y(2))-(beta*y(3))]
Too many input arguments.

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

虽然MathWorks的语法不是正式documented,但ODE套件确实接受语法:

[t,y] = ode45(odefun,tspan,y0,options,extra1,extra2,...);

其中options应该是由odeset创建的struct(不与其他函数的名称 - 值系统一致),extra1,extra2,...是任意数量的额外内容,求解常量参数传递给odefun。我认为,在匿名函数拥有自己的工作空间以允许创建时function parametrization之前,它是一个延续。

因此,由于您传递的选项不属于structode45会将语法设为

[t,y] = ode45(odefun,tspan,y0,extra1,extra2,extra3,extra4);

并通过feval拨打电话odefun(t,y,extra1,extra2,extra3,extra4)。使用odeset进行小的重写可以很好地完成这项工作:

options      = odeset('RelTol', 1e-6, 'AbsTol', 1e-8);
[tout, yout] = ode45(f, [0 100], y0, options);