import matplotlib.pyplot as pltimport numpy as npplt.style.use('_mpl-gallery-nogrid')# make a stream function:X, Y = np.meshgrid(np.linspace(-3, 3, 256), np.linspace(-3, 3, 256))Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2)# make U and V out of the streamfunction:V = np.diff(Z[1:, :], axis=1)U = -np.diff(Z[:, 1:], axis=0)# plot:fig, ax = plt.subplots()ax.streamplot(X[1:, 1:], Y[1:, 1:], U, V)plt.show()
# 1. 导入库与样式设置import matplotlib.pyplot as pltimport numpy as npplt.style.use('_mpl-gallery-nogrid')# 2. 创建网格点X, Y = np.meshgrid(np.linspace(-3, 3, 256), np.linspace(-3, 3, 256))# 在 [−3,3]×[−3,3] 的矩形区域内生成 256×256 的均匀网格点。# X 和 Y 是二维数组,分别存储每个网格点的 x 坐标和 y 坐标。# 3. 定义流函数并计算速度场Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2)# Z 是一个标量场,代表流函数 ψ(x,y)。流函数在不可压缩流动中满足:速度分量u=∂ψ/∂y,v=-∂ψ/∂xV = np.diff(Z[1:, :], axis=1) # 沿 x 方向差分,近似 ∂ψ/∂xU = -np.diff(Z[:, 1:], axis=0) # 沿 y 方向差分并取负,近似 -∂ψ/∂y# np.diff 计算相邻元素的差值,近似偏导数。# Z[1:, :] 去掉第一行,axis=1 表示沿 x 方向(列)差分,得到 ∂ψ/∂x的近似,赋值给 V。# Z[:, 1:] 去掉第一列,axis=0 表示沿 y 方向(行)差分,得到 ∂ψ/∂y的近似,再取负号赋值给 U。# 这种组合使得 U 对应-∂ψ/∂y,V 对应∂ψ/∂x。根据流函数定义,实际速度应为u=∂ψ/∂y,v=-∂ψ/∂x,# 因此此处得到的 (U, V) 实际上是 (−u,−v)。# 但由于流线形状与方向无关(反向仍是同一条曲线),这不影响可视化效果。# 4. 绘制流线图fig, ax = plt.subplots()ax.streamplot(X[1:, 1:], Y[1:, 1:], U, V)# 由于 U 和 V 是通过差分得到的,它们的维度比原始网格少 1(256×256 的网格差分后变为 255×255)。# 因此用 X[1:, 1:] 和 Y[1:, 1:] 选取与 U、V 尺寸匹配的网格点坐标。# streamplot 根据速度场 (U, V) 绘制流线,流线是处处与速度方向相切的曲线,直观显示流场模式。# 5. 显示图像plt.show()