マスクマスクODEイベント関数(イベント関数)


マスクマスクODEで使用されるオプションとイベントについて説明します.
イベント関数は、特定の条件でODE計算を停止したい場合に使用する機能です.
マスクの例で使用される「ボール」(ballode)を考慮すると、イベント関数がいつ使用されるかをより簡単に理解できます.
ボールを空に投げると重力で落ち、いつか地面に落ちる.
h= h0+v0t−12gt2h=\h_0+v_0t-\frac{1}{2}gt^2h= h0​+v0​t−21​gt2
このような単純な多項式はODEの使用を避けることができますが、ODE形式に変更すると理解を助けることができます.
function dydt = f(t,y)
dydt = [y(2); -9.8];
上のコードはボールの位置と速度を
[t,y] = ode45(@f,[시작시간 종료시간], 초기값)
これで手に入る
はい、今ここで問題が発生しました.上のコードによると、ボールの位置と速度はボールの時間とともに変化するだけで、入力の終了時間とともにボールは無限に落ちることがわかります.

では、コードはどのようにして下部を識別しますか?
この場合、イベント関数が使用されます.ボールの着地とは、ボールの垂直位置が0であり、y=0でodeを終了すればよい.
function [value,isterminal,direction] = events(t,y)

value = y(1);     % detect height = 0
isterminal = 1;   % stop the integration
direction = -1;   % negative direction
value値には、0でなければならない値が含まれます.ここで、ボールの位置が0の場合、イベント関数はアクティブでなければならないため、y(1)値が加算されます.地面5メートルに止めたいなら、y(1)-5を入れてもいいです.
isterminal値はodeが停止するかどうかを決定する値であり、1が入ると停止し、0の場合odeは継続する.これらの部分を混同する可能性がありますたとえば、isterminal値が0の場合、値は0であり、ODEは停止しません.つまり、これは条件を設定する部分です.今の例は弾球なので、この部分は重要ではありませんが、後で複雑な条件を設定した場合は、触れなければなりません.
Directionは、0に収束する方法を決定する値です.例えば、−1は正方向0で停止し、+1は負方向0で停止し、0は全方向0で停止する.
コードを次のように書くと
tstart = 0;
tfinal = 30;
y0 = [0; 20];
options = odeset('Events',@events);
[t,y] = ode45(@f,tstart:0.1:tfinal,y0,options);
plot(t,y)
function dydt = f(t,y)
dydt = [y(2); -9.8];
end
% --------------------------------------------------------------------------

function [value,isterminal,direction] = events(t,y)
value = y(1);     % detect height = 0
isterminal = 1;   % stop the integration
direction = -1;   % negative direction
end

図に示すように、ボールが着地したときにodeが停止するのが見えます.
詳細コードについては、「マスク」コマンドウィンドウにopen ballodeと入力して表示し、ballodeを実行すると下図が表示されます.