Matplotlib Animation einer Funktion mit zwei Parametern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
theCed7
User
Beiträge: 6
Registriert: Samstag 19. Juli 2014, 15:42

Hi,

ich beschäftige mich gerade ein wenig mit Matplotlib und dessen Animations-API, muss aber leider zugeben, dass ich die Thematik als nicht besonders einsteigerfreundlich empfinde. :/

Wie auch immer, ich möchte eine Welle realisieren, die von einem harmonisch schwingenden Erreger ausgeht und sich dann langsam in eine Richtung ausbreitet. Die Formel die mir dafür vorschwebt wäre: s(t,x)=s_dach * sin(2pi*f*(t-(x/c))) (schöner https://www.writelatex.com/read/ttddfhwjschw)
Damit wird beschrieben, wo sich jeder Punkt x der Welle zu jedem Zeitpunkt t befindet. f wäre die Frequenz, c die Wellengeschwindigkeit, s_dach die Amplitude; alles gegeben.

Das Script soll dann für jedes x (x = np.linspace(0, 2 np.pi, 256)) berechnen, wie es sich zu einem aktuellen Zeitpunt verhält, also ob es gerade maximal Auslenkt, oder die Nullage durchquert, oder etwas dazwischen. Wenn man dann die Zeit "laufen lässt" sollte sich theoretisch eine Welle fortbewegen.

Ich würde den Ansatz aus dem ersten Skript übernehmen, sofern möglich (weiter Anpassungen würden dann später folgen, geht ersteinmal um das Grundgerüst). Allerdings weiß ich nicht so recht, wie ich meinen zweiten Parameter unterbringen soll.

Vorraus schon mal: Ich kenne mich nicht sonderlich mit Matplotlib aus. Aber frei nach dem learing-by-doing Prinzip suche ich mir gerne eine Anwendung, um neue Dinge auszuprobieren. Ich hoffe ihr habt ein wenig Verständnis. :)
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Ich habe das Beispiel von http://matplotlib.org/1.3.0/examples/an ... _anim.html ein bisschen abgeändert:

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

s_dach = 1.
c = 1.
f = 1.
t_n = 200
x = np.linspace(0, 2*np.pi, 1000)  

def welle(x,t):
    return s_dach * np.sin(2*np.pi*f*(t-(x/c)))

fig, ax = plt.subplots()      
line, = ax.plot(x, welle(x,0))
plt.xlim(0,2*np.pi)

def animate(i):
    line.set_ydata(welle(x,i/(f*t_n)))  
    return line,

def init():
    line.set_ydata(np.ones((x.size,))*np.NaN)
    return line,

ani = animation.FuncAnimation(fig, animate, np.arange(1, t_n), 
                              init_func=init, 
                              interval=25, blit=True)
plt.show()
Die Init Funktion dient dazu, dass der Plot schon mal erstellt wird, bevor die Animation anfängt. Dieser Init-Plot wird aber nicht überschrieben, deshalb mache ich dort einen leeren Plot. In der Vorlage wird dazu ein MaskedArray genommen, d.h. ein Array in dem alle Werte maskiert sind. Ich finde es beim Arbeiten mit Matplotlib (und generell mit Numpy) aber einfacher dafür NaN (Not a Number) Werte zu nehmen.
a fool with a tool is still a fool, www.magben.de, YouTube
Antworten