1

単純な熱方程式U_t=U_xxについて、有限体積法の解とMathematicaの解を比較しようとしています。このために、MathematicaでNDSolve関数の初期条件と境界条件を指定する必要があります。境界U=90にしたい。初期条件として、境界を除くすべての正方形ドメインに100を設定したい。これどうやってするの?明らかに私のコードは機能しません。

FUNC = NDSolve[{D[T[x, y, t], t] == (D[T[x, y, t], x, x] + D[T[x, y, t], y, y]), 
    T[x, y, 0] == 100, T[0, y, t] == 90, T[9, y, t] == 90, 
    T[x, 0, t] == 90, T[x, 9, t] == 90}, 
   T, {x, 0, 9}, {y, 0, 9}, {t, 0, 6}];

すべてのドメインで100に等しい初期条件を設定しようとします。

4

1 に答える 1

6

実際、わずかな変更を加えるだけで、コードは機能します。

FUNC = T /. 
  NDSolve[{
     D[T[x, y, t], t] == (D[T[x, y, t], x, x] + D[T[x, y, t], y, y]), 
     T[x, y, 0] == 100, T[0, y, t] == 90, T[9, y, t] == 90, 
     T[x, 0, t] == 90, T[x, 9, t] == 90}, 
    T, {x, 0, 9}, {y, 0, 9}, {t, 0, 10}][[1]]

変更は、T/.前の(ReplaceAll)パーツと[[1]]、最後の(Part)です。ドキュメントでこれらの操作を確認することをお勧めします。出力を正しい形にマッサージするために必要です。

境界と初期条件の不一致に関するエラーメッセージが表示されます(これは正しいです)。それにもかかわらず、結果は使用可能です。

または、初期条件を変更して次のようにすることもできます。

FUNC = T /. 
  NDSolve[{
     D[T[x, y, t], t] == (D[T[x, y, t], x, x] + D[T[x, y, t], y, y]), 
     T[x, y, 0] == If[x == 0 || x == 9 || y == 0 || y == 9, 90, 100], 
     T[0, y, t] == 90, T[9, y, t] == 90, T[x, 0, t] == 90, 
     T[x, 9, t] == 90}, T, {x, 0, 9}, {y, 0, 9}, {t, 0, 10}][[1]]

Manipulateこれで、この関数を使用して、たとえば:などの多くのことを実行できます。

Manipulate[ContourPlot[FUNC[x, y, t], {x, 0, 9}, {y, 0, 9}], {t, 0, 10}]

ContourPlotを操作する

またはアニメーションGIF:

anim = Table[DensityPlot[FUNC[x, y, t], {x, 0, 9}, {y, 0, 9}, 
          ColorFunctionScaling -> False, PlotPoints -> 50,
          ColorFunction -> (Hue[Rescale[#, {50, 100}], 1, 1] &)], 
        {t, 0, 10, .2}];
Export[ToFileName[$UserDocumentsDirectory, "anim.gif"], anim, "GIF"]

アニメーションGIF

于 2011-03-30T22:14:35.293 に答える