我尝试将我的有限体积方法的解与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。
答案 0 :(得分: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]]
(部分);您可能希望在文档中查看这些操作。必须将输出按摩到正确的形状。
您收到有关边界和初始条件不一致的错误消息(这是正确的)。结果仍然有用。
或者,您可以更改初始条件以便阅读
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"]