使用ode45和deval时出错

时间:2014-10-12 16:08:13

标签: matlab ode

我试图整合一组常微分方程,并在给定点计算解及其一阶导数。 Matlab提供" ode45"解决方程和" deval"然而,计算解决方案及其一阶导数,我无法在我的情况下使用它们。

Matlab给出了以下示例:

  

sol = ode45(@ vdp1,[0 20],[2 0]);

     

x = linspace(0,20,100);

     

y = deval(sol,x,1);

     

积(X,Y);

我想在哪里" vdp1"已由Matlab定义,此示例运行良好。但是,当我尝试使用以下代码时:

  

sol = ode45(' vdp1',[0 20],[2 0]);

     

x = linspace(0,20,100);

     

y = deval(sol,x,1);

     

积(X,Y);   它声称错误:

"使用deval时出错(第46行) sol必须是由微分方程求解器返回的结构。"

所以我想我必须使用" @ vdp1" in" ode45"而不是"' vdp1'",否则" deval"不行。

但在我的情况下,我在文件中定义了我的派生词如下:

function dv = der( ~,vec,~,alpha, eta, m )
%UNTITLED4 Summary of this function goes here
%   Detailed explanation goes here

vx=vec(1);
vy=vec(2);
vz=vec(3);

dv(1,1)=(alpha-eta*vx)/m;
dv(2,1)=(alpha-eta*vy)/m;
dv(3,1)=(alpha-eta*vz)/m;

end

我可以使用" ode45"用以下代码求解方程式:

clear all;

% Parameters 
alpha=10;
eta=0.5;
m=1;

% Inititial conditions
vec_ini=[0,0,0]';

% Integration time
Tf=10;

OPTIONS=odeset('abstol',1e-6,'reltol',1e-6);

sol=ode45('der',[0,Tf],vec_ini,OPTIONS,alpha,eta,m);

代码有效。但是当我添加两行时,使用" deval"如下

tvec=linspace(0,Tf,10);

[sxint,spxint]=deval(sol,tvec);

它说:

  

使用deval时出错(第46行)

     

sol必须是微分方程求解器返回的结构。

如果我将ode45部分更改为

sol=ode45(@der,[0,Tf],vec_ini,OPTIONS,alpha,eta,m);

它说

  

使用der(第9行)时出错

     

没有足够的输入参数。

     

odearguments中的错误(第88行)

     

f0 = feval(ode,t0,y0,args {:}); %ODE15I将args {1}设置为yp0。

     

ode45错误(第114行)

     

[neq,tspan,ntspan,next,t0,tfinal,tdir,y0,f0,odeArgs,odeFcn,...

所以任何人都可以告诉我如何使用" ode45"和" deval"用客户定义的衍生工具计算解决方案及其一阶导数?

1 个答案:

答案 0 :(得分:1)

我认为你没有正确使用函数句柄。我建议您重写der函数,如下所示:

function dv = der( t,y,params )

vx=y(1);
vy=y(2);
vz=y(3);

dv(1,1)=(params(1)-params(2)*vx)/params(3);
dv(2,1)=(params(1)-params(2)*vy)/params(3);
dv(3,1)=(params(1)-params(2)*vz)/params(3);

end

然后按以下方式查看ode

params = [alpha eta m];
sol=ode45(@(t,y) der(t,y,params),[0,Tf],vec_ini,OPTIONS);
tvec=linspace(0,Tf,10);
[sxint,spxint]=deval(sol,tvec);