我的功能是:
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.
非常感谢任何帮助。
答案 0 :(得分:1)
虽然MathWorks的语法不是正式documented,但ODE套件确实接受语法:
[t,y] = ode45(odefun,tspan,y0,options,extra1,extra2,...);
其中options
应该是由odeset
创建的struct
(不与其他函数的名称 - 值系统一致),extra1,extra2,...
是任意数量的额外内容,求解常量参数传递给odefun
。我认为,在匿名函数拥有自己的工作空间以允许创建时function parametrization之前,它是一个延续。
因此,由于您传递的选项不属于struct
,ode45
会将语法设为
[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);