1

我尝试将我的有限体积法的解决方案与 Mathematica 的解决方案进行比较,以获得简单的热方程 U_t = U_xx。为此,我必须在 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}]

操纵等高线图

或动画 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 回答