对二维扩散方程的学习——来自流沙公众号

方程描述
代码:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

nx = 31 # 定义x方向节点数
ny = 31 # 定义y方向节点数
nt = 17 # 定义时间步长
nu = 0.05 # 扩散系数
dx = 2 / (nx - 1)
dy = 2 / (ny - 1)
sigma = 0.25 # 库朗数
dt = sigma * dx * dy / nu   # 非常不理解,nu是扩散系数,不是传播速度?还是类比扩散这个传播速度

x = np.linspace(0,2,nx)
y = np.linspace(0,2,ny)
# 边界条件
u = np.ones((nx,ny))
un = np.ones((nx,ny))
# 初始条件
u[int(0.5/dx):int(1/dx+1),int(0.5/dy):int(1/dy+1)] = 2

nt= int(input("Input:"))

# 定义函数进行求解
for n in range(nt + 1):
	un = u.copy()
	u[1:-1,1:-1] = (un[1:-1,1:-1] +
		             nu * dt / dx**2 * (un[2: ,1:-1] - 2 * un[1:-1,1:-1] + un[0:-2,1:-1]) +
		             nu * dt / dx**2 * (un[1:-1,2:] - 2 * un[1:-1,1:-1] + un[1:-1, 0:-2]) )
	u[0, :] = 1
	u[-1, :] = 1
	u[:, 0] = 1
	u[:, -1] = 1

fig = plt.figure()
ax = Axes3D(fig)
x, y = np.meshgrid(x,y)
surf2 = ax.plot_surface(x,y,u[:],rstride=1,cstride=1,cmap='viridis',linewidth=0,antialiased=False)
ax.set_xlim(0,2)
ax.set_ylim(0,2)
ax.set_zlim(1,2.5)
ax.set_xlabel('$x$')
ax.set_ylabel('$y$')
plt.show()

不理解:
1、dt = sigma * dx * dy / nu # 非常不理解,nu是扩散系数,不是传播速度?还是类比扩散这个传播速度

结果
10
15
50
时间分别为10, 15, 50

猜你喜欢

转载自blog.csdn.net/qq_42000453/article/details/83097516