4

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 = -1myvarいずれかのイベントでソルバーが停止した後、たとえば、2 つのイベントを区別するためにグローバル変数が適切に設定され、停止した場所からシミュレーションが続行されます。その場合、コードは次のようにmyfuncなります

if (myvar == 1)
    dx(3) = x(1)*x(2);
else
    dx(3) = x(2)^2;
end

どちらの方法でも、単純なケースでは正しい結果が得られます。しかし、私は非常に複雑な問題 (上記以外の追加のイベントと、場合によっては解決できることが証明されている微分方程式の不連続な右側の部分) を解決しようとしています。 2つ目よりも結果。

頌歌が前に解を返さないかtFinal、正しい解を返すと言う人もいるかもしれませんが、右側の部分が不連続であるため、解が存在する間はソルバーが解を返さない可能性があります。

したがって、ある意味では、問題は次のとおりです。最初の方法と 2 番目の方法を使用する場合の実際的理論上の違いは何ですか?

4

1 に答える 1

1

私はこれらの質問にいくらかの努力を費やしてきたので、いくつかのフィードバックを投稿しています。

質問1

1a) はい、これは本当です。参考までに、たとえばode15s.mmatlab ソルバーを参照してください。ただし、ソルバーが計算を続行する前に、より正確な値eventsを得るために関数が数回呼び出される場合があることに注意してください。te

1b) はい、これも真実です。

1c) この場合、ソルバーは終了ieし、ソルバーを停止させたイベントの 2 つ (またはそれ以上) のインデックスを含むベクトルを返します。その場合、teベクトルには等しい要素が含まれます (te(1) == te(2) は常に true を返します)。これは、「二重イベント」(同じステップが成功した後にソルバーを同時に停止させたイベントを意味する) を、ターミナル イベントの後に ode ソルバーが解決を続けるときに記録される「偽の」イベントから区別する唯一の方法です (私が何をしたかをよりよく理解するため)。 mは、MATLAB の ODE ソルバー イベント ロケーション インデックスも読み取ると言っています)。

関数をトレースするodezeroと、1cの答えが非常に明確になります。

質問2

これは難しい答えです。**一般的に* どちらの方法でも正しい結果が返されます。ただし(そして最も当然のことながら)、正確なステップ数で正確な時点で正確な解点を返す必要はありません。

2 つの方法の顕著な違いは、2 番目の方法では、現在アクティブなブランチのみcheck(x)-2を使用して符号変更が発生した場合にのみブランチ変更があることです。たとえば、現在アクティブなブランチが最初のブランチであるとします。その分岐のみを使用して生成された成功したステップの後に、ソルバーが符号の変化に気付くと、2 番目の分岐に変化します。簡単に言えば、成功したステップと失敗したステップの両方が、まったく同じブランチを使用して計算されてから、他のブランチが使用されるようになります。ただし、最初の方法を使用すると、(たとえば) 失敗したステップ中に非アクティブなブランチが使用されていることに気付く場合があります。check(x) - 2

これらを念頭に置いて、評決が下されます。最も一般的で厳密に正しい選択方法は、2 番目の方法 (イベントを使用) です。最初の方法でも正しい結果が返されるはずです。ただし、2 つの方法の違いにより、最初の方法は非常に具体的/極端な問題で失敗する可能性があります。私は、2 番目の方法だけが安全に使用できるという私のケースに関する情報を提供したいと思っていますが、それは本当に長い道のりです。

于 2011-10-19T21:43:01.997 に答える