2D传热 - 溢流错误

时间:2017-05-25 00:19:49

标签: python numpy simulation

我试图使用以下公式模拟铝中的2D热转移:

dT / dt = K *(d ^ 2T / d ^ 2x + d ^ 2T / d ^ 2y)

来源: this tutorial here

python代码正在使用dx = dy = 1(mm),但如果dx和dy变小,我会收到溢出错误,我不知道如何避免。

import numpy as np
import matplotlib.pyplot as plt
from copy import deepcopy
from matplotlib.animation import FuncAnimation
import time


x = 11
y = 11

sd = 1
nx = x*sd
ny = y*sd

dx = 1/float(sd)
dy = dx

#Initial Temperature
T0 = 25

# Source: https://en.wikipedia.org/wiki/Thermal_diffusivity  
# Aluminium Thermal diffusivity (mm**2/s) 
K = 97

#Time
t0 = 0
te = 1
st = 1000
dt = 1/float(st)


#Iterations
N = (te - t0)*st

T = np.zeros(shape=(nx, ny))

T[:,:] = T0

# Dirichlet Condition
T[nx/2,ny/2] = 1000


MM = []

for n in range(N):

    Tb = deepcopy(T)

    for i in range(nx):
        for j in range(ny):

            #Neumann Boundary Conditions
            #TOP
            if i == 0:
                T[i,j] = Tb[i+1,j]

            #RIGHT
            elif j == ny1-1 and i != 0 and i != nx1-1: 
                T[i,j] = Tb[i,j-1]

            #BOTTOM
            elif i == nx-1:  
                T[i,j] = Tb[i-1,j]

            #LEFT
            elif j==0 and i != 0 and i != nx-1:
                T[i,j] = Tb[i,j+1]

            else:

                T[i,j] = Tb[i,j] + K*(dt/dx**2)*(Tb[i+1,j]+Tb[i-1,j]+Tb[i,j+1]+Tb[i,j-1]-4*Tb[i,j])
            T[nx/2,ny/2] = 200

    MM.append(T.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 0
    pcm.set_array(MM[i].ravel())
    plt.title("Time: {0} s\n".format(i*dt))
    plt.draw()

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

我为了重现溢出错误,将sd的值改为10(每个mm将被分成10个元素)。

2 个答案:

答案 0 :(得分:3)

基本上T[i,j]正在发散并达到非常高的+和 - 值,并且在某些时候达到double_scale类型的限制。

您可以在print(T[i,j])T[i,j] = Tb[i,j] + K*(dt/dx**2)*(Tb[i+1,j]+Tb[i-1,j]+Tb[i,j+1]+Tb[i,j-1]-4*Tb[i,j])的情况下sd=10之后添加st=1000来检查。

这不是python或numpy问题,而是在尝试使用您正在使用的方法用数值求解刚性微分方程时出现的数值数学问题。

当您决定以更高的空间分辨率进行求解时,您也应该以更高的时间分辨率求解。我已经对代码进行了测试,它适用于:sd=2st=5000sd=4st=10000。你看到了模式。

或者为微分方程使用更好的数值解。像向后微分公式(BDF)一样,您可以在不使数值求解器发散的情况下采取更大的时间步长。在这里寻找灵感:

https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.integrate.ode.html

答案 1 :(得分:2)

算法的核心是

1 - 4*K*(dt/dx**2)

这里关注Tb [i,j]的系数:它是K*(dt/dx**2)。要使算法起作用,这必须是一个正数;否则你会从火中产生冰(从积极到消极),解决方案没有任何物理意义,数字会爆炸。

因此,请确保{{1}}小于1/4。这意味着当dx变小时,也可能需要减小dt。例如,K = 1且dx = 0.001将需要dt <1。 2.5E-7。