【发布时间】:2021-03-20 04:14:32
【问题描述】:
我想用 Python 编写一个代码来评估密度分布 p(x,y) 的时间演变。初始条件为p(t=0,x,y)=exp[-((x-500)^2)/500],解的公式如下代码:t-time index, i-space index(x方向),j空间索引(y方向),v=0.8
我的目标是运行该方案 10 次迭代,并在最后一个时间步 (t=9) 绘制结果。我得到的是一个用零填充的大数组。我认为这是因为我没有正确使用 3D 数组,有人有什么建议吗?谢谢。
我的尝试:
import numpy as np
import matplotlib.pyplot as plt
#Input Parameters
Nx = 1000 #number of grid points in x-direction
Ny = 500 #number of grid points in y-direction
T = 10 #number of time steps
v = 0.8
p = np.zeros((T,Nx,Ny))
P = np.zeros((T,Nx,Ny))
for t in range(0,T-1):
for i in range(0,Nx-1):
for j in range(0,Ny-1):
P[t,i,j] = p[t,i,j]-((v/2)*(p[t,i+1,j]-p[t,i,j]))
p[0,i,j] = np.exp(((-1*(i-500))**2)/500)
x = P[9,i]
y = P[9,j]
print(x)
plt.plot(x,y)
plt.xlim([0,1000])
plt.ylim([0,500])
plt.xlabel('x-direction')
plt.ylabel('y-direction')
plt.title("Density Distribution After 10 Iterations")
【问题讨论】:
-
你确定你的公式是正确的吗?
p[t,i,j]-((v/2)*(p[t,i+1,j]-p[t,i,j]))始终为 0,np.exp(((-1*(i-500))**2)/500)非常大 -
您好,感谢您指出这一点。为了提出问题,我试图简化公式,因为实际公式很长。初始条件 np.exp(((-1*(i-500))**2)/500) 应表示以 x=500 为中心的窄垂直脉冲(最大值 = 1,最小值 = 0)。作为参考,真正的公式是二维平流方程的 Lax-Wendroff 解:P[t,i,j] = p[t,i,j]-((v/2)*(p[t,i, j+1]-p[t,i,j]))-((v/2)*(p[t,i+1,j]-p[t,i,j]))+(((v 2)/2)*(p[t,i,j+1]-(2*p[t,i,j])+p[t,i,j-1]))+((( v2)/2)*(p[t,i+1,j]-(2*p[t,i,j])+p[t,i-1,j]))跨度>
-
所以我可以用虚拟常数替换它们,看看其余的是否正确?
-
是的,我认为这是个好主意。谢谢。
-
尝试评论您的代码。索引似乎有错误。我注意到的一些错误是 1)
p[0, i, j]为什么是 0?从逻辑上讲应该是 t 2)p[0,i,j] = np.exp(((-1*(i-500))**2)/500)这个表达式应该在其他表达式之前 3)P是一个 3D 数组,你选择 x 的方式,即x = P[9, i] and y = P[9, j]似乎不正确 4)range(0, T-1)表示 range(0,9) 而你永远不会达到 9 所以 P[9,...] 肯定是零
标签: python arrays numpy plot colormap