Programme

Alle Programme, die in diesem Buch besprochen werden, und die Programme zu den Musterlösungen der Übungsaufgaben können Sie auch als ein zip-Archiv herunterladen.

Download    Programm 4.7 Kinematik/schraubenbahn.py

"""Animation zur Beschleunigung und Bahngeschschwindigkeit bei
einer Bewegung entlang einer Schraubenbahn. """

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.animation
import mpl_toolkits.mplot3d

# Parameter der Simulation.
R = 3.0                  # Radius der Schraubenbahn [m].
T = 8.0                  # Umlaufdauer [s].
dt = 0.05                # Zeitschrittweite [s].
vz = 0.5                 # Geschwindigkeit in z-Richtung [m/s].
N = 5                    # Anzahl der Umläufe.
omega = 2 * np.pi / T    # Winkelgeschwindigkeit [1/s].

# Erzeuge ein Array von Zeitpunkten für N Umläufe.
t = np.arange(0, N * T, dt)

# Erzeuge ein leeres n x 3 - Arrray für die Ortsvektoren.
r = np.empty((t.size, 3))

# Berechne die Position des Massenpunktes für jeden Zeitpunkt.
r[:, 0] = R * np.cos(omega * t)
r[:, 1] = R * np.sin(omega * t)
r[:, 2] = vz * t

# Berechne den Geschwindigkeits- und Beschleunigungsvektor.
v = (r[1:, :] - r[:-1, :]) / dt
a = (v[1:, :] - v[:-1, :]) / dt

# Erzeuge eine Figure und ein Axes-Objekt.
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d',
                     elev=40, azim=45)
ax.set_xlabel('x [m]')
ax.set_ylabel('y [m]')
ax.set_zlabel('z [m]')
ax.grid()


# Definiere einen 3D-Pfeil.
class Arrow3D(mpl.patches.FancyArrowPatch):
    
    def __init__(self, posA, posB, *args, **kwargs):
        super().__init__(posA[0:2], posB[0:2], *args, **kwargs)
        self._pos = np.array([posA, posB])

    def set_positions(self, posA, posB):
        self._pos = np.array([posA, posB])

    def do_3d_projection(self, renderer=None):
        p = mpl_toolkits.mplot3d.proj3d.proj_points(self._pos,
                                                    self.axes.M)
        super().set_positions(*p[:, 0:2])
        return np.min(p[:, 2])


# Plotte die Bahnkurve.
bahn, = ax.plot(r[:, 0], r[:, 1], r[:, 2], linewidth=0.7)

# Erzeuge einen Punkt, der die Position der Masse darstellt.
punkt, = ax.plot([], [], [], 'o', color='red')

# Erzeuge Pfeile für die Geschwindigkeit und die
# Beschleunigung und füge diese der Axes hinzu.
style = mpl.patches.ArrowStyle.Simple(head_length=6,
                                      head_width=3)
arrow_v = Arrow3D((0, 0, 0), (0, 0, 0),
                  color='red', arrowstyle=style)
arrow_a = Arrow3D((0, 0, 0), (0, 0, 0),
                  color='black', arrowstyle=style)
ax.add_patch(arrow_v)
ax.add_patch(arrow_a)


def update(n):
    # Aktualisiere den Geschwindigkeitspfeil.
    if n < v.shape[0]:
        arrow_v.set_positions(r[n], r[n] + v[n])

    # Aktualisiere den Beschleunigungspfeil.
    if n < a.shape[0]:
        arrow_a.set_positions(r[n], r[n] + a[n])

    # Aktualisiere die Position des Punktes.
    punkt.set_data(np.array([r[n, 0]]), np.array([r[n, 1]]))
    punkt.set_3d_properties(np.array([r[n, 2]]))
  
    return punkt, arrow_v, arrow_a


# Erzeuge das Animationsobjekt und starte die Animation.
ani = mpl.animation.FuncAnimation(fig, update, frames=t.size,
                                  interval=30)
plt.show()