我试着将我的有限体积法的解与my的简单热方程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。
发布于 2011-03-31 06:14:35
实际上,只需稍加修改,您的代码就可以正常工作。
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"]

https://stackoverflow.com/questions/5492709
复制相似问题