import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

"""
Explanation: Links zu Dokumentationen/Tutorials für IPython/Python/numpy/matplotlib/git sowie die Sourcodes findet ihr im GitHub Repo.
End of explanation
"""


values = np.loadtxt('values')
alpha = values[:,0]
alpha_dot = values[:,1]

plt.plot(alpha)
plt.ylabel(r'$\alpha(t)$')
plt.xlabel(r'$t$')
plt.grid()

plt.plot(alpha[:100])
plt.ylabel(r'$\alpha(t)$')
plt.xlabel(r'$t$')
plt.grid()

q = alpha
p = alpha_dot
H = - np.cos(q) + p**2 / 2

"""
Explanation: Modellierung mit Newtonschem Gesetz:
Die tangentiale Kraft $F_{tan}(t) = m \; g \; sin(\alpha(t))$ wirkt entgegen der Rückstellkraft des Pendels:
$F_{R}(t) = -F_{tan}(t) = m \; \ddot \alpha(t) \; l$.
Insgesamt ergibt sich als DGL 2. Ordnung:
$- m \; g \; sin(\alpha(t)) = m \; \ddot \alpha(t) \; l$.
Umgeformt auf ein DGL-System 1. Ordnung:
$\begin{eqnarray}
  \dot \alpha(t) &=& x(t) \
  \dot x(t)      &=& - \frac{g}{l} sin(\alpha(t))
\end{eqnarray}$
Modellierung mit Hamiltonschem Prinzip:
Gegeben ist die Energiefunktion: $H(p,q) = -m g l \; cos(q) + \frac{1}{2 m l^{2}} p^{2}$.
Mit den Hamiltonschen Bewegungsgleichungen ergibt sich:
$\begin{eqnarray}
  \dot q &=& \frac{\partial H}{\partial p} &=& p \frac{1}{m l^{2}} \
  \dot p &=& - \frac{\partial H}{\partial q} &=& - m g l \; sin(q)
\end{eqnarray}$
Berechnung
Die Iteration ist mit C++ geschrieben aufgabe3.cpp. Die Werte sind in der Datei values gespeichert.
End of explanation
"""


plt.plot(H)
plt.ylabel(r'$H(p(t),q(t))$')
plt.xlabel(r'$t$')
plt.axis([0,10000, -1, 0])
plt.grid()

plt.plot(q, p)
plt.ylabel(r'$p(t)$')
plt.xlabel(r'$q(t)$')
plt.grid()

"""
Explanation: $H(q(t), p(t))$ ist konstant, weil die Energieerhaltung gelten muss: $\frac{d}{dt} H(p(t),q(t)) = 0$
End of explanation
"""


