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