2011-09-17 14 views
1

次のコードで数値的に解決すると、 "evfrf"という警告が表示されます。微分方程式の変数を実数にする方法。警告から生じる質問: "NDSolve :: evfrf:"

私は実数

NDSolve[{y''[t] + .1 y'[t] + Sin[y[t]] == 0, y'[0] == 1, 
y[0] == 0}, y, {t, 0, 20}, 
Method -> {"EventLocator", "Event" -> y[t], 
"EventCondition" -> y'[t] > 0, 
"EventAction" :> Print[t, ", ", y[t], ", ", y'[t]]}] 

警告メッセージであることを微分方程式の変数を強制する方法を疑問に思って:

NDSolve::evfrf: 
The event function did not evaluate to a real number somewhere 
between t = 1.5798366385128957` and t = 1.6426647495929725`, 
preventing FindRoot from finding the root accurately. >> 

感謝:)

答えて

2

私はこれがあるとは思いません回答の問題は、真にそれらの点で複雑な数字になっています。 次のエラーは発生しません。

sol = NDSolve[{y''[t] + .1 y'[t] + Sin[y[t]] == 0, y'[0] == 1, 
y[0] == 0}, y, {t, 0, 20}] 

Plot[y[t] /. sol, {t, 0, 20}] 

enter image description here

問題は、暗黙のルート発見プロセスでy'[t]と制限にゼロを見つけるための試みです。私はWorkingPrecisionMaxStepsを増やしてみましたが、エラーを取り除いていませんでした。

sol = NDSolve[{y''[t] + .10`64 y'[t] + Sin[y[t]] == 0, y'[0] == 1, 
y[0] == 0}, y, {t, 0, 20}, 
    Method -> {"EventLocator", "Event" -> y[t], 
"EventCondition" -> y'[t] >= 0, 
"EventAction" :> Print[t, ", ", y[t], ", ", y'[t]]}, 
    MaxSteps -> 10^9, MaxStepSize -> 0.0001, WorkingPrecision -> 32] 

小数点以下第8位以降を本当に気にしない限り、私はこのエラーについて心配する必要はありません。

私の数値分析のほうが賢明ではないかもしれませんが、私は通常、パーセンテージの変化の小数点以下1桁目を過ぎたデータの精度については何の信念も持っていません。レベル)。

1

EventLocatorを使用することは重要ですか? y 'を解いてFindRootを適用することは可能ですか?何かのように:

ndsolveOptions = {MaxSteps -> Infinity, Method -> {"StiffnessSwitching", 
    Method ->{"ExplicitRungeKutta", Automatic}}, AccuracyGoal -> 10,PrecisionGoal -> 10}; 

sol = [email protected][{y''[t] + .1 y'[t] + Sin[y[t]] == 0, y'[0] == 1, y[0] == 0}, 
    {y[t], y'[t]}, {t, 0, 20}, [email protected]]; 

der = y'[t] /. sol; 
Plot[der, {t, 1.2, 1.7}] 

FindRoot[der, {t, 1.6}] 

     {t -> 1.614} 

enter image description here

3

エラーメッセージが"EventCondition" -> y'[t] >= 0一部のみに起因すると思われます。問題は何か分かりませんが、イベント(y [t] == 0)を継承(y '[t]> 0)に制限したい場合は、その部分を"Direction" -> 1に置き換えることができます。同じことをする。

また、Off[NDSolve::evfrf]を使用してメッセージをオフにすることもできます。最終結果に違いがないようです。 "Direction" -> 1メソッドは、メッセージを生成した元のイベントと同じイベントを生成します。

関連する問題