2011-03-30 149 views
1

我嘗試將我的有限體積法的解與對於簡單熱方程U_t = U_xx的Mathematica求解進行比較。爲此,我必須在Mathematica中爲NDSolve函數指定初始條件和邊界條件。我想有U = 90的邊界。作爲初始條件,我希望除了邊界之外,在所有方形區域中都有100個。我怎樣才能做到這一點?顯然我的代碼不起作用。如何在Mathematica中指定部分域的初始條件?

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

回答

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]](第一部分)在端部;你可能想在文檔中查看這些操作。 Thery是必要的按摩輸出到正確的形狀。

您會收到關於邊界條件和初始條件不一致的錯誤消息(這是正確的)。結果仍然可用。

或者,您可以更改初始條件,使之讀

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}] 

Manipulate ContourPlot

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

animated gif

+0

你打我吧!如果沒有問題,我已經爲您的答案添加了動畫。 – Simon 2011-03-30 22:18:00

+0

@Simon我在同一時間編輯我自己的貢獻。不知道一切都OK了。你能檢查嗎? – 2011-03-30 22:24:11

+0

是啊 - 遇到麻煩!對於那個很抱歉。我希望這些改變是可以的。我得出了和你一樣的結論,所以它不值得一個新的帖子,但我確實想用我的動畫! – Simon 2011-03-30 22:35:09

相關問題