更新:
在Stackexchange翻了半天,发现以前有人发现过这个问题:
http://mathematica.stackexchange.com/q/21262/1871
不完整回答,算是对 @野鹤 答案的补充。可以确定:
1.问题和浮点数无关。
2.问题出在前处理上,但是不确定是前处理出错还是某些情况下前处理产生的数据不适合在后续步骤使用。
证据:
Clear[x, y]
pw[t_] = Rationalize[
Piecewise[{{1.0, 0 <= Mod[t, 5.1129] < 1.085}, {1.5,
1.085 <= Mod[t, 5.1129] < 4.0279}}, 1.0], 0];
{state} = NDSolve`ProcessEquations[{x'[t] == y[t],
y'[t] == pw[t]*x[t] - (-2 + 2 x[t]^4)/x[t]^3, x[0] == 1, y[0] == 0}, {x, y}, {t, 0,
5}(*,Method\[Rule]{"DiscontinuityProcessing"\[Rule]False}*), WorkingPrecision -> 16];
state // InputForm
NDSolve`Iterate[state, 5];
{xsol, ysol} = {x, y} /. NDSolve`ProcessSolutions@state;
Plot[{xsol@t, ysol@t}, {t, 0, 5}]
反复执行直到结果开始出错,然后Ctrl+Shift+D从NDSolve`Iterate这行断开,再执行,会发现解的图形不再变化,也就是说“不同”是在NDSolve`ProcessEquations这步引入的,再对比两种情况下的state的InputForm,确实可以看到某些地方有不同,只可惜NDSolve`StateData的具体结构文档中没讲解,没法进一步分析。
版本8无此问题,因为那时候还不存在"DiscontinuityProcessing"这东西,看样子是这新加的步骤不稳定。