将参数传递给函数句柄时出错
Error when passing arguments to function handles
假设我们有以下函数:
function f=lorenz(t,x,a,b,c)
% solve differential equation like this
%dx/dt=a*(y-x)
%dy/dt=-x*z+b*x-y
%dz/dt=xy-c*z/3
f=zeros(3,1);% preallocate result
f(1)=a*(x(2)-x(1));
f(2)=-x(1)*x(3)+b*x(1)-x(2);
f(3)=x(1)*x(2)-c*x(3)/3;
end
对于运行这个程序,让我们使用下面的测试文件:
% test program
x0=[-2 -3.5 21];% initial point
a=input(' enter first coefficient : ');
b=input(' enter second coefficient: ');
c=input(' enter third coefficient : ');
[t,x]=ode45(@(x) lorenz(x,a,b,c),[0 10],x0);
plot(t,x(:,1),'r');
title(' solution of x part');
grid on
我试过将参数传递给函数句柄,
test_program
enter first coefficient : 10
enter second coefficient: 28
enter third coefficient : -8
但它给了我以下错误:
Error using @(x)lorenz(x,a,b,c)
Too many input arguments.
Error in odearguments (line 87)
f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0.
Error in ode45 (line 113)
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...
Error in test_program (line 6)
[t,x]=ode45(@(x) lorenz(x,a,b,c),[0 10],x0);
一个解决方案涉及使用全局变量,如下所示:
function f=lorenz(t,x)
% solve differential equation like this
%dx/dt=a*(y-x)
%dy/dt=-x*z+b*x-y
%dz/dt=xy-c*z/3
global a
global b
global c
f=zeros(3,1);% preallocate result
f(1)=a*(x(2)-x(1));
f(2)=-x(1)*x(3)+b*x(1)-x(2);
f(3)=x(1)*x(2)-c*x(3)/3;
end
但是 运行 花费的时间太长了。
我还能如何解决这个问题?我想要的是传递不同的参数,如果我在里面写这样的代码
a=input('enter the coefficient : ')
然后重复几次
不要使用全局变量。
修复非常简单,也添加 t
作为输入:
[t,x] = ode45(@(t,x) lorenz(t,x,a,b,c),[0 10],x0);
假设我们有以下函数:
function f=lorenz(t,x,a,b,c)
% solve differential equation like this
%dx/dt=a*(y-x)
%dy/dt=-x*z+b*x-y
%dz/dt=xy-c*z/3
f=zeros(3,1);% preallocate result
f(1)=a*(x(2)-x(1));
f(2)=-x(1)*x(3)+b*x(1)-x(2);
f(3)=x(1)*x(2)-c*x(3)/3;
end
对于运行这个程序,让我们使用下面的测试文件:
% test program
x0=[-2 -3.5 21];% initial point
a=input(' enter first coefficient : ');
b=input(' enter second coefficient: ');
c=input(' enter third coefficient : ');
[t,x]=ode45(@(x) lorenz(x,a,b,c),[0 10],x0);
plot(t,x(:,1),'r');
title(' solution of x part');
grid on
我试过将参数传递给函数句柄,
test_program
enter first coefficient : 10
enter second coefficient: 28
enter third coefficient : -8
但它给了我以下错误:
Error using @(x)lorenz(x,a,b,c)
Too many input arguments.
Error in odearguments (line 87)
f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0.
Error in ode45 (line 113)
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...
Error in test_program (line 6)
[t,x]=ode45(@(x) lorenz(x,a,b,c),[0 10],x0);
一个解决方案涉及使用全局变量,如下所示:
function f=lorenz(t,x)
% solve differential equation like this
%dx/dt=a*(y-x)
%dy/dt=-x*z+b*x-y
%dz/dt=xy-c*z/3
global a
global b
global c
f=zeros(3,1);% preallocate result
f(1)=a*(x(2)-x(1));
f(2)=-x(1)*x(3)+b*x(1)-x(2);
f(3)=x(1)*x(2)-c*x(3)/3;
end
但是 运行 花费的时间太长了。
我还能如何解决这个问题?我想要的是传递不同的参数,如果我在里面写这样的代码
a=input('enter the coefficient : ')
然后重复几次
不要使用全局变量。
修复非常简单,也添加 t
作为输入:
[t,x] = ode45(@(t,x) lorenz(t,x,a,b,c),[0 10],x0);