Wolfram mathematica 如何强制微分方程的变量为实数。由警告引发的问题是:“如果;NDSolve::evfrf:“;
当我用以下代码数值求解ode时,会提示名为“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
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
方法生成的事件与生成消息的原始事件相同