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

9
在下面的代码中,我已经找到了解决一组微分方程的方法。我已经在这段代码中绘制了相空间轨迹,并且它可以正常工作。但是,我想重复一下绘图,但是带有箭头以帮助我清楚地展示绘图的含义。 我看到有类似的问题被提出: 在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,并得到了以下结果: 相空间轨迹2

使用的Runge Kutta代码:

  ## module run_kut4
  ''' X,Y = integrate(F,x,y,xStop,h).
  4th-order Runge-Kutta method for solving the
  initial value problem {y}' = {F(x,{y})}, where
  {y} = {y[0],y[1],...y[n-1]}.
  x,y   = initial conditions
  xStop = terminal value of x
  h     = increment of x used in integration
  F     = user-supplied function that returns the
  array F(x,y) = {y'[0],y'[1],...,y'[n-1]}.
  '''
import numpy as np
def integrate(F,x,y,xStop,h):

def run_kut4(F,x,y,h):
    K0 = h*F(x,y)
    K1 = h*F(x + h/2.0, y + K0/2.0)
    K2 = h*F(x + h/2.0, y + K1/2.0)
    K3 = h*F(x + h, y + K2)
    return (K0 + 2.0*K1 + 2.0*K2 + K3)/6.0    

X = []
Y = []
X.append(x)
Y.append(y)
while x < xStop:
    h = min(h,xStop - x)
    y = y + run_kut4(F,x,y,h)
    x = x + h
    X.append(x)
    Y.append(y)
return np.array(X),np.array(Y)

quiver函数的使用方法如下: pylab.quiver(X, Y, U, V) 因此,您可以将您的代码行替换为以下内容: pylab.quiver(Y2[:,0],Y2[:,1], U, V) - Robbie
我之前尝试过,但只是生成了一个奇怪的图形版本(仍然没有箭头)... 我已经将图像编辑到原始帖子中。 - George
请告诉我我的答案是否对您有效。 - user6764549
是的,非常有帮助,谢谢 :) - George
2个回答

2

如果你将步长减少到h=0.1,那么"在Matplotlib中用箭头绘制相空间轨迹"中提供的代码也适用于你的情况。我们可以生成以下图像。 箭头

# 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

我在哪里可以获取run_kut4包?这是您定制的吗? - Vikrant
这是一个自定义的问题,如果您想使用它,我已经编辑了问题以包含它。 - George

0

如果你只是想在图表上叠加箭头图,可以使用y1y2作为XY的位置:

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

quiver

注意:您链接的帖子实际上有箭头跟踪曲线本身,但是在这里,您正在使用linspace上的meshgrid来处理UV,因此我假设您只想要这个箭头网格。

箭头应该指向线条的方向,因此它本质上是一张地图,你可以按照轨迹(在这种情况下是摆锤)进行跟随。 - George

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接