Python-绘制相空间轨迹(箭袋函数)

时间:2017-12-10 15:54:15

标签: python matplotlib plot

在下面的代码中,我找到了微分方程组的解决方案。我已在此代码中绘制了相空间轨迹,并且工作正常。但是,我想重复一下情节,但用箭头帮我清楚地表明情节意味着什么。 我看到有人问过类似的问题: Drawing phase space trajectories with arrows in matplotlib 因此,在下面的代码中,我试图根据我的情况复制它。 (我会在这个帖子上发布这个问题,但它不允许我这样做)

当我运行代码时,我得到的图像如下:

Phase space trajectories

显然我在某些时候误解了箭袋功能(因为情节应该看起来相同(只是第二个应该有箭头)这显然不是这样,我也看到改变了我的linspace中的点数彻底改变了第二个情节。)

我的代码如下:

# Import the required modules
import numpy as np
from run_kut4 import *
from printSoln import *
import pylab

def G2(x,y):
    G2=np.zeros(2)
    G2[0]=y[1]
    G2[1]=-np.sin(y[0])+0.02*np.cos(y[0])*np.sin(x)
    return G2
x2=0.0
xstop2=40.0
y2=np.array([0.0,0.0]) 
h2=0.005#step size
#freq=1

X2,Y2=integrate(G2,x2,y2,xstop2,h2)

pylab.plot(Y2[:,0],Y2[:,1])
pylab.xlabel('θ')
pylab.ylabel('dθ/dx')
pylab.title('Phase space trajectory (resonant case)')
pylab.show()

y1=np.linspace(-0.4,0.4,100)
y2=np.linspace(-0.4,0.4,100)
U,V=np.meshgrid(y1,y2)

pylab.quiver(U,V,Y2[:,0],Y2[:,1])
pylab.xlabel('θ')
pylab.ylabel('dθ/dx')
pylab.title('Phase space trajectory (resonant case)')
pylab.show()

我只是想知道是否有人能看到我出错的地方,任何帮助都表示赞赏。谢谢:))

我试图按照建议的语法切换U和V,并得到了这个: Phase space traj 2

2 个答案:

答案 0 :(得分:1)

如果您缩小步长h=0.1"Drawing phase space trajectories in Matplotlib with arrows"中给出的代码也适用于您的情况。我们可以生成下图。 Arrows

# Import the required modules
import numpy as np
from run_kut4 import *
import pylab

def G2(x,y):
    G2=np.zeros(2)
    G2[0]=y[1]
    G2[1]=-np.sin(y[0])+0.02*np.cos(y[0])*np.sin(x)
    return G2
x2=0.0
xstop2=40.0
y2=np.array([0.0,0.0])
h2=0.1#step size
#freq=1

X2,Y2=integrate(G2,x2,y2,xstop2,h2)

#pylab.plot(Y2[:,0],Y2[:,1])
pylab.xlabel('θ')
pylab.ylabel('dθ/dx')
pylab.title('Phase space trajectory (resonant case)')
pylab.show()

pylab.quiver(Y2[:-1,0], Y2[:-1,1], Y2[1:,0]-Y2[:-1,0], Y2[1:,1]-Y2[:-1, 1])
pylab.xlabel('θ')
pylab.ylabel('dθ/dx')
pylab.title('Phase space trajectory (resonant case)')
pylab.show()

如果你不喜欢上一个情节,你可以完全跳过quiver情节,只需将情节命令改为pylab.plot(Y2[:,0],Y2[:,1],'->')即可。这给出了一个类似的情节 Arrows2

答案 1 :(得分:0)

如果您只想在地块上叠加箭袋,请在y1y2位置使用XY

plt.quiver(y1, y2, U, V, alpha=.3)

quiver

注意:您链接到的帖子实际上有箭头跟踪曲线本身,但您在这里meshgridlinspace使用U而不是V,所以我假设你只想要这个箭头网格。