2013-01-12 4 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" ]; 

.

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] 
,536,

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]] ' –