在matplotlib中用箭头绘制相空间轨迹

2024-04-19 23:36:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图画出一个动力系统的相空间图。实际上,我有一个二维平面,其中有一个起点,然后是下一个点,依此类推。我想用线把这些点连接起来,在上面画一些箭头,这样我就能看到方向(从起点到下一个点等等)。我决定使用线型'->'来实现这一点,但它没有给出任何好的结果,箭头实际上似乎多次指向错误的方向。而且它们的间距很近,因此我看不到单独的线条。

我的代码如下:

import numpy as np
import matplotlib.pylab as plt
from scipy.integrate import odeint

def system(vect, t):
    x, y = vect
    return [x - y - x * (x**2 + 5 * y**2), x + y - y * (x**2 + y**2)]

vect0 = [(-2 + 4*np.random.random(), -2 + 4*np.random.random()) for i in range(5)]
t = np.linspace(0, 100, 1000)

for v in vect0:
    sol = odeint(system, v, t)
    plt.plot(sol[:, 0], sol[:, 1], '->')

plt.show()

结果图如下所示: Phase plot

如图所示,箭头未与连接点的线正确对齐。而且,很多箭头是“出去”的,我希望它们“进来”,因为下一个点总是指向中间的闭合环。此外,情节看起来太混乱,我想画更少的箭头,这样情节会看起来更好。有人知道怎么做吗?提前谢谢。


Tags: importforasnppltrandom箭头方向
1条回答
网友
1楼 · 发布于 2024-04-19 23:36:22

我想一个解决方案是这样的:

enter image description here

使用该代码:

import numpy as np
import matplotlib.pylab as plt
from scipy.integrate import odeint
from scipy.misc import derivative

def system(vect, t):
    x, y = vect
    return [x - y - x * (x**2 + 5 * y**2), x + y - y * (x**2 + y**2)]

vect0 = [(-2 + 4*np.random.random(), -2 + 4*np.random.random()) for i in range(5)]
t = np.linspace(0, 100, 1000)

color=['red','green','blue','yellow', 'magenta']

plot = plt.figure()

for i, v in enumerate(vect0):
    sol = odeint(system, v, t)
    plt.quiver(sol[:-1, 0], sol[:-1, 1], sol[1:, 0]-sol[:-1, 0], sol[1:, 1]-sol[:-1, 1], scale_units='xy', angles='xy', scale=1, color=color[i])    

plt.show(plot)    

[编辑:关于索引的一些解释:

  • 箭袋的定义及其参数可以在这里找到:http://matplotlib.org/api/pyplot_api.html
  • 箭袋的好例子可以在这里找到:https://www.getdatajoy.com/examples/python-plots/vector-fields
  • 箭袋需要向量作为输入,向量由起点和终点定义(起点和终点基本上是存储在sol中的线坐标的点i和i+1)
  • 因此,向量数组的长度将比坐标数组的长度短一个
  • 为了弥补这一点,并提供具有相同长度的阵列,使坐标和矢量机颤动,我们必须使用以下索引:
  • sol[:-1, 0](:-1在第一个索引中删除最后一个坐标)
  • sol[1:, 0](1:在第一个索引中开始删除第一个坐标)
  • sol[1:, 0] - sol[:-1, 0]因此是一种方便的方法来创建两个长度为n-1的向量,并以结果为sol[i+1] - sol[i]的方式减去它们

相关问题 更多 >