WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Nicht-linearer 1-Massen-Schwinger

 

Codename
Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 16.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.04.2017, 17:38     Titel: Nicht-linearer 1-Massen-Schwinger
  Antworten mit Zitat      
Hallo,

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 m sowie Dämpfern und Federn. Die beiden Dämpfer haben eine Dämpfungskonstante c und die Federn eine über den Weg x variable Federsteifigkeit k, 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 F_{an}(t) in Schwingung versetzt.

Die zum System zugehörige DGL:

<br />
m*x''+2*c*x'+k_{l}(x)*x- k_{r}(x)*x=F_{an}(t)
<br />

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?

Vielen Dank

Nicht-linearer-1-Massen-Schwinger.jpg
 Beschreibung:

Download
 Dateiname:  Nicht-linearer-1-Massen-Schwinger.jpg
 Dateigröße:  13.75 KB
 Heruntergeladen:  455 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.04.2017, 20:01     Titel:
  Antworten mit Zitat      
Hallo,

um das System lösen, würde ich es in 2 DGLen 1. Ordnung umschreiben und dann ode45 o.ä. verwenden.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Codename
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 16.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.04.2017, 12:44     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich habe deine Idee nun umgesetzt:
Code:

% SOLVE  d2x/dt2*m + 2*c*dx/dt + k*x = F
% initial conditions: x(0) = 0, x'(0)=0

m = 1; %Masse [kg]
k = 10000; %Federsteifigkeit [N/m]
c = 0; %Dämpfung [N*s/m]

F_max = 40; %Anregungsamplitude [N]

dt = 1/1000; %Zeitschritt [s]
fs = 1/dt; %Abtastfrequenz

f_start = 1; %Startfrequenz [Hz]
f_end = 20; %Endfrequenz [Hz]
f_rate = 1;
f = f_start:f_rate*dt:f_end;

t_end = (f_end-f_start)/f_rate;
t=0:dt:t_end;   % time scale


F =  @(t) F_max*chirp(t,f_start,t_end,f_end,'lin',-90); %Anregungskraft in [N]
N = zeros (1,length(F)+1);
[t1,y1] = ode45(@(t,x) [x(2); (-x(2)*2*c-2*k*x(1)+F(t))/m] ,t ,N); %DGL lösen
 


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:
K(x)=k*x

Wie setze ich das nun im Programm um?
Der Folgende Ansatz funktioniert so leider nicht:
Code:

K =  @(x) k*x; %Federsteifigkeit
[t1,y1] = ode45(@(t,x) [x(2); (-x(2)*2*c-2*K(x)*x(1)+F(t))/m] ,t ,N); %DGL lösen
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.04.2017, 08:28     Titel:
  Antworten mit Zitat      
Hallo,

und was funktioniert daran nicht?
Wenn k vorab definiert wurde, sieht das an sich gut aus.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Codename
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 16.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2017, 13:23     Titel:
  Antworten mit Zitat      
Hallo Harald,

als Fehlermeldung erhalte ich:
Code:

Error using odearguments (line 95)
@(T,X)[X(2);(-X(2)*2*C-2*K(X)*X(1)+F(T))/M] returns a vector of length 3, but the length of initial conditions
vector is 2. 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 (line 115)
    odearguments(FcnHandlesUsed, solver_name, ode, tspan, y0, options, varargin);

Error in GoMatlab (line 31)
[t1,y1] = ode45(@(t,x) [x(2); (-x(2)*2*c-2*K(x)*x(1)+F(t))/m] ,t ,N); %DGL l&#65533;sen
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.04.2017, 13:29     Titel:
  Antworten mit Zitat      
Hallo,

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
Code:
K = @(x) k*x(1)


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Codename
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 16.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2017, 13:52     Titel:
  Antworten mit Zitat      
Hallo Harald,

das macht Sinn, danke dafür.

Nun stimmen die Vektorlängen von t und x bzw. y1 aber nicht mehr überein.
t hat die Länge von 19001 und x bzw. y1 von 577.

Weißt du wodran das liegen könnte?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.04.2017, 14:08     Titel:
  Antworten mit Zitat      
Hallo,

welchen Wert von k verwendest 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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Codename
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 16.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2017, 14:21     Titel:
  Antworten mit Zitat      
Ich habe mit den folgenden Parametern gerechnet:

Code:

m = 1; %Masse [kg]
k = 10000; %Federsteifigkeit [N/m]
c = 0; %Dämpfung [N*s/m]
 


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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.04.2017, 14:27     Titel:
  Antworten mit Zitat      
Hallo,

bitte die Warnung lesen.
MATLAB hat vorzeitig abgebrochen, weil die Lösung unendlich wird.

Ein Problem dürfte sein, dass die Federkonstante bei negativem x(1) auch negativ wird. Mit
Code:
K =  @(x) abs(k*x(1));

läuft der Code zumindest mal durch. Was da eine sinnvolle Wahl ist, kann ich nicht sagen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Codename
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 16.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2017, 15:07     Titel:
  Antworten mit Zitat      
Hallo,

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

[t1,y1] = ode45(@(t,x) [x(2); (-x(2)*2*c-2*K(x)*x(1)+F(t))/m] ,t ,N); % DGL lösen
 


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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.04.2017, 15:27     Titel:
  Antworten mit Zitat      
Hallo,

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


Im Code dann:
Code:
K =  @(x) Kfun(x, k);


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Codename
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 16.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2017, 16:17     Titel:
  Antworten mit Zitat      
Hallo Harald,

wie muss denn dann die Programmzeile mit dem ode45 aussehen?
Wenn ich es so mache erhalte ich eine Fehlermeldung.
Code:

[t1,y1] = ode45(@(t,x) [x(2); (-x(2)*2*c-2*K(x)*x(1)+F(t))/m] ,t ,N); %DGL lösen

Undefined operator '*' for input arguments of type 'function_handle'.

Error in GoMatlab>@(t,x)[x(2);(-x(2)*2*c-2*K(x)*x(1)+F(t))/m]

Error in ode45 (line 262)
    f(:,3) = feval(odeFcn,t+hA(2),y+f*hB(:,2),odeArgs{:});

Error in GoMatlab (line 31)
[t1,y1] = ode45(@(t,x) [x(2); (-x(2)*2*c-2*K(x)*x(1)+F(t))/m] ,t ,N); %DGL l&#65533;sen
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.04.2017, 16:18     Titel:
  Antworten mit Zitat      
Hallo,

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


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Codename
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 16.07.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2017, 16:48     Titel:
  Antworten mit Zitat      
Hallo Harald,

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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.