【问题标题】:Python- Plotting phase space trajectories (quiver function)Python-绘制相空间轨迹(颤动函数)
【发布时间】:2020-01-07 10:34:09
【问题描述】:

在下面的代码中,我找到了微分方程组的解。我已经在这段代码中绘制了相空间轨迹,它工作正常。然而,我想重复这个情节,但用箭头来帮助我清楚地展示情节的含义。 我看到有人问过类似的问题: Drawing phase space trajectories with arrows in matplotlib 因此在下面的代码中,我尝试根据我的情况复制它。 (我会在该线程上发布这个问题,但它不允许我这样做)

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

显然我在某些时候误解了 quiver 函数(因为绘图应该看起来相同(只是第二个应该有箭头)这显然不是这种情况,我也看到改变我的 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,结果如下:

使用的 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)
  • 我之前尝试过,它只是制作了一个奇怪的情节版本(仍然没有箭头)......我已将图像编辑到原始帖子中
  • 如果我的回答对你有用,请告诉我。
  • 是的,这很有帮助,谢谢 :)

标签: python matplotlib plot


【解决方案1】:

如果您减小步长h=0.1"Drawing phase space trajectories in Matplotlib with 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],'-&gt;')。这给出了一个像

【讨论】:

  • 在哪里可以获得 run_kut4 包?是你定制的吗?
  • 这是一个自定义的,如果您想使用它,我已经编辑了问题以包含它
【解决方案2】:

如果您只是想在情节上覆盖箭袋,请在 XY 位置使用 y1y2

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

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

【讨论】:

  • 箭头指向线条的方向,所以它本质上是一张地图,你可以跟随轨迹(在本例中为钟摆)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-05
  • 1970-01-01
  • 2013-04-09
  • 2021-12-28
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多