绘制时Mathieu特征交叉

时间:2015-01-29 00:38:32

标签: python scipy physics

我需要绘制各种q的mathieu特征参数。情节应该显示'长笛'形状从左边宽,到右边非常狭窄。下面的代码执行此操作,但它还引入了一些带间跳转(从绘制的图中可以明显看出)。我该如何解决这个问题?

谢谢!

AM

import numpy as np
import scipy as sp
import scipy.special as spfun
from matplotlib import pyplot as plt

uplim =120#E_rec
Npts =1000 
Nstates =8 
q = np.linspace(0, uplim/4.0, Npts)
EA = np.zeros([Npts,Nstates])
EB = np.zeros([Npts,Nstates])
U = 4*q 

print np.shape(EA)    #plt.fill_between(U, EA[:,i], EB[:,i]) #plt.plot(U,Ea,U,Eb) 
for i in range(Nstates):
    a = spfun.mathieu_a(i,q)
    b = spfun.mathieu_b(i+1,q)
    EA[:,i] = a + 2*q
    EB[:,i] = b + 2*q 
    plt.fill_between(U, EA[:,i], EB[:,i]) #plt.plot(U,Ea,U,Eb) 

print np.shape(EA)    #plt.fill_between(U, EA[:,i], EB[:,i]) #plt.plot(U,Ea,U,Eb) 
plt.show()

image of problem

编辑正如DSM和pv所指出的那样,这是一个狡猾的错误。当你走得更远时,故障会变得更糟。我最终做的是从Mathematica导出我想要的值表,并将它们导入到python和插值中。不是很好,但有效。

1 个答案:

答案 0 :(得分:0)

我尝试使用NAG Library for Python的最新版本对此进行了计算,其中包括一个新的Mathieu函数例程。 我加倍努力-更多状态和更高的uplim值。

%matplotlib inline
import numpy as np
import scipy as sp
import scipy.special as spfun
from naginterfaces.library import specfun
from matplotlib import pyplot as plt

uplim =150#E_rec
Npts = 4000 
Nstates = 10
q = np.linspace(0, uplim/4.0, Npts)
EA = np.zeros([Npts,Nstates])
EB = np.zeros([Npts,Nstates])
U = 4*q 

plt.figure(figsize=(15,8))
plt.subplot(1,2,1)
plt.title('Using SciPy')

for i in range(Nstates):
    a = spfun.mathieu_a(i,q)
    b = spfun.mathieu_b(i+1,q)
    EA[:,i] = a + 2*q
    EB[:,i] = b + 2*q 
    plt.fill_between(U, EA[:,i], EB[:,i]) #plt.plot(U,Ea,U,Eb) 


plt.subplot(1,2,2)
plt.title('Using NAG')

for i in range(Nstates):
    a = [specfun.mathieu_ang_periodic_real(ordval=i, q=qi, parity=0, mode=3)[2] for qi in q]
    b = [specfun.mathieu_ang_periodic_real(ordval=i+1, q=qi, parity=1, mode=3)[2] for qi in q]
    EA[:,i] = a + 2*q
    EB[:,i] = b + 2*q 
    plt.fill_between(U, EA[:,i], EB[:,i]) 

plt.show()

Mathieu function characteristic

这使用了NAG库的Mark 27和ScipPy的1.2.1版本