我试图整合一组常微分方程,并在给定点计算解及其一阶导数。 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"用客户定义的衍生工具计算解决方案及其一阶导数?
答案 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);