Matplotlib不会为功能设置动画

时间:2018-11-10 23:59:27

标签: numpy animation matplotlib scipy physics

我正在尝试制作以下波函数的动画:

Wavefunction

由于某种原因,我的代码适用于n = 0,但是不适用于其他n。我检查了各种n,x和t函数的值,它似乎工作正常,但由于某种原因matplotlib没有设置动画。这是代码:

@Override
public void onDestroyView() {
    mCompositeDisposable.clear();
    super.onDestroyView();
}

2 个答案:

答案 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>0hermite而不是单个值,则x会痛苦地抱怨。因此,我们通过每次从xhermite的值中输入一个值,然后根据这些结果制成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)