如何在Python中使用绘图程序绘制已知速度u和v分量的流线(numpy二维数组)?

17 投票
3 回答
32007 浏览
提问于 2025-04-17 07:13

我希望标题已经很清楚了,我正在用分步法和有限差分法解决一个二维的盖子驱动腔体问题(就是一个正方形的区域)。我已经得到了整个区域的速度的u和v分量,而不需要手动计算流线。请问有没有什么命令或者绘图工具可以帮我完成这个工作?

我希望这个问题和编程有关系,因为我需要一个工具来绘制流线,而不需要明确地去计算它们。

我之前用流-涡度的纳维-斯托克斯方程解决过同样的问题,那时候我只需要绘制流函数的等高线图就能得到流线。

我希望这个工具或者绘图工具是一个Python库,而且最好能在Fedora上安装(我也可以妥协用Mint),而且安装过程不要太麻烦!

如果有人能告诉我这个库和相关的命令,我会非常感激,这样可以节省很多时间。

3 个回答

4

在Matplotlib的1.2版本中,现在有了一个叫做streamplot的功能。

22

你可以看看 Tom Flannaghan的 streamplot 函数。相关的讨论可以在 用户列表的这个帖子里找到,还有一个 Ray Speth的类似代码片段,它的做法稍有不同。

如果你在速度上遇到问题,使用一些scipy的积分功能可能会更高效,而不是这两个例子中使用的纯numpy积分函数。不过我自己没有尝试过,这些例子故意避免依赖scipy。(scipy相比numpy来说,依赖性比较重)

从它的示例图来看:

import matplotlib.pyplot as plt
import numpy as np
from streamplot import streamplot

x = np.linspace(-3,3,100)
y = np.linspace(-3,3,100)
u = -1-x**2+y[:,np.newaxis]
v = 1+x-y[:,np.newaxis]**2
speed = np.sqrt(u*u + v*v)

plt.figure()
plt.subplot(121)
streamplot(x, y, u, v, density=1, INTEGRATOR='RK4', color='b')
plt.subplot(122)
streamplot(x, y, u, v, density=(1,1), INTEGRATOR='RK4', color=u,
           linewidth=5*speed/speed.max())
plt.show()

enter image description here

另一个选择是使用 VTK。它是加速的3D绘图,所以制作2D图时需要正确设置相机(这并不太难),而且你无法获得矢量输出。

Mayavi、tvtk和mlab为VTK提供了Python的封装。它在这方面有很多功能。

使用VTK从numpy数组绘制流线的最简单方法是使用 mayavi.mlab.flow。我暂时不提供示例,但如果你想探索使用VTK来实现这一点,我可以添加一个示例。

撰写回答