Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
talit:python_advanced_problems [2025-08-11 09:00] – sca | talit:python_advanced_problems [2025-08-11 14:45] (aktuell) – sca | ||
---|---|---|---|
Zeile 6: | Zeile 6: | ||
* Mit **Jupyter-Notebooks** arbeiten | * Mit **Jupyter-Notebooks** arbeiten | ||
- | ===== - Einfache Differentialgleichungen (DGL) ===== | + | ===== Nützliche Links ===== |
- | Zeit: 1 Woche | + | * [[pham_physik_sca:python|NumPy, |
- | Erstelle ein Jupyter-NB mit Namen `01_einfache_dgl.ipynb` im entsprechenden Repo. | + | ===== - Einfache Differentialgleichungen (DGL) ===== |
+ | Zeit: 1 Woche | ||
==== Einführung ==== | ==== Einführung ==== | ||
Zeile 61: | Zeile 62: | ||
import matplotlib.pyplot as plt | import matplotlib.pyplot as plt | ||
- | def dgl(y,x): | + | def dgl(y, |
k = 0.4 | k = 0.4 | ||
y_prime = - k * y | y_prime = - k * y | ||
return y_prime | return y_prime | ||
- | X = np.linspace(0, | + | x = np.linspace(0, |
y0 = 15 | y0 = 15 | ||
- | Y = odeint(dgl, | + | y = odeint(dgl, |
- | plt.plot(X,Y) | + | plt.plot(x,y) |
</ | </ | ||
Zeile 84: | Zeile 85: | ||
- | ==== Aufgaben | + | ==== Aufgaben |
+ | |||
+ | === Aufgabe A0 === | ||
+ | |||
+ | 1. Erstelle auf GitHub ein Repo für diesen Kurs, z.B. `advanced_python_problems`, | ||
+ | 1. Erstelle ein File mit Namen `01_einfache_dgl.ipynb` im entsprechenden Repo. | ||
+ | 1. Richte Jupyter Notebooks in VSCode ein (falls noch nicht gemacht) | ||
- | === Aufgabe | + | === Aufgabe |
== Part I == | == Part I == | ||
Zeile 106: | Zeile 113: | ||
== Part III == | == Part III == | ||
- | Mache eine Kopie des Codes und füge einen Slider ein, mit dem man den Wert von $k$ einstellen kann. | + | Mache eine Kopie des Codes und füge einen [[pham_physik_sca: |
- | === Aufgabe | + | === Aufgabe |
1. Löse die Differentialgleichung $$f' | 1. Löse die Differentialgleichung $$f' | ||
Zeile 115: | Zeile 122: | ||
1. Um was für eine Funktion handelt es sich bei $f(x)$? | 1. Um was für eine Funktion handelt es sich bei $f(x)$? | ||
- | === Aufgabe | + | === Aufgabe |
1. Löse die DGL vom Theorieteil am Anfang des Kapitels: $$f' | 1. Löse die DGL vom Theorieteil am Anfang des Kapitels: $$f' | ||
1. Stelle die Lösung graphisch dar und vergleiche sie mit der exakten Lösung $f(x) = k x^2$. | 1. Stelle die Lösung graphisch dar und vergleiche sie mit der exakten Lösung $f(x) = k x^2$. | ||
- | === Aufgabe | + | === Aufgabe |
- | Finde heraus, wie du die Darstellung deiner Figur verändern kannst, z.B.: | + | Gehe zurück zum Plot der letzten Aufgabe und verschönere diese, z.B.: |
1. Grösse der Figur | 1. Grösse der Figur | ||
Zeile 130: | Zeile 137: | ||
1. Beschriftungen: | 1. Beschriftungen: | ||
1. ... | 1. ... | ||
+ | |||
+ | |||
+ | |||
+ | ===== - Bewegungsgleichungen ===== | ||
+ | |||
+ | Zeit: 1 Woche | ||
+ | |||
+ | In der Physik beschreibt man die Bewegungen von Objekten (Beispiele: Stein fällt nach unten, Masse an Feder die oszilliert, ...) durch sogenannte **Bewegungsgleichungen**, | ||
+ | |||
+ | ==== Theorie ==== | ||
+ | |||
+ | === Position, Geschwindigkeit & Beschleunigung === | ||
+ | |||
+ | Dabei ist es wichtig zu wissen, wie Position, Geschwindigkeit und Beschleunigung zusammenhängen: | ||
+ | |||
+ | Sei $x(t)$ die **Position** eines Objekts als Funktion der Zeit. Die **Geschwindigkeit** des Objekts zu jedem Zeitpunkt ist dann gegeben durch die *Ableitung der Position*: | ||
+ | $$v(t) = x' | ||
+ | Die Geschwindigkeit gibt also an, wie fest sich *die Position mit der Zeit verändert*. Ganz analog ist die **Beschleunigung** die *Änderung der Geschwindigkeit* und ist deshalb gegeben durch | ||
+ | $$a(t) = v'(t) = x'' | ||
+ | Die Beschleunigung ist also die *zweite Ableitung* der Position. | ||
+ | |||
+ | == Harmonischer Oszillator == | ||
+ | |||
+ | Aus dem Physikunterricht kennst du sicher das **Hookesche Gesetz**: | ||
+ | $$ | ||
+ | F = - k x | ||
+ | $$ | ||
+ | Es beschreibt die Bewegung eines **Federpendels ohne Reibung**. Das Hookesche Gesetz gibt uns die Federkraft $F$ eines Federpendels an. Es besagt, dass die Federkraft gegeben ist durch minus die Federkonstante $k$ mal die Auslenkung der Feder aus ihrer Gleichgewichtsposition. Das Minus sagt, dass die Kraft immer *gegen* der Auslenkung wirkt: Ist die Feder gedehnt, so will die Kraft die Feder zusammendrücken. Ist sie aber zusammengedrückt, | ||
+ | |||
+ | Das Hookesche Gesetz können wir nun als *Differentialgleichung* schreiben. Die Beschleunigung der Feder $a$ und die Federkraft $F$ hängen über das **zweite Newtonsche Gesetz** zusammen: $F = m a$, wobei $m$ die Masse des Objekts ist, welches an der Feder befestigt ist. Damit können wir das Hookesche Gesetz wie folgt umschreiben: | ||
+ | |||
+ | $$F = - k x$$ | ||
+ | |||
+ | $$m a = - k x$$ | ||
+ | |||
+ | $$m x'' | ||
+ | |||
+ | $$x'' | ||
+ | |||
+ | Wir haben nun also wieder eine Differenzialgleichung. Im Gegensatz zu den DGL von der letzten Übung enthält diese aber eine *zweite Ableitung*. Zur Erinnerung: Die DGL von der letzten Übung, welche erste Ableitungen beinhaltet haben, hatten immer *unendlich* viele Lösungen. Wir mussten deshalb *eine Randbedingung* festlegen. | ||
+ | |||
+ | Löst man nun die neue DGL (Hook' | ||
+ | |||
+ | $$x(0) = x_0$$ | ||
+ | |||
+ | $$x' | ||
+ | |||
+ | Man muss also einen Zeitpunkt (typischerweise den Anfang) wählen und sagen *wo* und *wie schnell* das Federpendel dann ist. Wir legen also fest, dass die Feder zum anfänglichen Zeitpunkt $t=0$ an der Position $x_0$ ist und die Geschwindigkeit dann $=0$ ist. Dies macht Sinn, wenn man von Hand eine Feder spannt und zum Zeitpunkt $t=0$ los lässt. | ||
+ | |||
+ | Diese Differentialgleichung kann man analytisch, also exakt, lösen. Mit den obigen Randbedingungen erhält man | ||
+ | |||
+ | $$x(t) = x_0 \cos\left(\sqrt{\frac{k}{m}} \cdot t\right)$$ | ||
+ | |||
+ | Ein System, welches so schwingt, nennt man einen **harmonischen Oszillator** und seine Bewegung eine **harmonische Bewegung**. Diese Bewegung ist *ungedämpft*, | ||
+ | |||
+ | == DGL mit 2. Ableitungen lösen == | ||
+ | |||
+ | Die DGL für den Harmonischen Oszillator enthält eine zweite Ableitung. Wie können wir solche mit **odeint** lösen? | ||
+ | Der Trick ist folgender: | ||
+ | Wandle die eine DGL mit einer zweiten Ableitung um in **zwei DGL mit nur ersten Ableitungen**: | ||
+ | |||
+ | Anstelle von | ||
+ | |||
+ | $$x'' | ||
+ | |||
+ | betrachten wir | ||
+ | |||
+ | $$x' | ||
+ | |||
+ | $$v' | ||
+ | |||
+ | Nun können wir diese beiden DGL zusammen mit odeint lösen. Die Funktion, die odeint übergeben wird, sieht dann wie folgt aus: | ||
+ | |||
+ | <code python> | ||
+ | def harmonic(x_v, | ||
+ | x = x_v[0] | ||
+ | v = x_v[1] | ||
+ | return [v, -k/m * x] | ||
+ | </ | ||
+ | |||
+ | Beachte, dass *x_v* eine Liste ist. Das erste Element beinhaltet die Position $x$, das zweite die Geschwindigkeit $v$ (also die Ableitung von $x$). | ||
+ | |||
+ | == Gedämpfter harmonischer Oszillator == | ||
+ | |||
+ | Der harmonische Oszillator ist gut und schön, in Realität tritt aber meist Reibung auf, welche die Bewegung dämpft. Die Amplitude (Auslenkung) eines Federpendels nimmt aufgrund von Reibungskräften wie Luftwiderstand kontinuierlich ab. | ||
+ | |||
+ | Wir können in unserer DGL nun Reibung ganz einfach einbauen, in dem wir einen entsprechende **Kraftterm in unsere DGL einbauen**. | ||
+ | Zum Beispiel hängt der Luftwiderstand von der Geschwindigkeit ab: Je höher die Geschwindigkeit, | ||
+ | $$F = - k x - c v$$ | ||
+ | Dabei ist $c$ eine Konstante, die uns angibt, wie stark der Luftwiderstand ist. | ||
+ | |||
+ | ==== Aufgaben B ==== | ||
+ | |||
+ | Erstelle ein Jupyter-NB mit Namen `02_bewegungsgleichungen.ipynb` im entsprechenden Repo. | ||
+ | |||
+ | === Aufgabe B1: Harmonischer Oszillator === | ||
+ | |||
+ | 1. Beweise, dass $x(t) = x\_0 \cos\left(\sqrt{\frac{k}{m}} \cdot t\right)$ eine Lösung des harmonischen Oszillators ist: Setze einfach in die DGL ein und zeige, dass links und rechts das Gleiche herauskommt. | ||
+ | 2. Simuliere nun einen harmonischen Oszillator $x'' | ||
+ | 3. Stelle die Lösungsfunktion $x(t)$ dann mit matplotlib schön graphisch dar. | ||
+ | 4. Vergleiche nun deine numerische Lösung mit der analytischen Lösung $x(t) = x_0 \cos\left(\sqrt{\frac{k}{m}} \cdot t\right)$ und stelle sicher, dass diese übereinstimmen. | ||
+ | |||
+ | === Aufgabe B2: Gedämpfter harmonischer Oszillator === | ||
+ | |||
+ | 1. Simuliere nun den gedämpften harmonischen Oszillator mit einem Reibungsterm, | ||
+ | 1. Füge nun Slider (widgets) hinzu, mit denen du die Werte für die Konstanten $k,m,c$, die Anfangsposition $x_0$, sowie die Zeit-Range einstellen kannst. Sobald ein Slider geändert wurde, soll der Graph entsprechend angepasst werden. Siehe Tipps unten. | ||
+ | |||
+ | Tipps für Widgets: | ||
+ | * Verwende `widgets.interactive(update_plot, | ||
+ | * definiere Funktion `update_plot(param1, | ||
+ | * `param1` usw. sind die Parameter, die mit Widgets (z.B. Slider) eingestellt werden | ||