使用Python实现罗斯勒系统的三维相图

ni65a41a  于 2022-11-21  发布在  Python
关注(0)|答案(1)|浏览(167)

在用Python绘制罗斯勒系统的三维相图时,我遇到了一个特殊的问题,问题是某些箭头太长了,因此可视化效果并不好:Bad 3d phase portrait到目前为止,这是我的代码,我真的不知道要修改什么才能做出合适的绘图。任何帮助都将不胜感激。

# Axes, grid

fig = plt.figure(figsize=(10, 10))
ax = plt.axes(projection ='3d')

x, y, z = np.meshgrid(np.arange(-20, 20, 4),
                      np.arange(-20, 20, 4),
                      np.arange(0, 20, 4))

# Define vector field

u = -y - z
v = x + (1/5)*y
w = 1/5 + (x - 5/2)*z

# Plot vector field

ax.quiver(x, y, z, u, v, w, length=0.1, normalize = False)

ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')

plt.show()

我还没有能够尝试任何替代方案,主要是因为我真的不知道该怎么做。

628mspwn

628mspwn1#

我相信你不可能用抖动来精确地可视化这个矢量场,因为在你的视野范围内有相当大的幅度变化。一个更好的方法是可视化流线,但这也不容易:

  1. matplotlib不支持3D流线。
  2. Plotly支持流管,但当我在我的矢量场上尝试它时,我通常会得到“mehhh”的结果,这意味着它真的很难让它们达到适当的比例。
    1.我相信最简单的解决方案是使用SymPy Plotting Backend module,它公开了一个plot_vector函数,也可以绘制流线。注意,我是这个模块的开发者,所以我将为你展示它。特别是,这个模块公开了一个后端,可以使用K3D-Jupyter创建绘图,对于这个特定的矢量场,它可以产生很好的结果。
from sympy import *
from spb import *
var("x:z, u:w")

u = -y - z
v = x + (1/5)*y
w = 1/5 + (x - 5/2)*z

plot_vector(
    [u, v, w], (x, -20, 20), (y, -20, 20), (z, 0, 20), # vector field and ranges
    backend=KB,         # chose the plotting library: K3D-Jupyter
    streamlines=True,   # enable or disable streamlines
    stream_kw={         # customize streamlines
        "starts": True, # Ask the streamlines to start from random points
        "npoints": 150  # number of starting points for the streamlines
    },
    n=50, # number of discretization points. Don't go too crazy as memory requirements is at least n^3
    use_cm=True, # use color map. Colors indicates the magnitude of the vector field.
)

为了使用Streamline功能,您将必须安装所有的需求,这些需求相当繁重(如果我没记错的话,至少有200MB)。

pip install sympy_plot_backends[all]

相关问题