使用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+ 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告