2014-10-05 9 views
7

Korzystam z pakietu FuncAnimation, aby utworzyć film z gaszącego falą gaussowską kolidującego z potencjalną barierą przy użyciu metody real-space z różnicą skończoną do rozwiązania równania Schrodingera. Odpowiedni kod znajduje się poniżej. Zasadniczo, kiedy go uruchomię, wszystko działa dobrze - pojawia się film pokazujący dokładnie to, czego chcę. Jednak zmiana argumentu "frames =" nie zmienia faktycznie liczby klatek. Możesz zobaczyć, że drukuję bieżącą iterację w mojej funkcji animacji. Ten licznik idzie do liczby określonej w "frames =", ale potem wraca do zera i kontynuuje. Animacja działa dalej niż określono. Nawet jeśli określę "frames = 1", film będzie trwać w nieskończoność (próbowałem zostawić go uruchomionego na popołudnie). Nie jestem pewna, co się dzieje, ale jestem pewien, że to głupie.FuncAnimation przechodzi obok argumentu klatek

# Set up the matplotlib figure and axes 
fig = plt.figure() 
ax = plt.axes(xlim = (0, hamiltonian.L), ylim = (0, 3)) 
line, = ax.plot([], [], lw = 2) 
time_text = ax.text(.02, .95, '', transform=ax.transAxes) 
ax.grid() 

def init(): 
    """initialize the animation""" 
    line.set_data([], []) 
    time_text.set_text('') 

    return line, time_text 

def animate(i): 
    """actually perform the animation""" 
    print i 
    global hamiltonian, wavepacket 
    hamiltonian.propagate(wavepacket) 
    line.set_data(wavepacket.x, wavepacket.psi_sq) 
    time_text.set_text('time = %.3f' % wavepacket.time_elapsed) 

    return line, time_text 

# Now call the animator 
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=100, interval=1, blit=False) 
#anim.save('gaussian_reflection.mp4', fps=150, extra_args=['-vcodec', 'libx264']) 
plt.show() 

Odpowiedz

8

Domyślnie funkcja animacji pętli wystarczy użyć repeat kwarg:

anim = animation.FuncAnimation(fig, animate, init_func=init, frames=100, interval=1, blit=False, repeat=False) 
+0

rozwiązany, dzięki. –

Powiązane problemy