0

我的功能是:

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.

任何帮助将非常感激。

4

1 回答 1

1

尽管 MathWorks 没有正式记录语法,但 ODE 套件确实接受以下语法:

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

whereoptions应该是structodeset(不与其他函数的名称-值系统内联)创建的,并且extra1,extra2,...是要传递给的任意数量的额外求解常量参数odefun。我想这是在匿名函数拥有自己的工作空间以允许创建时函数参数化之前的保留。

因此,由于您传递的选项不是 a 的一部分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);
于 2016-07-19T01:30:34.243 回答