ich möchte gerne in Matlab einen nicht-linearen 1-Massen-Schwinger simulieren.
Wie dem angehängten Bild zu entnehmen ist, besteht mein System aus einer beidseitig eingespannten Masse sowie Dämpfern und Federn. Die beiden Dämpfer haben eine Dämpfungskonstante und die Federn eine über den Weg variable Federsteifigkeit , die über eine Hysterese beschrieben wird. Die Federn sind außerdem vorgespannt und üben nur Druckkräfte aus. Die Masse wird zusätzlich über eine Anregungskraft in Schwingung versetzt.
Die zum System zugehörige DGL:
Da es sich um eine nicht-lineare DGL handelt, war meine Idee, das Newmark-Beta Verfahren zur Lösung anzuwenden.
Als Ergebnis möchte ich gerne im ersten Schritt die Verlagerung der Masse über die Zeit simulieren und im zweiten Schritt einen Nachgiebigkeitsfrequenzgang (Bode-Digramm) des Systems berechnen.
Da ich leider wenig Erfahrung in diesem Gebiet habe, möchte ich euch fragen, ob das Newmark-Beta-Verfahren für diesen Anwendungsfall geeignet ist oder ob es ein besseres bzw. einfacheres Verfahren gibt?
Die Federsteifigkeit ist in diesem Beispiel allerdings noch konstant.
In meinem System soll diese aber in Abhängigkeit von x berechnet werden.
Stark Vereinfacht zunächst so:
Wie setze ich das nun im Programm um?
Der Folgende Ansatz funktioniert so leider nicht:
Error using odearguments (line95)
@(T,X)[X(2);(-X(2)*2*C-2*K(X)*X(1)+F(T))/M] returns a vector of length3, but the length of initial conditions
vector is2. The vector returned by @(T,X)[X(2);(-X(2)*2*C-2*K(X)*X(1)+F(T))/M] and the initial conditions
vector must have the same number of elements.
Error in ode45(line115)
odearguments(FcnHandlesUsed, solver_name, ode, tspan, y0, options, varargin);
ohne die Fehlermeldung habe ich es auch nicht gesehen, mit der Fehlermeldung ist es an sich recht klar: wieso hat der Vektor jetzt die Länge 3, obwohl er vorhin die Länge 2 hatte? Weil K(x) die Länge 2 hat, wenn x die Länge 2 hat.
Vermutlich möchtest du
Für k = 1 bekomme ich im Command Window folgende Meldung:
Warning: Failure at t=2.819278e+00. Unable to meet integration tolerances without reducing the step size
below the smallest value allowed (7.105427e-15) at time t.
Ein Plot zeigt, dass die Lösung nach -inf läuft.
Mit k = 0.001 läuft der Code erst mal durch. Wenn ich jedoch den Zeithorizont verlängere, tritt das gleiche Problem auf.
Für k=1 bekomme ich auch ein Ergebnis, allerdings hat der Ergebnisvektor dann die Länge von 2820.
Wieso verändert sich die Länge in Abhängigkeit von k? Eigentlich sollte dieser die Länge von t beibehalten.
die Fehlermeldung habe ich doch glatt übersehen. Erneut vielen Dank für den Hinweis.
Nun möchte ich weiterhin das K(x) in Abhängigkeit von x definieren. Der Verlauf soll später eine Hysterese bilden. Im ersten Schritt möchte ich gerne den folgenden Fall implementieren:
Code:
if x>0% Feder wird gespannt
K = @(x)abs(k*x(1)); % Federsteifigkeit else% x<0 Feder wird entspannt
K = @(x)abs(1/2*k*x(1)); % Federsteifigkeit end
Die Fallunterscheidung ist vor dem Lösen der DGL jedoch so nicht möglich, da x noch nicht bekannt ist.
Wie lässt sich dieses Vorgehen im Programm umsetzen?
das einfachste dürfte sein, wenn du dir eine kleine separate Funktion schreibst:
Code:
function K = Kfun(x, k) if x(1)>0% Feder wird gespannt (es geht wieder nur um x(1)!!)
K = @(x)abs(k*x(1)); % Federsteifigkeit else% x<0 Feder wird entspannt
K = @(x)abs(1/2*k*x(1)); % Federsteifigkeit end
mein Fehler. Die Function Handles innerhalb der Function müssen weg, also
Code:
function K = Kfun(x, k) if x(1)>0% Feder wird gespannt (es geht wieder nur um x(1)!!)
K = abs(k*x(1)); % Federsteifigkeit else% x<0 Feder wird entspannt
K = abs(1/2*k*x(1)); % Federsteifigkeit end
vielen Dank für deine Hilfe, das funktioniert schon sehr gut so.
Nun möchte ich noch die Funktion K über die Zeit t plotten.
Wenn ich fplot(K) eingebe, wird die Funktion über den Weg x aufgetragen.
Funktioniert das auch mit der Zeit?
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.