2

複数の入力を使用して MATLAB でダフィング オシレーターを評価しようとしていますが、奇妙なエラーが発生します。

コードは次のとおりです。

% 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

ダフィング関数を呼び出すファイル:

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

実行すると、次のエラーが表示されます。

引数の使用エラー (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は、2 変数のみの関数を入力として受け取ります。より多くの入力を渡したい場合は、次のような小さな無名関数を作成する必要があります。

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 に答える
1

の構文ode45は次のとおりです。

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

4 番目の引数 はoptions、 で作成されたオプション構造体ですodeset。追加の入力は5 番目以降である必要があり、関数を変更する必要があります。正式な方法は、関数ハンドルまたはグローバル変数を使用することですが、ここでは への引数を使用してそれを行う方法を示しますode45

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

次に、odearguments.m ( )duffingの呼び出し規則と互換性があるように、仮引数を使用して変更する必要があります。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次に、2 番目のアプローチと同じ方法で呼び出しますが、 myDuffing(この方法についてはDavid のソリューションを参照してください) を使用します。

于 2014-11-07T05:56:19.103 に答える