MaxStepSize, MaxSteps, кажется, не влияют на NDSolve в MATHEMATICA
Я новичок в Mathematica, поэтому, пожалуйста, потерпите меня!
Я пытаюсь решить нелинейный PDE в MMA с помощью NDSolve. Процесс решения обрывается из-за особенностей, возникающих задолго до истечения времени моделирования. Я понимаю, что с жесткими системами, обладающими такими особенностями, можно бороться (по крайней мере, грубой силой) путем уменьшения размера шага.
Однако "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
в направлении независимой переменной х намного больше, чем предписанная погрешность. Шаг сетки с 19 точками может быть слишком большим для достижения желаемой точности или точности. Возможно, сформировалась особенность, или вы можете указать меньший интервал сетки, используя параметры метода MaxStepSize или MinPoints. >>
2 ответа
Попробуйте сделать TMax в вашем коде меньше, скажем, 2 или 1.
Это удалит ошибку. Я обнаружил, что если я решу, используя меньший промежуток времени, я могу получить еще более точный результат (выше AccuracyGoal ->
) и я тоже могу использовать MaxSteps -> 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}
, где from
а также to
оба продвигаются в меньших значениях каждый раз, так что расстояние между ними остается небольшим. (Для этого нужно добавить небольшой логический код), пока вы не охватите весь временной диапазон, который вы хотели бы решить.
Итак, попробуйте изменить свой решатель для решения небольших задач, и я думаю, вы получите гораздо лучшие результаты.
Кроме того, попробуйте использовать Method -> {"StiffnessSwitching"}
в ваших вариантах для NDSolver, как говорит Mathematica, это жесткая система.
Если вы столкнетесь с проблемой "нет больше доступной памяти", решение зависит от причины нехватки памяти. Например, однажды мне пришлось запустить симуляцию, которая потребовала от меня вычислить трехмерное магнитное поле на большом объеме, как вы можете себе представить, не только у меня ушло много времени на его вычисление, но и на его вычисление было бы неосуществимо каждый раз мне приходилось запускать симуляцию частиц, пересекающих его. Чтобы избежать проблем с памятью и сделать программу более вычислительной, я решил записать данные магнитного поля в текстовый файл. Простой CSV-стиль файла с вектором поля B для каждой точки пространства в сетке сделал свое дело...
Итак, мой совет: если вам не хватает памяти, потому что вы вычисляете огромные объемы данных, вы должны передать их в файл, а затем прочитать файл на следующем шаге программы... Я надеюсь, что этот метод поможет;)