Matlab で匿名関数をイベント関数として使用することは可能ですか? やりたいことは基本的に
opt = odeset('Events', @(t,y) (deal(y(end)-t^2,1,0)));
[T,Y] = ode45(@odefun,[tstart tend],y0,opt);
ただし、これは処理する出力の数が正確に一致する必要があることを訴えるエラーを返します。無名関数が複数の引数を返すようにする他の方法はありますか?
Matlab で匿名関数をイベント関数として使用することは可能ですか? やりたいことは基本的に
opt = odeset('Events', @(t,y) (deal(y(end)-t^2,1,0)));
[T,Y] = ode45(@odefun,[tstart tend],y0,opt);
ただし、これは処理する出力の数が正確に一致する必要があることを訴えるエラーを返します。無名関数が複数の引数を返すようにする他の方法はありますか?
同じ質問に対する答えを探しているこの投稿に気付きました。これは、一部の人にとっては、質問がまだ有効である可能性があることを意味します。やっと自分で解決策を見つけたので、少し「時代遅れ」の答えをしたいと思います。
実際、可能ですが、簡単ではありません。これを試して:
evnt_fun = @(t, f)subsref({'いくつかの停止条件', 1, 0}, struct('type', '{}', 'subs', {{':'}}));
コードの下位互換性を完全に確認することはできません。ただし、R2011 以降の MATLAB バージョンでは機能します。
いいえ、できません。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);
また(これに追加するのはゲームの非常に遅いですが、これは私を苛立たせます)。ネストされた関数を使用したソリューションを次に示します。
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
この関数は 1 回だけ記述する必要があります (多数の異なるイベント関数を使用する必要がある場合に便利です)。これを使用して、次のようにコード内で匿名イベント関数を生成できます。
arrayfunc = @(t,y) [y(1), 0, 1];
events = dealwithit(arrayfunc);
opts = odeset('Events', events);
そして通常どおりode45。