2

我正在绘制两维温度梯度映射,并且有很多麻烦。我目前的方法是定义一个插值函数,然后尝试多次绘制它,然后为该图表生成动画。这是我到目前为止:Mathematica 2D热方程式动画

RT = 388.726919 
R = 1 
FUNC == NDSolve[{D[T[x, y, t], t] == 
RT*(D[T[x, y, t], x, x] + D[T[x, y, t], y, y]), 

    T[x, y, 0] == 0, 
    T[0, y, t] == R*t, 
    T[9, y, t] == R*t, 
    T[x, 0, t] == R*t, 
    T[x, 9, t] == R*t}, 

    T, {x, 0, 9}, {y, 0, 9}, {t, 0, 6}] 

所以前两个变量只是控制变化率。我正在求解的方程是基本的2D热方程,其中dT/dt = a(d^2T/dx^2 + d^2T/dy^2)。初始条件将一切设置为0,然后将边界定义为热量变化的来源。现在它从t = 0到t = 6扫过9x9块。

第二部分尝试为工作的函数设置动画。

ListAnimate[ 
Table[ 
    DensityPlot[T[x, y, t] /. FUNC, {x, 0, 9}, {y, 0, 9}, Mesh -> 9] 
, {t, 0, 6}] 
] 

不幸的是,这不起作用,我疯了试图找出原因。我首先认为它与插值函数有关,但现在我不太确定动画代码是否有效。有人有主意吗?

+0

尝试使用“FUNC =”而不是“FUNC ==” – 2010-12-03 05:25:25

+0

仍然不行。图表只是同一图表的副本。 – Tob 2010-12-03 05:29:38

回答

9

只是一个快速检查:

RT = 1 
R = 1 
FUNC = NDSolve[{D[T[x, y, t], t] == 
    RT*(D[T[x, y, t], x, x] + D[T[x, y, t], y, y]), T[x, y, 0] == 0, 
    T[0, y, t] == R*t, 
    T[9, y, t] == R*t, 
    T[x, 0, t] == R*t, 
    T[x, 9, t] == R*t}, T, 
    {x, 0, 9}, {y, 0, 9}, {t, 0, 6}]; 
a = Table[ 
    Plot3D[T[x, y, t] /. FUNC, {x, 0, 9}, {y, 0, 9}, Mesh -> 15, 
    PlotRange -> {{0, 9}, {0, 9}, {-1, 10}}, 
    ColorFunction -> Function[{x, y, z}, Hue[.3 (1 - z)]]], {t, 0, 6}] 
Export["c:\anim.gif", a] 

alt text

PS:通过使用小写字母作为符号的第一个字符可避免很多错误...

1

我与马克 - 你的程序没有错。问题是,没有什么有趣的发生在你的功能t=0后:尝试在看看

ListAnimate[ 
Table[Plot3D[T[x, y, t] /. FUNC, {x, 0, 9}, {y, 0, 9}, Mesh -> 9], {t, 0, 6}]] 

正如你所看到的,所发生的一切是缩放,这样当DensityPlot再缩放每一帧独立,他们最终寻找相同的:)

+0

这就是我的想法。我与ColorFunctionScaling-> False混在一起,但我无法让它作为一个函数工作,所以我最终为每一帧都提供了纯色。 – Tob 2010-12-03 22:50:34