Federpendel mit Dämpfung

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
pascal.schadt
User
Beiträge: 1
Registriert: Montag 18. Dezember 2023, 10:14

Hi zusammen,

ich musste den Amplitudengang eines Federpendels mit Dämpfung mittels DGL modellieren und die Resonanzfrequenz sowie die Schwingungsentkopplung kenntlich machen. Dieser Code funktioniert so und es wird alles angezeigt wie es soll.

Das Problem ist, wenn ich mit der Dämpfung c<5 gehe, dass der Amplitudengang dann sehr viele Knicke bekommt und nicht mehr wirklich glatt ist.
Zudem bekomme ich bei der Schwingungsentkopplung den gleichen Wert heraus wenn ich c=5 setze oder c=10. Das ist doch nicht plausibel oder?

Vielen Dank im Voraus! Grüße

Hier der Code:

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp

def Dämpfung(t, x, c, m, k, xe, w):
dx1dt = x[1]
dx2dt = (c/m) * (xe*w*np.cos(w*t)-x[1]) + (k/m)*(xe*np.sin(w*t)-x[0])
dxdt = [dx1dt, dx2dt]
return dxdt

def amplitude(c, m, k, xe, w, t_max_amplitude):
x0 = [0, 0]
tspan = [0, 10]
ntime = 1000

sol = solve_ivp(Dämpfung, tspan, x0, args=(c, m, k, xe, w), t_eval=np.linspace(tspan[0], tspan[1], ntime))

# Index des Zeitpunkts t_max_amplitude finden
index_t_max_amplitude = np.argmax(sol.t >= t_max_amplitude) # In "sol.t" sind in diesem Fall 1000 Werte zwischen 0 und 10 enthalten, da ntime = 1000

# Amplitude bis zum Zeitpunkt t_max_amplitude ignorieren
amplitude_max = np.max((sol.y[0, index_t_max_amplitude:]))
anregungsAmplitude = xe

return amplitude_max / anregungsAmplitude

if __name__ == "__main__":
m = 1
k = 100
c = 5
xe = 0.01
t_max_amplitude = 2.2

w_liste = np.linspace(0, 20, 100)
amplitude_werte = []

for w in w_liste:
verhältnis = amplitude(c, m, k, xe, w, t_max_amplitude)
amplitude_werte.append(verhältnis)

resonanz_frequenz_index = np.argmax(amplitude_werte)
resonanz_frequenz = w_liste[resonanz_frequenz_index]

# Finden des Punktes, an dem die Amplitude der Schwingung gleich der Anregungsamplitude ist
schwingungsentkopplung_array = np.abs(np.array(amplitude_werte) - 1)
schwingungsentkopplung_index = np.argmin(schwingungsentkopplung_array)
schwingungsentkopplung_frequenz = w_liste[schwingungsentkopplung_index]

plt.plot(w_liste, amplitude_werte, label="Amplitudenverhältnis")
plt.axvline(x=resonanz_frequenz, color='red', linestyle='--', label=f'Resonanzfrequenz')
plt.axvline(x=schwingungsentkopplung_frequenz, color='orange', linestyle='--', label=f'Schwingungsentkopplung')

plt.xlabel("Kreisfrequenz der Erregung")
plt.ylabel("Amplitudenverhältnis")
plt.legend()
plt.grid(True)
plt.show()

print(f"Resonanzfrequenz: {resonanz_frequenz} Hz")
print(f"Schwingungsentkopplung bei: {schwingungsentkopplung_frequenz} Hz")
Antworten