热扩散在2d板上 - Python

时间:2015-03-10 21:54:29

标签: python

我需要完成一项任务,而且我有点不知所措。我不知道解算器有什么问题,我不知道如何可视化数据。 我的任务是模拟2D板上的热扩散。它必须有2个加热器,并且在板的中间有两个孔。 BC始终为零。

我的问题是: 如何使模拟运行时间?我问这个是因为当我以这种方式绘制它时,它会向我显示板上的加热器,但所有的热量都集中在它们上面。另一个问题是,如何在给定时间将结果可视化为视频或图片? 这是我的代码。谢谢。

import numpy as np
import matplotlib.pyplot as plt

dt=0.1
dx=0.1

L=50                        #length of the plate
Ly=np.linspace(0,L,50)
B=50                        #width of the plate
Bx=np.linspace(0,B,50)

M=np.zeros([L,B])           #matrix

#heating device shaped like X
Gr=np.eye(10)*2000
for iGr in range(10):
    Gr[iGr,-iGr-1]=2000

#implementing heaters to matrix    
M[20:30,10:20]=Gr
M[20:30,30:40]=Gr

t=0
#wannabe solver
while t<10:
    t=0.1+t
    for j in range(1,L-1):
        for i in range(1,B-1):            
            if 24<j<28:
                if 29<i<32:
                    k=0
                elif 23<i<20: # holes for liquid
                    k=0
                else:
                    break
            else:
                k=0.5
                break

            M[i,j]=M[i,j]+k*((dt)/dx**2)*(M[i,j+1]-2*M[i,j]+M[i,j-1])+k*((dt)/dx**2)*(M[i+1,j]-2*M[i,j]+M[i-1,j])


plt.pcolormesh(M)
plt.colorbar()
plt.show()

1 个答案:

答案 0 :(得分:5)

这可能会让你开始。我不熟悉你的传热功能(或一般的传热功能)所以我使用了不同的传热功能。

以下代码为每个步骤dt计算M,并将其附加到列表MM

然后我们使用FuncAnimation逐步浏览MM的元素(回想一下MM的元素是矩阵M的快照)并显示它们。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

dt=0.1
dx=0.1

L=50                        # length of the plate
B=50                        # width of the plate


#heating device shaped like X
Gr=np.eye(10)*2000
for iGr in range(10):
    Gr[iGr,-iGr-1]=2000

# Function to set M values corresponding to non-zero Gr values
def assert_heaters(M, Gr):
    M[20:30,10:20] = np.where(Gr > 0, Gr, M[20:30,10:20])
    M[20:30,30:40] = np.where(Gr > 0, Gr, M[20:30,30:40])


M=np.zeros([L,B])           # matrix
assert_heaters(M, Gr)

# Build MM, a list of matrices, each element corresponding to M at a given step
T = np.arange(0,10,dt)
MM = []
for i in xrange(len(T)):
    for j in range(1,L-1):
        for i in range(1,B-1):
            k=0.5  # default k
            if 24<j<28:
                # holes for liquid
                if 29<i<32 or 23<i<20: k=0

            #dm = k * ((dt)/dx**2) * (M[i,j+1] + M[i,j-1] - 2*M[i,j]) + \
            #     k * ((dt)/dx**2) * (M[i+1,j] + M[i-1,j] - 2*M[i,j])
            #M[i,j] += dm
            M[i,j] = (M[i-1,j] + M[i+1,j] + M[i,j-1] + M[i,j+1])/4

    # Re-assert heaters
    assert_heaters(M, Gr)

    MM.append(M.copy())



fig = plt.figure()
pcm = plt.pcolormesh(MM[0])
plt.colorbar()

# Function called to update the graphic
def step(i):
    if i >= len(MM): return
    pcm.set_array(MM[i].ravel())
    plt.draw()

anim = FuncAnimation(fig, step, interval=50)
plt.show()

当然,您必须自行更正传输功能。

此代码产生类似this animation的内容(注意,它是3M,太大而无法嵌入答案中)

压缩版:

enter image description here