2011-10-28 18 views
3

問題は、別の問題を解決するための初期条件として1つのPDEの解を使用したいので発生します。 NDSolveでは、解はInterpolatingFunctionによって与えられるので、2番目のPDEでInterpolatingFunctionを使う必要があります。これは可能ですか?なぜ私のコンピュータはそれを永遠に実行するのですか? マイコード:Mathematica; NDSolve; InterpolatingFunctionを初期条件として使用できますか?

(*********************Parameters********************) 
\[Gamma] = 10^(-5); 
T = 500; 
tm = -250; 
\[Sigma] = 100; 
L = 1; 
L0 = -(L/2); 
L1 = L0 + L; 
c = 29.979; 
\[Omega] = 1.32949/10^8; 
\[Eta] = 1539.1; 
\[Mu] = 6.27; 
\[Beta] = 0.1334; 
k = 40895.3; 

(*********************1st PDE********************) 
solS = NDSolve[{D[sS[z, t], t] == (-(\[Gamma] + I*\[Beta]*z))*sS[z, t]-I*\[Omega]*aS[z, t], 
D[aS[z, t], z] + (1/c)*D[aS[z, t], t] == (-I)*\[Eta]*k*sS[z, t], sS[z, -T] == 0, 
aS[z, -T] == E^(-((-T - tm)^2/(2*\[Sigma]^2))), 
aS[L0, t] == E^(-((t - tm)^2/(2*\[Sigma]^2)))}, {sS, aS}, {z, L0, L1}, {t, -T, 0}, 
MaxSteps -> Infinity] 

(*************take the result and plot**************) 
iniR = solS[[1]][[1]][[2]] 
Plot3D[Re[iniR[z, t]], {z, L0, L1}, {t, -T, 0}, PlotRange -> All] 

(***********2nd PDE, with the 1st result as ini. con.***********) 
solR = NDSolve[{D[sR[z, t], t] == (-(\[Gamma] - I*\[Beta]*z))*sR[z, t] - I*\[Omega]*aR[z, t], 
D[aR[z, t], z] + (1/c)*D[aR[z, t], t] == (-I)*\[Eta]*k*sR[z, t], 
sR[z, 0] == iniR[z, 0], aR[z, 0] == 0, aR[L0, t] == 0}, {sR, aR}, {z, L0, L1}, 
{t, 0, T}, MaxSteps -> Infinity] 
+0

原則として、あるPDEの結果を使用して別のPDEを解決することができます。私はMathematicaでどのように処理されているのか分かりませんが、あなたの意図がこれを行うことであれば、補間を避けるために、両方のPDEに対して同じグリッド(またはより一般的には同じ表現)を持つことができます。 –

+0

アレクサンドル:ありがとう。補間を避けるために、両方のPDEに同じグリッド(またはより一般的には同じ表現)を持たせることについて、より具体的に記述できますか?あなたは私の方程式を変えるのですか?どのようにMathematicaでそれを実現するのですか? – user1019155

+1

これは[this physicsforums thread](http://www.physicsforums.com/showthread.php?t=544396)に関連しています。 – Simon

答えて

0

ファーストオフ:はい補間機能を使用できます。それには何も問題ありません。 Mathematicaの場合、InterpolatingFunctionは中間点を生成するために補間多項式を点集合に適用するだけです。実際には、InterpolatingFunctionが最も正確に表現できます。

計算が「永遠に」行われている理由は、MaxStepsを無限に設定しているためです。

これは、補間関数を使用することの問題ではありません。あなたがやっているシミュレーションが数値的に敏感であるということはもっと重要です。 MaxSteps->Infinityを指定することで、Mathematicaに解決策を生成するのに必要な時間がかかることを伝えることになります。

そうする過程で、数値的に安定した結果を得るには、おそらくステップサイズをちょっと小さく、例えば10^-6に減らしているでしょう。それはMaxSteps->Infinityの設定のためだけです。これを削除すると、実際には解決策が生成される可能性がありますが、解決策が貧弱であることを警告します。

あなたも解決策が悪いだろうという文句はMathematicaからのエラーを取得:

NDSolveで:: eerr:警告:独立した変数zの方向に 559.4348244417077 at t = 3.808844111947534のスケーリングされた局所的な空間誤差推定がずっとあります規定の誤差よりも大きい。 許容誤差。 25ポイントのグリッド間隔が大きすぎて希望の精度または精度を達成できない可能性があります。特異点が形成されているか、または は、MaxStepSizeまたは MinPointsメソッドオプションを使用して小さなグリッド間隔を指定することができます。 >>

関連する問題