Wolfram mathematica 如何在Mathematica中指定域部分的初始条件?

Wolfram mathematica 如何在Mathematica中指定域部分的初始条件?,wolfram-mathematica,differential-equations,Wolfram Mathematica,Differential Equations,我试着比较我的有限体积法的解和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,

我试着比较我的有限体积法的解和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。

实际上,只需稍加修改,代码就可以工作

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]]]
(部分);您可能希望在文档中查看这些op。有必要将输出按摩成正确的形状

您会收到一条关于边界条件和初始条件不一致的错误消息(这是正确的)。结果仍然是可用的

或者,您可以更改初始条件,以便读取

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

事实上,只要稍加修改,您的代码就可以正常工作

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]]]
(部分);您可能希望在文档中查看这些op。有必要将输出按摩成正确的形状

您会收到一条关于边界条件和初始条件不一致的错误消息(这是正确的)。结果仍然是可用的

或者,您可以更改初始条件,以便读取

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

你赢了我!如果可以的话,我已经在你的答案中添加了一个动画。@Simon我同时在编辑我自己的贡献。不确定一切都好。你能检查一下吗?是的-遇到麻烦了!很抱歉。我希望变化是好的。我得出了与你完全相同的结论,因此不值得一篇新文章,但我确实想用我的动画!你赢了我!如果可以的话,我已经在你的答案中添加了一个动画。@Simon我同时在编辑我自己的贡献。不确定一切都好。你能检查一下吗?是的-遇到麻烦了!很抱歉。我希望变化是好的。我得出了与你完全相同的结论,因此不值得一篇新文章,但我确实想用我的动画!