MaxStepSize, MaxSteps, похоже, не влияют на NDSolve в MATHEMATICA - PullRequest
1 голос
/ 22 сентября 2011

Я новичок в 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.5042645375 at t = 2.366570254802048 в направлении независимой переменной x намного превышает предписанный допуск на ошибку. Шаг сетки с 19 точками может быть слишком большим для достижения желаемой точности или точности. Возможно, сформировалась особенность, или вы можете указать меньший интервал сетки, используя параметры метода MaxStepSize или MinPoints. >>

Ответы [ 2 ]

2 голосов
/ 07 сентября 2012

Если вы столкнулись с проблемой «нет больше доступной памяти», решение зависит от причины нехватки памяти. Например, однажды мне пришлось запустить симуляцию, которая потребовала от меня вычислить трехмерное магнитное поле на большом объеме, как вы можете себе представить, не только у меня ушло много времени на его вычисление, но и на его вычисление было бы неосуществимо каждый раз мне приходилось запускать симуляцию частиц, пересекающих его. Чтобы избежать проблем с памятью и сделать программу более вычислительной, я решил записать данные магнитного поля в текстовый файл. Простой CSV-стиль файла с вектором поля B для каждой точки пространства в сетке сделал свое дело ...

Итак, мой совет: если вам не хватает памяти, потому что вы обрабатываете огромные объемы данных, вы должны передать их в файл, а затем прочитать файл на следующем шаге программы ... Я надеюсь, эта техника помогает;)

1 голос
/ 23 сентября 2011

Попробуйте уменьшить размер 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 говорит, что это жесткая система.

...