Matlab 使用ode45和deval时出错

Matlab 使用ode45和deval时出错,matlab,ode,Matlab,Ode,我正在尝试积分一组常微分方程,并计算解及其在给定点的一阶导数。Matlab提供“ode45”来解方程,“deval”来计算解及其一阶导数,但是,我不能在我的例子中使用它们 Matlab给出了以下示例: sol=ode45(@vdp1[020],[20]) x=linspace(0,20100) y=德瓦尔(太阳,x,1) 图(x,y) 我猜“vdp1”是由Matlab定义的,这个例子运行得很好。但是,当我尝试使用以下代码时: clear all; % Parameters alpha=10;

我正在尝试积分一组常微分方程,并计算解及其在给定点的一阶导数。Matlab提供“ode45”来解方程,“deval”来计算解及其一阶导数,但是,我不能在我的例子中使用它们

Matlab给出了以下示例:

sol=ode45(@vdp1[020],[20])

x=linspace(0,20100)

y=德瓦尔(太阳,x,1)

图(x,y)

我猜“vdp1”是由Matlab定义的,这个例子运行得很好。但是,当我尝试使用以下代码时:

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);
sol=ode45('vdp1',[020],[20])

x=linspace(0,20100)

y=德瓦尔(太阳,x,1)

图(x,y); 它声称错误:

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

所以我想我必须在“ode45”中使用“@vdp1”而不是“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行)

输入参数不足

参数错误(第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”计算带有客户定义导数的解及其一阶导数吗?

我认为您没有正确使用函数句柄。我建议您将
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
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);
然后按如下方式求解
ode

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
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);

您必须使用函数句柄(
@
)使用
ode
解算器,您不能使用单引号语法。如果错误消息显示输入参数不足,那是因为代码中有错误。您需要向我们显示
der
函数的代码,并告诉我们如何定义
参数。@am304谢谢您的评论,我刚刚更新了post和代码。