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.
Matplotlib Animation einer Funktion mit zwei Parametern
Ich habe das Beispiel von http://matplotlib.org/1.3.0/examples/an ... _anim.html ein bisschen abgeändert: 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.
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()