Wolfram mathematica 如何强制微分方程的变量为实数。由警告引发的问题是:“如果;NDSolve::evfrf:“;

Wolfram mathematica 如何强制微分方程的变量为实数。由警告引发的问题是:“如果;NDSolve::evfrf:“;,wolfram-mathematica,Wolfram Mathematica,当我用以下代码数值求解ode时,会提示名为“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" :> Prin

当我用以下代码数值求解ode时,会提示名为“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. >>  

谢谢:)

我不认为这个问题的答案在这些点上是一个真正的复数。 以下内容没有给出错误

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}]

问题在于试图在
y'[t]
中找到零,以及隐含根查找过程中的限制。我尝试增加
工作精度
最大步数
,但没有消除错误

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]
除非您真的关心第八位或其后的小数位,否则我建议您不要担心这个错误


那些比我更擅长数值分析的人可能不同意,但我从事的领域通常对超过百分比变化第一位小数点后(水平的第三位小数点后)的任何数据的准确性没有任何信心。

我不认为这是一个在这些点上答案真的是一个复杂数字的问题。 以下内容没有给出错误

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}]

问题在于试图在
y'[t]
中找到零,以及隐含根查找过程中的限制。我尝试增加
工作精度
最大步数
,但没有消除错误

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]
除非您真的关心第八位或其后的小数位,否则我建议您不要担心这个错误


那些比我更擅长数值分析的人可能不同意,但我所从事的领域通常对超过百分比变化第一位小数点后(水平的第三位小数点后)的任何数据的准确性没有任何信心。

使用EventLocator是否重要?是否有可能解出y'然后在其上应用FindRoot?比如:

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

sol = First@NDSolve[{y''[t] + .1 y'[t] + Sin[y[t]] == 0, y'[0] == 1, y[0] == 0}, 
     {y[t], y'[t]}, {t, 0, 20}, Sequence@ndsolveOptions];

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

FindRoot[der, {t, 1.6}]

      {t -> 1.614}

使用EventLocator是否重要?是否有可能解出y'然后在其上应用FindRoot?比如:

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

sol = First@NDSolve[{y''[t] + .1 y'[t] + Sin[y[t]] == 0, y'[0] == 1, y[0] == 0}, 
     {y[t], y'[t]}, {t, 0, 20}, Sequence@ndsolveOptions];

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

FindRoot[der, {t, 1.6}]

      {t -> 1.614}

错误消息似乎仅由
“EventCondition”->y'[t]>=0
部分引起。我不知道问题出在哪里,但考虑到您希望将事件(y[t]==0)限制为上升(y'[t]>0)的通道,您可以将该部分替换为
“Direction”->1
,其作用相同


或者,您可以使用
off[NDSolve::evfrf]
简单地关闭消息,因为它似乎不会对最终结果产生影响。
“Direction”->1
方法生成的事件与生成消息的原始事件相同。

错误消息似乎仅由
“EventCondition”->y'[t]>=0
部分引起。我不知道问题出在哪里,但考虑到您希望将事件(y[t]==0)限制为上升(y'[t]>0)的通道,您可以将该部分替换为
“Direction”->1
,其作用相同

或者,您可以使用
off[NDSolve::evfrf]
简单地关闭消息,因为它似乎不会对最终结果产生影响。
“Direction”->1
方法生成的事件与生成消息的原始事件相同