Python 的二维热传导
2D Heat Conduction with Python
the output of the study/////刚开始学习Python,所以是新手python。我已经为 2D 热传导编写了一个简单的代码。我不知道我的代码有什么问题。结果 strange.I 认为温度分布显示不正确。我已经搜索了很多但不幸的是我找不到我的问题的任何答案。谁能帮我?
谢谢
# Library
import numpy
from matplotlib import pyplot
# Grid Generation
nx = 200
ny = 200
dx = 2 / (nx-1)
dy = 2 / (ny-1)
# Time Step
nt = 50
alpha = 1
dt = 0.001
# Initial Condition (I.C) and Boundry Condition (B.C)
T = numpy.ones((nx, ny)) # I.C (U = Velocity)
x = numpy.linspace(0,2,nx) # B.C
y = numpy.linspace(0,2,ny) # B.C
Tn = numpy.empty_like(T) #initialize a temporary array
X, Y = numpy.meshgrid(x,y)
T[0, :] = 20 # B.C
T[-1,:] = -100 # B.C
T[:, 0] = 150 # B.C
T[:,-1] = 100 # B.C
# Solver
###Run through nt timesteps
for n in range(nt + 1):
Tn = T.copy()
T[1:-1, 1:-1] = (Tn[1:-1,1:-1] +
((alpha * dt / dx**2) *
(Tn[1:-1, 2:] - 2 * Tn[1:-1, 1:-1] + Tn[1:-1, 0:-2])) +
((alpha * dt / dy**2) *
(Tn[2:,1: -1] - 2 * Tn[1:-1, 1:-1] + Tn[0:-2, 1:-1])))
T[0, :] = 20 # From B.C
T[-1,:] = -100 # From B.C
T[:, 0] = 150 # From B.C
T[:,-1] = 100 # From B.C
fig = pyplot.figure(figsize=(11, 7), dpi=100)
pyplot.contourf(X, Y, T)
pyplot.colorbar()
pyplot.contour(X, Y, T)
pyplot.xlabel('X')
pyplot.ylabel('Y');
您正在使用 Forward Time Centered Space 离散化方案来求解您的热方程,当且仅当 alpha*dt/dx**2 + alpha*dt/dy**2 < 0.5
时该方程是稳定的。使用 dt
、dx
、dy
和 alpha
的值,您会得到
alpha*dt/dx**2 + alpha*dt/dy**2 = 19.8 > 0.5
这意味着你的数值解会很快发散。要解决这个问题,您需要使 dt
更小 and/or dx
和 dy
更大。例如,对于 dt=2.5e-5
和得到 alpha*dt/dx**2 + alpha*dt/dy**2 = 0.495
之前的其余部分,在 1000 次迭代后,解决方案将如下所示:
或者,您可以使用不同的离散化方案,例如 API scheme,它无条件稳定但更难实现。
the output of the study/////刚开始学习Python,所以是新手python。我已经为 2D 热传导编写了一个简单的代码。我不知道我的代码有什么问题。结果 strange.I 认为温度分布显示不正确。我已经搜索了很多但不幸的是我找不到我的问题的任何答案。谁能帮我? 谢谢
# Library
import numpy
from matplotlib import pyplot
# Grid Generation
nx = 200
ny = 200
dx = 2 / (nx-1)
dy = 2 / (ny-1)
# Time Step
nt = 50
alpha = 1
dt = 0.001
# Initial Condition (I.C) and Boundry Condition (B.C)
T = numpy.ones((nx, ny)) # I.C (U = Velocity)
x = numpy.linspace(0,2,nx) # B.C
y = numpy.linspace(0,2,ny) # B.C
Tn = numpy.empty_like(T) #initialize a temporary array
X, Y = numpy.meshgrid(x,y)
T[0, :] = 20 # B.C
T[-1,:] = -100 # B.C
T[:, 0] = 150 # B.C
T[:,-1] = 100 # B.C
# Solver
###Run through nt timesteps
for n in range(nt + 1):
Tn = T.copy()
T[1:-1, 1:-1] = (Tn[1:-1,1:-1] +
((alpha * dt / dx**2) *
(Tn[1:-1, 2:] - 2 * Tn[1:-1, 1:-1] + Tn[1:-1, 0:-2])) +
((alpha * dt / dy**2) *
(Tn[2:,1: -1] - 2 * Tn[1:-1, 1:-1] + Tn[0:-2, 1:-1])))
T[0, :] = 20 # From B.C
T[-1,:] = -100 # From B.C
T[:, 0] = 150 # From B.C
T[:,-1] = 100 # From B.C
fig = pyplot.figure(figsize=(11, 7), dpi=100)
pyplot.contourf(X, Y, T)
pyplot.colorbar()
pyplot.contour(X, Y, T)
pyplot.xlabel('X')
pyplot.ylabel('Y');
您正在使用 Forward Time Centered Space 离散化方案来求解您的热方程,当且仅当 alpha*dt/dx**2 + alpha*dt/dy**2 < 0.5
时该方程是稳定的。使用 dt
、dx
、dy
和 alpha
的值,您会得到
alpha*dt/dx**2 + alpha*dt/dy**2 = 19.8 > 0.5
这意味着你的数值解会很快发散。要解决这个问题,您需要使 dt
更小 and/or dx
和 dy
更大。例如,对于 dt=2.5e-5
和得到 alpha*dt/dx**2 + alpha*dt/dy**2 = 0.495
之前的其余部分,在 1000 次迭代后,解决方案将如下所示: