2013-01-12 28 views
3

我想用NDSolve來數值求解PDE。我不斷收到以下錯誤:Mathematica:解決包含功能的共軛功能或功能的Abs的PDE

"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}] 

現在我猜數學試圖把我的表情的衍生物,發現它不知道如何推導Abs功能。我是否正確地承認這一點,以及如何解決這個問題?

回答

2

用一點耐心,用你的函數的實部和虛部來寫一切。 設置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}] ; 

equation

初始條件:

Plot[[email protected][x, 0], {x, -xrange, xrange}] 

IC

邊界條件:

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

enter image description here

+0

非常感謝您的回覆。你有什麼想法,爲什麼Mathematica失敗,沒有明確分離成實部和虛部?另外,如果有人在後面讀到這一點:由於我的實際表達顯然比這個要長得多,所以將「手動」方程改爲包含顯式實部和虛部並不是那麼有吸引力。 對於任何複雜函數f做一個「顯性複雜化」的通用方法是: f函數[{x,t} fre [x,t] + I fim [x,t]] –

+0

另外,爲了收集實數和虛數的平等,我會加上: ComplexExpand [Thread [Im [equation],Equal]] ComplexExpand [Thread [Re [equation],Equal]]' –