From 2be5a93cadb406ebe4b63c44b4842d31ea8c244d Mon Sep 17 00:00:00 2001 From: Jonas Hahn Date: Thu, 24 Apr 2025 17:29:55 +0200 Subject: [PATCH] added simple --- S2/AnaMech/AM_EX5.py | 127 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 S2/AnaMech/AM_EX5.py diff --git a/S2/AnaMech/AM_EX5.py b/S2/AnaMech/AM_EX5.py new file mode 100644 index 0000000..42b4df3 --- /dev/null +++ b/S2/AnaMech/AM_EX5.py @@ -0,0 +1,127 @@ +# # Numerische Berechnung der Trajektorien des harmonischen Oszillators + +# Die Bewegung eines (gedämpften) harmonischen Oszillators wird durch die DGL zweiter Ordnung +# \begin{equation} +# \frac{d^2 x(t)}{dt^2} + 2 \gamma \frac{d x(t)}{dt} + \omega^2 x(t) = 0\tag{1} +# \end{equation} +# beschrieben. +# Um die DGL numerisch zu lösen, überführen wir sie zunächst in ein System gekoppelter DGLs erster Ordnung: +# \begin{align} +# \frac{d x}{dt} &= f\tag{2}\\ +# \frac{d v}{dt} &= g,\tag{3} +# \end{align} +# wobei $v(t) = \dot{x}(t)$ die Geschwindigkeit ist. +# Ihre erste Aufgabe ist es, diese zwei DGL zu vervollständigen (d.h. $f$ und $g$ sind zu bestimmen). +# +# Im folgenden sollen die DGLs numerisch mithilfe des Eulerverfahrens gelöst werden. +# Dazu werden die Ableitungen wie folgt diskretisiert, wobei $\Delta t$ der Wert des Zeitschritts ist, den Sie in der Simulation nutzen: +# \begin{align} +# \frac{d x}{dt} &\approx \frac{x(t+\Delta t) - x(t)}{\Delta t} \tag{4}\\ +# \frac{d v}{dt} &\approx \frac{v(t+\Delta t) - v(t)}{\Delta t}\,.\tag{5} +# \end{align} +# +# Setzt man diese Näherungen der Ableitungen in (2) bzw. (3) ein, erhält man eine Approximation für die Änderung von $x$ bzw. $v$ im aktuellen Zeitschritt durch die Beziehungen +# \begin{align} +# x(t+\Delta t) =&\ x(t) + \Delta t \, f\tag{6}\\ +# v(t+\Delta t) =&\ v(t) + \Delta t \, g\tag{7} \, . +# \end{align} +# Sie können den Code gleich für den allgemeinen Fall implementieren. +# Führen Sie aber, wie im Aufgabentext erläutert, zunächst im a)-Teil die erforderlichen Simulationen für den ungedämpften harmonischen Oszillator ($\gamma = 0$) durch, danach im b)-Teil mit dem angegebenen Wert für $\gamma$.\\ +# Berechnen und plotten Sie im Verlauf der Simulationen auch die Gesamtenergie als Funktion der Zeit, $E(t) = T(t) + V(t)$, wobei $T(t)$ die Zeitentwicklung der kinetischen Energie und $V(t)$ die potenzielle Energie als Funktion der Zeit ist. +# (Sie können annehmen, dass die Masse des Oszillators $m=1$ ist.) + +# In[ ]: + + +# Hilfreiche Pakete +import numpy as np +import matplotlib.pyplot as plt +import math + +# Konstanten +from scipy.constants import g + +# Sinnvolle Konstanten +x0 = 1 +v0 = 0 +omega0 = 1 +gamma = 0 +dt = 1e-2 # Kleiner Zeitschritt +tmax = 20 # Max time for the algorithm to terminate + +# Initial values +x_t = [x0] +x_t_exact = [x0] +v_t = [v0] +v_t_exact = [v0] +T_t = [0.5*v0*v0] +V_t = [0.5*omega0*omega0*x0*x0] +E_t = [T_t+V_t] + +# exakter Wert der Energie: +E_exact = E_t[0] +Ediff_t = [0] + +# Implementation of the Euler-Algorithm +for _ in range(int(tmax // dt)): + f = ??? + x = x_t[-1] + f * dt # Calc new position + v = ??? # calc new velocity + x_t.append(x) + v_t.append(v) + + x_exact = ??? + v_exact = ??? + x_t_exact.append(x_exact) + v_t_exact.append(v_exact) + + T = ??? + V = k/2 * x^2 * + E = T + V + T_t.append(T) + V_t.append(V) + E_t.append(E) + Ediff_t.append(E-E_exact) + + + +# TIPP: Zum erstellen mehrerer Plots auf einmal, siehe z.B.: +# https://matplotlib.org/3.1.1/gallery/subplots_axes_and_figures/subplot.html + +kwargs = {'c':'b'} +font_kwargs = {'fontsize':14} +times = np.arange(0,len(x_t))*dt +abs_max = max(x_t, key=abs) + +fig,ax = plt.subplots(1,4,figsize=(10,5)) + +#actual plots +ax[0].plot(times,x_t,**kwargs) +ax[1].plot(x_t,v_t,**kwargs) +ax[2].plot(times,T_t,label = "T") +ax[2].plot(times,V_t,label = "V") +ax[2].plot(times,E_t,label = "E = T+V") +ax[3].plot(times,Ediff_t,label = "Fehler in der Energie") + +#style changes +ax[0].set_xlim(0,len(x_t)*dt) +ax[0].set_ylim(-abs_max,abs_max) +ax[0].set_xlabel("t",**font_kwargs) +ax[0].set_ylabel("$x(t)$",**font_kwargs) + +ax[1].set_xlabel("$x(t)$",**font_kwargs) +ax[1].set_ylabel("$v(t)$",**font_kwargs) + +ax[2].set_xlim(0,len(x_t)*dt) +ax[2].set_ylim(-abs_max,abs_max) +ax[2].set_xlabel("t",**font_kwargs) +ax[2].set_ylabel("Energies",**font_kwargs) + +ax[2].set_xlim(0,len(x_t)*dt) +ax[2].set_ylim(-abs_max,abs_max) +ax[2].set_xlabel("t",**font_kwargs) +ax[2].set_ylabel("Differenz",**font_kwargs) + +plt.legend() +plt.show() +