Mathematica: Решение УЧП, которое содержит Conjugate функции или Abs функции

Я пытаюсь численно решить PDE, используя NDSolve. Я продолжаю получать следующую ошибку:

"NDSolve::ndnum: "Encountered non-numerical value for a derivative at t == 0.."

Кажется, я получаю эту ошибку только из-за наличия Abs[D[f[x,y,t],x]] или Conjugate[D[f[x,y,t],x]]. Я создал очень простую функцию, чтобы продемонстрировать эту проблему.

Это будет работать:

noAbs = D[f[x, t], t] == f[x, t] f[x, t] D[f[x, t], x, x]
xrange = \[Pi]; trange = 5;
forSolve = {noAbs, f[x, 0] == Exp[I x], f[-xrange, t] == f[xrange, t]}
frul = NDSolve[forSolve, f, {x, -xrange, xrange}, {t, 0, trange}, 
   MaxStepSize -> 0.007, Method -> "MethodOfLines" ];

Это не сработает (обратите внимание, единственная разница в том, что у нас нет Abs).

withAbs = D[f[x, t], t] == f[x, t] f[x, t] Abs[D[f[x, t], x, x]];
forSolve = {withAbs, f[x, 0] == Exp[I x], 
  f[-xrange, t] == f[xrange, t]}
frul = NDSolve[forSolve, {f}, {x, -xrange, xrange}, {t, 0, trange}, 
   MaxStepSize -> 0.007, Method -> "MethodOfLines" ];
Plot3D[Re[f[x, t]] /. frul, {x, -xrange, xrange}, {t, 0, trange}]

Прямо сейчас я предполагаю, что Mathematica попыталась взять производные от моих выражений и обнаружила, что не знает, как вывести функцию Abs. Правильно ли я предполагаю это, и как можно обойти эту проблему?


person Uri Merhav    schedule 12.01.2013    source источник


Ответы (1)


Немного терпения и записи всего с точки зрения реальной и мнимой части вашей функции. Настройка f=fRe + I fIm :

equation =  ComplexExpand[
 (Derivative[0, 1][fRe][x, t] + I Derivative[0, 1][fIm][x, t]) == 
 (fRe[x, t] + I fIm[x, t])^2  Abs[Derivative[2, 0][fRe][x, t] + I Derivative[2, 0][fIm][x, t]], 
   TargetFunctions -> {Re, Im}] ;

уравнение

Начальное состояние :

Plot[Evaluate@solAbs[x, 0], {x, -xrange, xrange}]

IC

Граничное условие :

Plot[Evaluate@(solAbs[-xrange, t] - solAbs[xrange, t]), {t, 0, trange}, PlotRange -> All]

введите здесь описание изображения

person b.gatessucks    schedule 12.01.2013
comment
Большое спасибо за ваш ответ. Вы хоть представляете, почему Mathematica терпит неудачу без явного разделения на действительную и мнимую части? А также, на случай, если кто-то прочитает это позже: поскольку мое реальное выражение, очевидно, намного длиннее этого, изменение уравнения вручную, чтобы включить явную действительную и мнимую части, не так привлекательно. Общий способ выполнить эту явную комплексификацию для любой сложной функции f будет следующим: f → Function[{x,t} fre[x,t] + I fim[x,t]] - person Uri Merhav; 13.01.2013
comment
Кроме того, чтобы собрать действительные и мнимые равенства, я бы добавил: ComplexExpand [Thread[Im[equation], Equal]] ComplexExpand [Thread[Re[equation], Equal]]' - person Uri Merhav; 13.01.2013