2

我正在尝试在具有多个输入的 MATLAB 中评估一个 duffing 振荡器,但我遇到了一个奇怪的错误,我希望有人能够帮助我。

这是代码:

% file duffing.m

function dy=duffing(t,y,a,b,d,g,w) 
    dy=[y(2); -a*y(1)^3-b*y(1)-d*y(2)+g*cos(w*t)];
end

以及调用 duffing 函数的文件:

t=0:0.01:100;

%duffing oscillator 

y0=[2,0];
a=1;
b=-1;
d=0.2;
w=1;
g=0.1;

% duffing oscillator
[t,y]=ode45('duffing',t,y0,a,b,d,g,w); 

当我运行它时,我收到以下错误:

使用 odearguments 时出错(第 92 行) DUFFING 返回长度为 1 的向量,但初始条件向量的长度为 2。DUFFING 返回的向量和初始条件向量必须具有相同数量的元素。

但是当我将函数 duffing 定义为

function dy=duffing(t,y) 

    a=1;
    b=-1;
    d=0.2;
    w=1;
    dy=[y(2); -a*y(1)^3-b*y(1)-d*y(2)+g*cos(w*t)];

end

并传入

[t y]=ode45('duffing',t,y0);

y0上面相同,它运行良好,我可以绘制它。

我究竟做错了什么?

4

2 回答 2

1

的语法ode45是:

function varargout = ode45(ode,tspan,y0,options,varargin)

第四个参数 ,options是一个用 . 创建的 options 结构体odeset。额外的输入需要是第五个及以后的,功能​​需要修改。官方的方法是使用函数句柄或全局变量,但这里是如何使用ode45.

options = odeset('RelTol',1e-4);
[t,y]=ode45('duffing',t,y0,options,a,b,d,g,w);

然后你必须duffing使用一个虚拟参数进行修改,以与 odearguments.m ( ) 的调用约定兼容f(t,y,'',p1,p2...)

function dy=duffing(t,y,~,a,b,d,g,w) 
    dy=[y(2); -a*y(1)^3-b*y(1)-d*y(2)+g*cos(w*t)];
end

官方的函数句柄解决方案如下所示:

myDuffing = @(t,y) duffing(t,y,a,b,d,g,w);

然后ode45以与第二种方法相同的方式调用,但使用myDuffing(请参阅此方法的 David 的解决方案)。

于 2014-11-07T05:56:19.103 回答
1

ode45仅将两个变量的函数作为输入。如果你想传递更多的输入,你必须创建一个小的匿名函数,像这样:

a=1;
b=-1;
d=0.2;
w=1;
g=0.1;

% duffing oscillator
[t,y]=ode45(@(t,y) duffing(t,y,a,b,d,g,w),t,y0); 
于 2014-11-07T05:49:32.357 回答