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

Implementation of a nonlinear Matrix Equation in Simulink

 

Lagrange91
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 02.03.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2015, 12:06     Titel: Implementation of a nonlinear Matrix Equation in Simulink
  Antworten mit Zitat      
Hallo gomatlab community,

I habe die equations of motion von einer Gyroanlage mit der Lagrange Methode hergeleitet (siehe angehängtes Bild). q2 und q3 stellen Winkel zwischen beweglichen Frames dar, wohingegen w1,w2,w3,w4
die Winkelgeschwindigkeiten darstellen. Id und Jd repräsentieren Trägheitsmomente im Körperfesten Koordinatensystem (constants). Wie auch immer, ich würde das Modell gerne in Simulink simulieren. Dafür habe ich die Bewegungsgleichungen in die folgende Form gebracht.


<br />
\begin{bmatrix} J\end{bmatrix}\cdot \begin{bmatrix}\dot{\omega_{1}\\ \dot{\omega_{2}\\ \dot{\omega_{3}\\ \dot{\omega_{4}\end{bmatrix}=\begin{bmatrix}f1(q_2,q_3,w_1,w_2,w_3,w_4)\\f2(...)\\f3(...)\\f4(...)\end{bmatrix}
<br />

<br />
\begin{bmatrix}\dot{\omega_{1}\\ \dot{\omega_{2}\\ \dot{\omega_{3}\\ \dot{\omega_{4}\end{bmatrix}=\begin{bmatrix} J\end{bmatrix}^{-1} \cdot \begin{bmatrix}f1(q_2,q_3,w_1,w_2,w_3,w_4)\\f2(...)\\f3(...)\\f4(...)\end{bmatrix}
<br />


wobei J(q2,q3) eine a 4x4 Matrix (Inertia Matrix) und \dot{\omega_{i}} (i=1,..,4) die Winkelbeschleunigungen sind.

Wie implementiere ich das in Simulink?

Danke vielmals im Voraus

Mit besten Grüssen,
Pascal

EQNS.PNG
 Beschreibung:
Equations of Motion derived via Lagranges Method

Download
 Dateiname:  EQNS.PNG
 Dateigröße:  110.51 KB
 Heruntergeladen:  601 mal
Private Nachricht senden Benutzer-Profile anzeigen


cvanommer
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 02.03.15
Wohnort: Garching bei München
Version: R2015a
     Beitrag Verfasst am: 02.03.2015, 13:46     Titel:
  Antworten mit Zitat      
Hallo Pascal,

Eine (einfache) Lösungsvorschlag ist um zum Ersten die Inverse der Inertia Matrix aus zu rechnen in z.B. ein Matlab Skript mit dem 'MATLAB Funktion' block. Folglich kannst du für jede Gleichung ein Subsystem generieren mit ihre gewünchte Input und Output (also z.B. ein Subsystem f1 mit input q2 q3 w1 w2 und w3) Der Output ist dann der Wert die rauskommt. Folglich kannst über ein zweiten Matlabskript (mit ein zweiten MATLAB Funktion) die richtige Winkelbeschleunigungen ausrechnen. Die Output von dieser MatlabSkript in Simulink soll dann w_punkt_1 bis w_punkt_4 sein.

Viel erfolg mit deinem Projekt!
VG Christiaan

p.s. für die Berechnung der q1 bis q4 gilt die gleiche Lösungsstrategie
p.s. 2 wenn du die Winkelgeschwindigkeit w1 gleich null ausrechnen willst, könntest du mit der 'algebraic constraint' die Gleichung für w1 lösen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Lagrange91
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 02.03.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2015, 14:06     Titel: Re
  Antworten mit Zitat      
Hallo und Danke für den Vorschlag!

Ich frage mich, ob ich dies mit dem angehängten Blockdiagramm ginge? In dem Bild stellt die Funktion "inv(J)" die Matrix J mit den vom Mux hineingeführten inputs auf und berechnet die inverse. Die Funktion gibt also am Ausgang die Inverse von J aus. Die Funktion [f1;f2;f3;f4] stellt die Gleichungen f1=(args) f2=(args) f3=(args) und f4=(args) auf, konkret den Rest der Bewegungsgleichungen ohne die wdot (die habe ich ja auf die andere Seite der Gleichung genommen) und gibt am Ausgang den Vektor [f1;f2;f3;f4] zurück. Die beiden Resultate werden im Block multipliziert (Matrixmultiplikation)J^{-1}\cdot \begin{bmatrix}f1\\f2\\f3\\f4 \end{bmatrix} und dieser Ausdruck ist = \begin{bmatrix}\dot{\omega_1}\\ \dot{\omega_2}\\\dot{\omega_3}\\\dot{\omega_4} \end{bmatrix}.
Die Integratoren habe die Anfangsbedingungen
\begin{bmatrix}\omega_1\\\omega_2\\\omega_3\\\omega_4 \end{bmatrix} bzw.
\begin{bmatrix}q_1\\ q_2\\ q_3\\ q_4 \end{bmatrix}

Leider funktioniert das ganze noch nicht ganz so wie ich möchte. Wie sage ich Simulink, dass er mit Matrizen rechnet bzw. Berechnet er das was ich möchte, so wie ich das programmiert habe? Wie muss ich es richtig machen?

Danke für die Hilfe Smile

Gruss
Pascal
Private Nachricht senden Benutzer-Profile anzeigen
 
Lagrange91
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 02.03.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2015, 16:13     Titel: Re: Re
  Antworten mit Zitat      
Lagrange91 hat Folgendes geschrieben:
Hallo und Danke für den Vorschlag!

Ich frage mich, ob ich dies mit dem angehängten Blockdiagramm ginge? In dem Bild stellt die Funktion "inv(J)" die Matrix J mit den vom Mux hineingeführten inputs auf und berechnet die inverse. Die Funktion gibt also am Ausgang die Inverse von J aus. Die Funktion [f1;f2;f3;f4] stellt die Gleichungen f1=(args) f2=(args) f3=(args) und f4=(args) auf, konkret den Rest der Bewegungsgleichungen ohne die wdot (die habe ich ja auf die andere Seite der Gleichung genommen) und gibt am Ausgang den Vektor [f1;f2;f3;f4] zurück. Die beiden Resultate werden im Block multipliziert (Matrixmultiplikation)J^{-1}\cdot \begin{bmatrix}f1\\f2\\f3\\f4 \end{bmatrix} und dieser Ausdruck ist = \begin{bmatrix}\dot{\omega_1}\\ \dot{\omega_2}\\\dot{\omega_3}\\\dot{\omega_4} \end{bmatrix}.
Die Integratoren habe die Anfangsbedingungen
\begin{bmatrix}\omega_1\\\omega_2\\\omega_3\\\omega_4 \end{bmatrix} bzw.
\begin{bmatrix}q_1\\ q_2\\ q_3\\ q_4 \end{bmatrix}

Leider funktioniert das ganze noch nicht ganz so wie ich möchte. Wie sage ich Simulink, dass er mit Matrizen rechnet bzw. Berechnet er das was ich möchte, so wie ich das programmiert habe? Wie muss ich es richtig machen?

Danke für die Hilfe Smile

Gruss
Pascal


nonlinear_mdl.JPG
 Beschreibung:
Hatte vergessen das Bild anzuhängen!

Download
 Dateiname:  nonlinear_mdl.JPG
 Dateigröße:  67.03 KB
 Heruntergeladen:  590 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
cvanommer
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 02.03.15
Wohnort: Garching bei München
Version: R2015a
     Beitrag Verfasst am: 04.03.2015, 15:59     Titel:
  Antworten mit Zitat      
Hallo Pascal,

Für die Integration von einer Array in Simulink gibt es mehrere Möglichkeiten.
Ich habe in der Modellbeispiel in einem Callback die Matrix initialisiert und dann kann man über ein constant block den Wert in ein Funktion block benutzen. Auch habe ich in die Callback die Initialisierung von der Winkelgeschwindigkeit definiert. (File -> Model Properties -> Model Properties -> Callbacks -> InitFcn)

Eine zweite Möglichkeit ist die Initialisierung über ein m-file machen wo die die Matrix J definierst. Die name der mfile (ohne .m) schreibst du dann in InitFcn rein und dann sind automatisch alle Variablen die du in deiner Initalisierungsmfile schreibst verfügbar.

Ich würde MATLAB Functions benutzen statt interpretet matlab functions.

Viel Erfolg!
Vg Christiaan

simulator.png
 Beschreibung:

Download
 Dateiname:  simulator.png
 Dateigröße:  38.37 KB
 Heruntergeladen:  568 mal
simulator.slx
 Beschreibung:

Download
 Dateiname:  simulator.slx
 Dateigröße:  22.01 KB
 Heruntergeladen:  513 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Lagrange91
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 02.03.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.03.2015, 19:49     Titel:
  Antworten mit Zitat      
Hallo Christiaan

Danke für deine Hilfe, es hat geklappt! Habe noch kleine numerische Probleme, für gewisse Anfangswerte läuft Simulink ohne zu zucken in die Singularität d.h. die Matrix ist dann nicht mehr invertierbar. Aber das biege ich schon noch für meine Zwecke hin.

Danke nochmals und einen schönen Abend.

Gruss
Pascal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.03.2015, 23:04     Titel:
  Antworten mit Zitat      
Hallo,

viele ODE-Solver in MATLAB arbeiten übrigens mit einer Mass Matrix:
http://www.mathworks.com/help/matlab/ref/odeset.html#f92-1023650

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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 - 2024 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.