【问题标题】:MaxStepSize, MaxSteps seem to have no effect on NDSolve in MATHEMATICAMaxStepSize, MaxSteps 似乎对 MATHEMATICA 中的 NDSolve 没有影响
【发布时间】:2011-09-22 17:57:33
【问题描述】:

我是mathematica的新手,所以请多多包涵!

我正在尝试使用 NDSolve 在 mma 中求解非线性 PDE。由于在模拟时间用完之前就出现了奇点,因此求解过程被缩短了。我意识到拥有这种奇点的刚性系统可以通过减小步长来处理(至少通过蛮力)。

但是“MaxSteps”或“MaxStepSize”似乎对我的代码没有明显的影响。

什么给了?我可能会遗漏任何其他方法吗?

**

代码:

**

Needs["VectorAnalysis`"]
Needs["DifferentialEquations`InterpolatingFunctionAnatomy`"];
Clear[Eq4, EvapThickFilm, h, S, G, E1, K1, D1, VR, M, R]
Eq4[h_, {S_, G_, E1_, K1_, D1_, VR_, M_, R_}] := \!\(
\*SubscriptBox[\(\[PartialD]\), \(t\)]h\) + 
    Div[-h^3 G Grad[h] + 
      h^3 S Grad[Laplacian[h]] + (VR E1^2 h^3)/(D1 (h + K1)^3)
        Grad[h] + M (h/(1 + h))^2 Grad[h]] + E1/(
    h + K1) + (R/6) D[D[(h^2/(1 + h)), x] h^3, x] == 0;
SetCoordinates[Cartesian[x, y, z]];
EvapThickFilm[S_, G_, E1_, K1_, D1_, VR_, M_, R_] := 
  Eq4[h[x, y, t], {S, G, E1, K1, D1, VR, M, R}];
TraditionalForm[EvapThickFilm[S, G, E1, K1, D1, VR, M, R]];



L = 318; TMax = 7.0;
Off[NDSolve::mxsst];
Clear[Kvar];
Kvar[t_] :=  Piecewise[{{0.01, t <= 4}, {0.05, t > 4}}]
(*Ktemp = Array[0.001+0.001#^2&,13]*)
hSol = h /. NDSolve[{
     (*S,G,E,K,D,VR,M*)

     EvapThickFilm[1, 3, 0.1, Kvar[t], 0.01, 0.1, 0, 160],
     h[0, y, t] == h[L, y, t],
     h[x, 0, t] == h[x, L, t],
     (*h[x,y,0] == 1.1+Cos[x] Sin[2y] *)
     h[x, y, 0] == 
      1 + (-0.25 Cos[2 \[Pi] x/L] - 0.25 Sin[2 \[Pi] x/L]) Cos[
         2 \[Pi] y/L]
     },
    h,
    {x, 0, L},
    {y, 0, L},
    {t, 0, TMax}
    ][[1]]

错误信息:

NDSolve::ndsz: 在 t == 2.366570254802048`,步长实际上为零;怀疑是奇点或僵硬系统。 >>

NDSolve::eerr: 警告:571455.5042645375at t = 2.366570254802048 在自变量 x 方向上的缩放局部空间误差估计值远大于规定的误差容限。具有 19 个点的网格间距可能太大而无法达到所需的准确度或精度。可能已形成奇点,或者您可能希望使用 MaxStepSize 或 MinPoints 方法选项指定更小的网格间距。 >>

【问题讨论】:

  • 通常情况下,您发布的代码越短越准确,您得到的答案就越好
  • 感谢您的建设性批评。

标签: wolfram-mathematica differential-equations


【解决方案1】:

如果您遇到“没有更多可用内存”的问题,解决方案取决于导致内存不足的原因。例如,我曾经必须运行一个模拟,需要我计算一个大体积的 3D 磁场,正如您可能想象的那样,不仅我需要很长时间来计算它,而且计算它也是不切实际的每次我必须模拟穿过它的粒子。为了避免内存问题并使程序计算量更轻,我决定将磁场数据写入文本文件。一个简单的 csv 文件样式,其中网格中每个空间点的 B 场向量起到了作用......

所以,我的建议是,如果由于计算大量数据而导致内存不足,则应将其流式传输到文件中,然后在程序的下一步读取文件...我希望这种技术有帮助;)

【讨论】:

  • 另一件似乎有帮助的事情(如果我错了,请纠正我)将mathematica 作为脚本而不是通过前端运行减轻了内存负载。我还认为使用大量网格点进行模拟和绘图对我的情况没有帮助。看来我正在将NDSolve 推到极限。
【解决方案2】:

试着让你的代码中的 TMax 更小,比如 2 或 1。

这将消除错误。我发现如果我使用更小的时间跨度来解决,我可以得到更准确的结果(更高的AccuracyGoal -&gt;),我也可以使用MaxSteps -&gt; Infinity

诀窍是当前 NDSolve 调用的开始时间不必与初始条件时间相同。开始时间可以远离初始条件。

来自帮助

The point Subscript[x, 0] that appears in the initial or boundary conditions 
need not lie in the range Subscript[x, min] to Subscript[x, max] over which 
the solution is sought. 

这样,可以多次调用 NDSolve,每次调用的时间跨度更小,而每次调用时始终使用相同的初始条件。但作为交换,所做的每一步,都可以做得更准确。我发现调用 NDSolve 非常快,而且对性能没有任何影响。

即将 NDSolve 时间规范更改为 {from,to}{0,TMax},其中 fromto 每次都以较小的值前进,因此它们之间的距离仍然很小。 (您需要添加小的逻辑代码来执行此操作),直到您覆盖了您有兴趣解决的整个时间范围。

所以,试着改变你的求解器来解决更小的步骤,我认为你会得到更好的结果。

另外,请尝试在 NDSolver 的选项中使用 Method -&gt; {"StiffnessSwitching"},因为 Mathematica 说它是刚性系统。

【讨论】:

  • 这些是一些非常有用和有趣的想法。我将实施它们并将结果作为评论或跟进发布。感谢您的详细回复!
  • @DNA,以上是我现在进行所有模拟的方式。这个想法再次是用许多较小的函数替换覆盖整个区域的 ONE Interpolating 函数,每个函数都覆盖该区域的较小部分。作为交换,每个较小的插值函数将在其较小的区域内更准确。所以这是一个权衡,但对我来说效果很好。
  • 将模拟时间停止到 2.3 左右会有所帮助,因为到那时系统已经(几乎)完成了它的进化。使用 Method-> "StiffnessSwitching" 将模拟一直延长到 2.37 左右,但这对这个问题并没有太大的改进。谢谢你们的cmets。另外,如果我遇到“没有更多可用内存”的问题,有人会建议什么?
猜你喜欢
  • 2015-10-31
  • 2014-06-21
  • 2019-02-16
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 2019-05-02
相关资源
最近更新 更多