matlab で次のように仮定します。
[t, x, te, xe, ie] = ode15s(@myfunc, [tStart tFinal], x0, odeset('Events', @events));
質問1
1a) 関数は、ソルバーのステップが成功した後にのみevents
呼び出されます。これは本当ですか?
1b) ソルバーがステップを成功させた直後に、最後の呼び出しが成功したステップにつながる呼び出しではmyfunc
ない可能性はありますか?
1c)events
関数に複数の終了イベントが含まれていて、ステップが成功したときにそのうちの 2 つ (1 つだけでなく) が発生したことが検出された場合、ソルバーの動作はどうなりますか?
質問2
myfunc
次のコードが含まれているとします
if (check(x) > 2)
dx(3) = x(1)*x(2);
else
dx(3) = x(2)^2;
end
check
の関数はどこにありますかx
。
この問題を解決する1 つの方法は、イベント関数を使用しないことです。私の経験では、オードソルバーはそのような問題を解決できます。
この問題を解決するもう 1 つの方法は、イベント関数を使用してcheck(x) - 2 == 0
、1 つのターミナル イベントdirection = 1
と の別のターミナル イベントを見つけることですdirection = -1
。myvar
いずれかのイベントでソルバーが停止した後、たとえば、2 つのイベントを区別するためにグローバル変数が適切に設定され、停止した場所からシミュレーションが続行されます。その場合、コードは次のようにmyfunc
なります
if (myvar == 1)
dx(3) = x(1)*x(2);
else
dx(3) = x(2)^2;
end
どちらの方法でも、単純なケースでは正しい結果が得られます。しかし、私は非常に複雑な問題 (上記以外の追加のイベントと、場合によっては解決できることが証明されている微分方程式の不連続な右側の部分) を解決しようとしています。 2つ目よりも結果。
頌歌が前に解を返さないかtFinal
、正しい解を返すと言う人もいるかもしれませんが、右側の部分が不連続であるため、解が存在する間はソルバーが解を返さない可能性があります。
したがって、ある意味では、問題は次のとおりです。最初の方法と 2 番目の方法を使用する場合の実際的理論上の違いは何ですか?