Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
talit:python_advanced_problems [2025-08-11 09:06] – [Aufgaben A] scatalit: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 =====
  
-Zeit1 Woche+   * [[pham_physik_sca:python|NumPy, MatPlotLib, Jupyter, Widgets usw. für PHAM]]
  
-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,x): # contains right side of DGL y'(x) = ...
     k = 0.4     k = 0.4
     y_prime = - k * y     y_prime = - k * y
     return y_prime     return y_prime
  
-= np.linspace(0,20,100)+= np.linspace(0,20,100)
  
 y0 = 15 y0 = 15
  
-= odeint(dgl,y0,X)+= odeint(dgl,y0,x)
  
-plt.plot(X,Y)+plt.plot(x,y)
 </code> </code>
  
Zeile 88: Zeile 89:
 === Aufgabe A0 === === Aufgabe A0 ===
  
-Erstelle auf GitHub ein Repo für diesen Kurs, z.B. `advanced_python_problems`, klone es auf deinen Computer und gib es der LP frei.+   1. Erstelle auf GitHub ein Repo für diesen Kurs, z.B. `advanced_python_problems`, klone es auf deinen Computer und gib es der LP frei. 
 +   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 A1: Beispiel oben === === Aufgabe A1: Beispiel oben ===
  
Zeile 109: 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:python|Slider]] ein, mit dem man den Wert von $k$ einstellen kann.
  
  
Zeile 134: Zeile 138:
    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**, welche **Differentialgleichungen (DGL)** sind.
 +
 +==== 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'(t)$$
 +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''(t)$$
 +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, will die Kraft sie wieder auseinander ziehen.
 +
 +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''(t) = - k x(t)$$
 +
 +$$x''(t) = - \frac{k}{m} x(t)$$
 +
 +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'sches Gesetz), so erhält man die Position der Feder als Funktion der Zeit $x(t)$. Hier gibt es wieder unendlich viele Möglichkeiten. Da die neue DGL eine *zweite Ableitung beinhaltet*, muss man nun **zwei Randbedingungen** angeben - eine für $x(t)$ und eine für deren Ableitung $x'(t)$, z.B.:
 +
 +$$x(0) = x_0$$
 +
 +$$x'(0) = 0$$
 +
 +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*, das Federpendel schwingt also unendlich lange.
 +
 +== 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''(t) = - \frac{k}{m} x(t)$$
 +
 +betrachten wir
 +
 +$$x'(t) = v(t)$$
 +
 +$$v'(t) = - \frac{k}{m} x(t)$$
 +
 +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,t,k,m):
 +    x = x_v[0]
 +    v = x_v[1] 
 +    return [v, -k/m * x]
 +</code>
 +
 +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, desto grösser der Luftwiderstand. Wir führen deshalb einen Reibungsterm ein, der *linear* ist in der 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''(t) = - \frac{k}{m} x(t)$ wie ein Federpendel ohne Reibung, in dem du die DGL mit odeint löst.
 +   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, der linear von der Geschwindigkeit abhängt.
 +   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,param1,param2,...)`
 +   * definiere Funktion `update_plot(param1,param2,...)`, die Lösung der DGL und Darstellung der Lösung enthält
 +   * `param1` usw. sind die Parameter, die mit Widgets (z.B. Slider) eingestellt werden
  
  • talit/python_advanced_problems.1754903188.txt.gz
  • Zuletzt geändert: 2025-08-11 09:06
  • von sca