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

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 9.13 Schwingungen/gekoppelte_schwinger.py

"""Simulation zweier gekoppelter Masse-Feder-Schwinger. """

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.animation
import scipy.integrate
import schraubenfeder

# Simulationszeit T und Zeitschrittweite dt [s].
T = 42.0
dt = 0.01

# Masse der Körpers [kg].
m = 1.0

# Federkonstante [N/m].
D = 35.808088530029416

# Federkostante der Kopplungsfeder [N/m].
D1 = 1.8351645371640082

# Anfangslänge der äußeren Federn [m].
L = 0.3

# Anfangslänge der Kopplungsfeder [m].
L1 = 0.5

# Anfangsauslenkungen [m].
x0 = np.array([0.1, 0.0])

# Anfangsgeschwindigkeiten [m/s].
v0 = np.array([0.0, 0.0])


def dgl(t, u):
    x1, x2, v1, v2 = u
    F1 = -D * x1 - D1 * (x1 - x2)
    F2 = -D * x2 - D1 * (x2 - x1)
    return np.array([v1, v2, F1 / m, F2 / m])


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

# Löse die Bewegungsgleichung.
result = scipy.integrate.solve_ivp(dgl, [0, T], u0,
                                   t_eval=np.arange(0, T, dt))
t = result.t
x1, x2, v1, v2 = result.y

# Erzeuge eine Figure.
fig = plt.figure()
fig.set_tight_layout(True)

# Erzeuge einen Plot der Auslenkung als Funktion der Zeit.
ax1 = fig.add_subplot(2, 1, 2)
ax1.set_xlabel('t [s]')
ax1.set_ylabel('x [m]')
ax1.set_xlim(0, T)
ax1.grid()
ax1.plot(t, x1, 'b-', label='x1')
ax1.plot(t, x2, 'r-', label='x2')
ax1.legend()

# Linie zur Darstellung der aktuellen Zeit.
linie_t, = ax1.plot(0, 0, '-k', linewidth=3, zorder=5)

# Erzeuge einen Plot zur animierten Darstellung.
ax = fig.add_subplot(2, 1, 1)
ax.set_xlim([-L/20, 2 * L + L1 + L/20])
ax.set_aspect('equal')
ax.set_xlabel('x [m]')

# Mache die überflüssigen Achsenmarkierungen unsichtbar.
ax.spines['top'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.get_yaxis().set_visible(False)

# Linke Befestigung.
ax.plot([0, 0], [-L/4, L/4], 'k-', linewidth=3, zorder=6)

# Rechte Befestigung.
ax.plot([2 * L + L1, 2 * L + L1], [-L/4, L/4], 'k-',
        linewidth=3, zorder=6)

# Ruhelagen der beiden Massen.
ax.plot([L, L], [-L/4, L/4], '--',
        color='gray', zorder=3)
ax.plot([L + L1, L + L1], [-L/4, L/4], '--',
        color='gray', zorder=3)


# Die beiden Massenpunkte.
masse1, = ax.plot(0, 0, 'bo', zorder=5)
masse2, = ax.plot(0, 0, 'ro', zorder=5)

# Die drei Federn.
feder1, = ax.plot([0], [0], 'k-', zorder=4)
feder2, = ax.plot([0], [0], 'k-', zorder=4)
federk, = ax.plot([0], [0], 'g-', zorder=4)

# Textfeld zur Anzeige des Aktuellen Zeitpunkts.
text = ax.text(0.5, 0.8, '', transform=ax.transAxes)


def update(n):
    # Aktuelle Position der beiden Massen:
    r1 = np.array([L + x1[n], 0])
    r2 = np.array([L + L1 + x2[n], 0])

    # Position der beiden Befestigungspunkte:
    ra = np.array([0.0, 0.0])
    rb = np.array([2 * L + L1, 0.0])

    # Aktulisiere die Position der Massen.
    masse1.set_data(r1.reshape(-1, 1))
    masse2.set_data(r2.reshape(-1, 1))

    # Aktualisiere die linke Feder.
    feder1.set_data(schraubenfeder.data(ra, r1, N=10, R0=L/20,
                                        a=L/10, L0=L))

    # Aktualisiere die mittlere Kopplungsfeder.
    federk.set_data(schraubenfeder.data(r1, r2, N=10, R0=L/20,
                                        a=L/10, L0=L))

    # Aktualisiere die rechte Feder.
    feder2.set_data(schraubenfeder.data(r2, rb, N=10, R0=L/20,
                                        a=L/10, L0=L))

    # Aktualisiere die Zeitanzeige.
    text.set_text(f't = {t[n]:5.1f} s')

    # Aktualisiere die Markierung der aktuellen Zeit.
    t_akt = t[n]
    linie_t.set_data([[t_akt, t_akt], ax1.get_ylim()])

    return (masse1, masse2, feder1, feder2,
            federk, text, linie_t)


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