2013-02-19 8 views
5

Matlabのイベント関数として無名関数を使用することは可能ですか?私は何をしたい、基本的MatlabのODEを解決する際に、イベント関数として無名関数を使用することは可能ですか?

opt = odeset('Events', @(t,y) (deal(y(end)-t^2,1,0))); 
[T,Y] = ode45(@odefun,[tstart tend],y0,opt); 

あるしかし、これは対処するための出力数が正確に一致する必要があることを訴えてエラーを返します。匿名関数が複数の引数を返すようにする別の方法はありますか?

答えて

0

また、これはゲームに非常に遅れて追加されていますが、これは私を挫折させます。

function [ dealfunchandle ] = dealwithit(arrayfunc) 
% Takes as input an event function of (t,z) that returns a 3 array (in same order as event syntax). 

    function [a, b, c] = dealfunc(t,z) 
     output = arrayfunc(t,z); 
     a = output(:,1); 
     b = output(:,2); 
     c = output(:,3); 
    end 

dealfunchandle = @dealfunc; 
end 

この関数は、一度書かなければなりません(異なるイベント関数をたくさん使用する必要がある場合に便利です)。これを使用して、次のようにコード内に匿名のイベント関数を生成できます。

arrayfunc = @(t,y) [y(1), 0, 1]; 
events = dealwithit(arrayfunc); 

opts = odeset('Events', events); 

そして、通常通りode45。

1

いいえ、できません。 Matlabの匿名関数は1つの値しか返しません。

代わりに、あなたはdeal周りの薄いラッパーを定義し、ハンドルとしてあなたのラッパーを渡すことができます。

function [a b c] = wrapper(t,y) 
    [a b c] = deal('some stop condition', 1, 0); 
end 

opt = odeset('Events', @wrapper); 

[T, Y] = ode45(@odefun, [tstart tend], y0, opt); 
+1

要点は、ラッパー機能を避けたいということです。 dealを使用すると、実際には3つの値を返す無名関数を得ることができます(dealは引数を返すだけなので)。しかし、ODEソルバはさまざまな戻り値を期待しているようですが、取引は正確に一致しなければなりません。 –

+0

あなたはまったく正しいです。私が変更を受けたとき、これをもう一度見てみましょう。私は、 'ode45'がさまざまな引数をイベントハンドラに渡すという事実に関連している可能性があります。 –

+0

私は、関数が 'odeevents'の単一の出力と' odezero'の出力の三つ組で評価されているからです。ただし、無名関数の出力引数の数は1 *または* 3ですが、両方を扱うことはできません。 – embert

2

私は同じ質問への答えを探して、このポストに気づきました。これは、一部の人々にとって、その質問はまだ有効であるかもしれないことを意味します。最終的に私は自分で解決策を見つけたので、少し古くなった答えを出したいと思います。

実際、可能ですが簡単ではありません。これを試してください:

evnt_fun = @(t、f)subsref({'いくつかの停止条件'、1,0}、構造体 '型'、 '{}'、 'subs'、{{':'} }));

コードの下位互換性を完全に確認することができません。ただし、R2011以降のMATLABバージョンで動作します。

関連する問題