mirror of
https://gitlab.gwdg.de/j.hahn02/university.git
synced 2026-01-01 06:44:25 -05:00
added simple
This commit is contained in:
127
S2/AnaMech/AM_EX5.py
Normal file
127
S2/AnaMech/AM_EX5.py
Normal file
@@ -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()
|
||||||
|
|
||||||
Reference in New Issue
Block a user