Diese Seite bezieht sich auf die erste Auflage (2020) des Buches.   ➜   Zur aktuellen Auflage.

Aufgaben

Lösung zu Aufgabe 6.4

Wir betrachten zunächst den freien Fall aus 100 m Höhe. Das Ergebnis des Programms ist unten dargestellt. Bitte beachten Sie, dass die x- und y-Koordinaten in mm angegeben sind, während die z-Koordinate in m dargestellt ist.

Der Grafik entnimmt man, dass der Körper um etwas mehr als 14 mm in x-Richtung, also nach Osten abgelenkt wird. Gleichzeitig wird der Körper in die negative y-Richtung, also nach Süden, um knapp 2 µm abgelenkt.

Die folgende Grafik zeigt den analogen Fall, bei dem der Gegenstand senkrecht nach oben geschossen wird, sodass er eine maximale Flughöhe von 100 m erreicht, bevor er wieder nach unten fällt. Besonders interessant ist, dass die Auslenkung nun in die negative x-Richtung, also nach Westen erfolgt und darüber hinaus mit 57 mm wesentlich größer ausfällt als im ersten Fall.

Diesen Effekt kann man wie folgt verstehen: Bei dem Wurf nach oben wirkt die Coriolisbeschleunigung von Anfang an mit dem maximalen Betrag nach Westen. Erst am oberen Umkehrpunkt beginnt die Coriolisbeschleunigung nach Osten zu wirken. Zu diesem Zeitpunkt ist die Geschwindigkeit in West-Richtung aber maximal und erst beim Auftreffen auf dem Erdboden hat die Coriolisbeschleunigung in Ost-Richtung die Geschwindigkeit in Ost-West-Richtung wieder auf Null verringert. Der Körper bewegt sich also sowohl während des Aufstiegs als auch während des Falls nach Westen.

Beide Programme können Sie sich unten ansehen und herunterladen. Bei dem senkrechten Wurf nach oben muss man mit aufprall.diretion = -1 der Ereignisfunktion ein zusätzliches Attribut hinzufügen. Dies bewirkt, dass das Ereignis nur ausgelöst wird, wenn die z-Koordinaten die Null in negativer Richtung durchläuft. Andernfalls bricht der Differentialgleichungslöser sofort ab, weil die Masse sich ja bereits am Anfang bei z=0 befindet.

Download    Dynamik/Loesungen/freier_fall_coriolis.py

"""Simulation eines freien Falls mit Berücksichtigung der
Corioliskraft. """

import math
import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate
import scipy.interpolate

# Erdbeschleunigung [m/s²].
g = 9.81

# Anfangsort [m].
r0 = np.array([0, 0, 100.0])

# Berechne den Vektor der Anfangsgeschwindigkeit [m/s].
v0 = np.array([0.0, 0.0, 0.0])

# Breitengrad [rad].
theta = math.radians(49.4)

# Vektor der Winkelgeschwindigkeit [rad/s].
omega = 7.292e-5 * np.array([0, math.cos(theta), math.sin(theta)])


def dgl(t, u):
    r, v = np.split(u, 2)

    # Schwerebescheleunigung.
    a_g = g * np.array([0, 0, -1])

    # Coriolisbeschleunigung.
    a_c = - 2 * np.cross(omega, v)

    # Summe aus Schwere- und Coriolisbeschleunigung.
    a = a_g + a_c
    return np.concatenate([v, a])


def aufprall(t, u):
    """Ereignisfunktion: Liefert einen Vorzeichenwechsel beim
    Auftreffen auf dem Erdboden (z=0). """
    r, v = np.split(u, 2)
    return r[2]


# Beende die Simulation soll beim Auftreten des Ereignisses.
aufprall.terminal = True

# Lege den Zustandsvektor zum Zeitpunkt t=0 fest.
u0 = np.concatenate((r0, v0))

# Löse die Bewegungsgleichung bis zum Auftreffen auf der Erde.
result = scipy.integrate.solve_ivp(dgl, [0, np.inf], u0,
                                   events=aufprall,
                                   dense_output=True)

# Berechne die Interpolation auf einem feinen Raster.
t = np.linspace(0, np.max(result.t), 1000)
r, v = np.split(result.sol(t), 2)

# Erzeuge eine Figure.
fig = plt.figure(figsize=(9, 3))
fig.set_tight_layout(True)

# Plotte die Bahnkurve in der Seitenansicht.
ax1 = fig.add_subplot(1, 3, 1)
ax1.set_xlabel('t [s]')
ax1.set_ylabel('x [mm]')
ax1.grid()
ax1.plot(t, 1e3 * r[0], '-b')

# Plotte die Bahkurve in der Aufsicht.
ax2 = fig.add_subplot(1, 3, 2)
ax2.set_xlabel('t [s]')
ax2.set_ylabel('y [mm]')
ax2.grid()
ax2.plot(t, 1e3 * r[1], '-b')

# Plotte die Bahkurve in der Aufsicht.
ax3 = fig.add_subplot(1, 3, 3)
ax3.set_xlabel('t [s]')
ax3.set_ylabel('z [m]')
ax3.grid()
ax3.plot(t, r[2], '-b')

# Zeige die Grafik an.
plt.show()

Download    Dynamik/Loesungen/senkrechter_wurf_coriolis.py

"""Simulation eines senkrechten Wurfs mit Berücksichtigung der
Corioliskraft. """

import math
import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate
import scipy.interpolate

# Erdbeschleunigung [m/s²].
g = 9.81

# Anfangsort [m].
r0 = np.array([0, 0, 0.0])

# Berechne den Vektor der Anfangsgeschwindigkeit [m/s].
v0 = np.array([0.0, 0.0, 44.29])

# Breitengrad [rad].
theta = math.radians(49.4)

# Vektor der Winkelgeschwindigkeit [rad/s].
omega = 7.292e-5 * np.array([0, math.cos(theta), math.sin(theta)])


def dgl(t, u):
    r, v = np.split(u, 2)

    # Schwerebescheleunigung.
    a_g = g * np.array([0, 0, -1])

    # Coriolisbeschleunigung.
    a_c = - 2 * np.cross(omega, v)

    # Summe aus Schwere- und Coriolisbeschleunigung.
    a = a_g + a_c
    return np.concatenate([v, a])


def aufprall(t, u):
    """Ereignisfunktion: Liefert einen Vorzeichenwechsel beim
    Auftreffen auf dem Erdboden (z=0). """
    r, v = np.split(u, 2)
    return r[2]


# Beende die Simulation beim Auftreten des Ereignisses.
# Damit die Simulation nicht gleich zu Beginn abgebrochen wird,
# legen wir fest, dass das Ereignis nur bei einem
# Vorzeichenwechsel von + nach - ausgelöst wird.
aufprall.terminal = True
aufprall.direction = -1

# Lege den Zustandsvektor zum Zeitpunkt t=0 fest.
u0 = np.concatenate((r0, v0))

# Löse die Bewegungsgleichung bis zum Auftreffen auf der Erde.
result = scipy.integrate.solve_ivp(dgl, [0, np.inf], u0,
                                   events=aufprall,
                                   dense_output=True)

# Berechne die Interpolation auf einem feinen Raster.
t = np.linspace(0, np.max(result.t), 1000)
r, v = np.split(result.sol(t), 2)

# Erzeuge eine Figure.
fig = plt.figure(figsize=(9, 3))
fig.set_tight_layout(True)

# Plotte die Bahnkurve in der Seitenansicht.
ax1 = fig.add_subplot(1, 3, 1)
ax1.set_xlabel('t [s]')
ax1.set_ylabel('x [mm]')
ax1.grid()
ax1.plot(t, 1e3 * r[0], '-b')

# Plotte die Bahkurve in der Aufsicht.
ax2 = fig.add_subplot(1, 3, 2)
ax2.set_xlabel('t [s]')
ax2.set_ylabel('y [mm]')
ax2.grid()
ax2.plot(t, 1e3 * r[1], '-b')

# Plotte die Bahkurve in der Aufsicht.
ax3 = fig.add_subplot(1, 3, 3)
ax3.set_xlabel('t [s]')
ax3.set_ylabel('z [m]')
ax3.grid()
ax3.plot(t, r[2], '-b')

# Zeige die Grafik an.
plt.show()