使用Python建模二維熱傳導問題


在本教程中,我們將學習如何使用Python模擬二維熱傳導方程。帶有熱生成的二維穩態熱傳導方程可以用笛卡爾座標表示如下:

$$\mathrm{\triangledown^{2} T \: + \: \frac{q_{g}}{k} \: = \: \frac{\partial^{2}T}{\partial x^{2}} \: + \: \frac{\partial^{2}T}{\partial y^{2}} \: + \: \frac{q_{g}}{k} \: = \: 0 \:\:\dotso\dotso (1)}$$

這需要離散化才能得到有限差分方程。讓我們考慮如下所示的矩形網格。

索引𝑖垂直執行,即行方向,而索引𝑗水平執行,即列方向。任何內部節點(i,j)都被四個節點包圍,因此該節點的資訊只能從這四個節點傳輸。而對於邊界節點,資訊將來自邊界條件。

為了離散化方程1,將使用二階精度的中心差分格式。此外,水平方向和垂直方向的網格點間距保持相同,即$\mathrm{\Delta x \: = \: \Delta y \: = \: \Delta}$。單變數函式二階導數的中心差分公式為:

$$\mathrm{\frac{d^{2}f(x)}{dx^{2}} \: = \: \frac{f_{i-1} \: − \: 2f_{i} \: + \: f_{i+1}}{\Delta x^{2}}\:\:\dotso\dotso (2)}$$

同樣,方程1的離散化可以寫成:

$$\mathrm{\frac{T_{i-1, \: j} \: − \: 2T_{i,\: j} \: + \: T_{i+1, \: j}}{\Delta x^{2}} \: + \: \frac{T_{i, \: j-1} \: − \: 2T_{i,\: j} \: + \: T_{i, \: j+1}}{\Delta 6^{2}} \: + \: \frac{q_{g}}{k} \: = \: 0 \:\:\dotso\dotso (3)}$$

方程3的簡化形式為:

$$\mathrm{T_{i,\: j} \: = \: \frac{1}{4}(T_{i-1, \: j}\: + \: T_{i+1, \: j} \: + \: T_{i,\: j-1} \: + \: T_{i, \: j+1} \: + \: \Delta^{2} \frac{q_{g}}{k}) \:\:\dotso\dotso (4)}$$

方程4是必須針對域中每個內部節點求解的方程。

對於這類問題,資訊從邊界傳播到內部,因此邊界條件的知識至關重要。基本上,在任何數值和分析分析中經常使用三種類型的邊界條件:

  • 狄利克雷邊界條件:在此條件下,邊界上因變數的值已知。例如

    $$\mathrm{x \: = \: 0 \: \rightarrow \: T \: = \: 500 \: K }$$

  • 諾依曼邊界條件:在此條件下,因變數的導數給出為零或自變數的函式。例如

    $$\mathrm{x \: = \: 0 \: \rightarrow \: \frac{\partial T}{\partial x} \: = \: 0 }$$

  • 羅賓邊界條件:在此條件下,因變數的導數是因變數本身的某個函式。例如

    $$\mathrm{− \: k \: (\frac{\partial T}{\partial x})_{x=0} \: = \: h(T \: − \: T_{\infty}) }$$

演算法

  • 選擇區域

  • 選擇x和y方向的網格點數

  • 定義$\mathrm{\Delta x}$和$\mathrm{\Delta y}$。

  • 定義網格。

  • 提供溫度的初始猜測值。

  • 提供邊界條件

  • 對方程4中的內部節點求解

  • 評估誤差。

  • 如果誤差大於收斂標準,則將當前T值設定為新的猜測值,並遵循步驟4-9。否則,答案已達到,並繪製結果。

在本教程中,我們將解決兩種情況,即有熱量產生和無熱量產生。此外,我們將假設狄利克雷邊界條件。

待解決的問題如下:

問題1

問題2

對於這兩個問題,除了熱量產生引數外,其他所有引數都保持不變。這就是為什麼本文只顯示一次程式碼的原因。

Importing modules
from pylab import *
from numpy import*

# Defining thermal properties
# case 1
# qg=0
# case 2
qg= 1000000
k=100

# Define domain
ℓx=1.0
ℓy=1.0

# Number of grid points
nx=20
ny=20

# Grid spacing
Δx=ℓx/(nx-1)
Δy=ℓy/(ny-1)
Δ=Δx

# Grid generation
x=linspace(0,ℓx,nx)
y=linspace(0,ℓy,ny)
X,Y=meshgrid(x,flipud(y))

# Initial Guess
T=zeros(shape=(nx,ny))

# Boundary conditions
#left
T[:,0]=300
#right
T[:,-1]=300
#top
T[0,:]=800
#bottom
T[-1,:]=300

# Guess array for comparison
Tg=T.copy()

# Initial error or entry in loop
error=1

# Iteration counter
count=1

# Comparison loop
while error>1.E-5:
   # Sweeping in the domain
   for i in range(1,nx-1):
      for j in range(1,ny-1):
         T[i,j]=(T[i,j-1]+T[i,j+1]+T[i-1,j]+T[i+1,j]+Δ**2*qg/k)/4
   # Evaluating and printing error
   error=sqrt(sum(abs(T-Tg)**2))
   figure(1,dpi=300)
   if count%100==0:
      print(error)
      semilogy(count,error,'ko')
   xlabel("Iteration Counter")
   ylabel("Error")
   savefig("Error.jpg")
   
   # Updating guess for next iteration
   Tg=T.copy()
   
   # Incrementing counter
   count+=
   
# Result Plotting (Temperature contour plot)
figure(3,dpi=300)
cp1=contourf(X,Y,T,10,cmap='jet')
colorbar()
cp1=contour(X,Y,T,10,colors='k')
clabel(cp1,inline=True, fontsize=10)
savefig("temp.jpg")

第一種情況的誤差和溫度圖

第二種情況的誤差和溫度圖

現在您可以觀察到,熱量的產生導致核心溫度升高,以至於邊界條件的影響無法與之匹配。在問題一中,您觀察到影響從頂部開始,向底部和側面移動。然而,在第二種情況下,邊界條件試圖施加影響,但是由於熱量產生過高,熱流的方向現在從中心向外移動。然而,由於問題必須匹配邊界條件,因此邊界溫度保持不變。

結論

在本教程中,二維熱傳導方程已在Python中建模。有限差分法已被用於解決兩個問題:一個是有熱量產生,另一個是無熱量產生。已經觀察到,程式碼中採用的熱量產生大小對最終穩態解的影響不大。

更新於:2023年10月4日

2K+ 次瀏覽

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告