我正在尝试制作以下波函数的动画:
由于某种原因,我的代码适用于n = 0,但是不适用于其他n。我检查了各种n,x和t函数的值,它似乎工作正常,但由于某种原因matplotlib没有设置动画。这是代码:
@Override
public void onDestroyView() {
mCompositeDisposable.clear();
super.onDestroyView();
}
答案 0 :(得分:0)
这里是解决方法。将psi
函数重新定义为:
def psi(n, x, t):
A = (np.pi ** -0.25) * (1 / np.sqrt((2 ** n) * gamma(n + 1)))
E = n + 0.5
herms = np.array([hermite(n, xelem) for xelem in x])
f = A * herms * np.exp(-(x ** 2) / 2) * np.cos(E * t)
return f
基本上,hermite
似乎有点古怪/笨拙。如果x
是一个numpy数组,那么hermite(n=0, x)
可以正常工作。但是,如果n>0
是hermite
而不是单个值,则x
会痛苦地抱怨。因此,我们通过每次从x
到hermite
的值中输入一个值,然后根据这些结果制成herms
数组来解决此问题。
量子力学已经有很多年了,所以我无法告诉您hermite
与数组输入的不一致是否有正当的理由。我的猜测是,它只是归因于sympy
中的一个有问题的实现。无论如何,一旦在psi
中修复了这两行,动画似乎就可以正常工作。
答案 1 :(得分:0)
我认为您不想用符号来评估Hermite多项式。相反,为什么不使用numpy.polynomial.hermite.hermval
?也可以使用scipy.special.factorial
计算阶乘。
import numpy as np
from numpy.polynomial.hermite import hermval
from scipy.special import factorial
import matplotlib.pyplot as plt
from matplotlib import animation
def psi(n, x, t):
A = (np.pi ** -0.25) * (1 / np.sqrt((2 ** n) * factorial(n)))
E = n + 0.5
nar = np.zeros(n+1)
nar[-1] = 1
f = A * hermval(x,nar) * np.exp(-(x ** 2) / 2) * np.cos(E * t)
return f
def animar(f, x0=0, xf=1, dx=0.01, t0=0, tf=1, dt=0.01, ym=-2, yM=2):
nf = int((xf - x0) / dx + 1)
nt = int((tf - t0) / dt + 1)
x = np.linspace(x0, xf, nf)
t = np.linspace(t0, tf, nt)
fig, ax = plt.subplots()
ax.set_xlim((x0, xf))
ax.set_ylim((ym, yM))
line, = ax.plot([], [], lw=2)
def init():
line.set_data([], [])
return line,
def animate(i):
y = f(x, i)
line.set_data(x, y)
return line,
anim = animation.FuncAnimation(fig, animate, init_func=init,
frames=5 * t, interval=20, blit=True)
plt.show()
return anim
F = lambda x,t: psi(3, x, t)
anim = animar(F, x0=-3, xf=3, tf=3, ym=-1, yM=1)