Verfasst am: 19.06.2013, 14:01
Titel: Gleichungssystem in Matrix realisieren
Hallo zusammen,
ich habe ein Problem mit der Aufstellung eines Gleichungssystems. Das GS soll auf einer Seite Null, auf der anderen Seite die Differenz zweier Matrizen besitzen. Es geht 2 4x4 Matrizen, bei der eine von beiden 6 unabhängige Variablen besitzt. Die 16 Einträge sollen untereinander in dem Gleichungssystem aufgelistet werden. Bis jetzt ist meine Herangehensweise:
Lasst euch nicht von dem Strukturarray irritieren. Die eine Drehmatrix ist unter dhp(06).D gespeichert. Die mit den unabhängigen Variablen unter dhp(06).Dr.
Matlab meint dazu:
Code:
[(dhp(06).D(1,1)- dhp(06).Dr(1,1)) = 0;
|
Error: The expression to the left of the equals signis not a valid target for an
assignment.
wenn du ein Gleichungssystem lösen willst, bringe es in die Form A*x = b,wobei x deine Unbekannten sind und b in deinem Fall ein Nullvektor. A ist die Koeffizientenmatrix
Die Dimensionen sollten sein:
A: n x n
b: n x 1
x: n x 1
Das Gleichungssystem löst du dann mit dem Backslash-Operator:
A sollte vollen Rang haben, d.h. alle Zeilen/Spalten linear unabhängig sein. Hat deine Koeffizientenmatrix mehr Zeilen (A: m x n) dann hast du mehr gleichungen (m-Gleichungen) als Unbekannte (n Unbekannte). Das ist glaub ich bei dir der Fall.
Das System ist dann überbestimmt. Wenn ich mich richtig erinnere, rechnet Matlab dir dann die Unbekannten mit der Methode der kleinsten Fehlerquadrate aus.
Viele Grüße!
Achso, zu deinem Fehler
Mit dem Gleichheitszeichen weist du immer Werte einer Variablen zu. Matlab rechnet (fast) immer numerisch und will immer sofort drauf losrechnen. Das heißt, so ein Gleichungssystem erst aufstellen und dann sagen: JETZT rechne mir das aus, geht in Matlab nicht. Deswegen die oben geschriebene Form benutzen
Nochmal besten Gruß
Zuletzt bearbeitet von Bibonaut am 19.06.2013, 22:33, insgesamt einmal bearbeitet
Verfasst am: 19.06.2013, 22:43
Titel: Re: Gleichungssystem in Matrix realisieren
Hallo OlegZ,
Hier gibt es ein Missverständnis: Das "=" eignet sich nicht um ein "Gleichungssystem aufzustellen", sondern dies ist der Zuweisungs-Operator (englisch: Assignment).
Möchtest Du das Gleichungssystem numerisch oder symbolisch lösen?
Gruß, Jan
OlegZ
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 20.06.2013, 11:36
Titel:
Hallo zusammen,
erstmal vielen Dank für die schnellen Antworten. Es geht mir darum, die Gleichungssysteme später numerisch mit dem Befehl "fsolve" zu lösen. Dafür benötige ich zunächst implizite Gleichungssysteme aller Einträge, bei denen auf der einen Seite die Differenz der Matrizeneinträge, auf der anderen Seite 0 steht. Ich brauche also 16 Gleichungssysteme in einer Matrix (in meinem Fall "gls"), da die Einträge mehrere unabhängige Variablen beinhalten (in meinem Fall Beta's). Konnte ich damit mein Problem ein wenig klarer machen?
Beide Matrizen haben die Form 4x4. Nun sollen Gleichungssysteme aufgestellt werden, in der die Differenz zwischen jedem Eintrag von dhp(06).D und jedem Eintrag von dhp(06).Dr gleich Null ergibt.
Diese Gleichungssysteme würde ich in einer Matrix zusammenfassen und mir von fsolve lösen lassen. Damit ich auf die notwendigen Drehwinkel (beta_01,..) komme.
Das Posten solcher Code-Monster im Forum ist nicht sinnvoll. Es wird garantiert keiner durchlesen. Sinnvoller wäre es den Rechenweg als Code zu zeigen, statt ihn als Text zu erklären:
Zitat:
Danach habe ich in der Berechnung für die Drehwinkel die Variablen "beta_01","beta_12" etc. substituiert ...
Das wäre als Code auf Anhieb eindeutig.
Gruß, Jan
OlegZ
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 22.06.2013, 12:21
Titel:
Hallo Jan,
tut mir Leid, im Nachhinein konnte ich auch nur den Kopf schütteln.
Hier ist meine Funktion, die die Drehmatrizen aufstellt.
das Problem mit dem Gleichungssystem habe ich jetzt selbst gelöst. Jedoch klappt bei mir die Lösung mit dem Operator "fsolve" nicht. Ich habe leider auch keine Ahnung, welche Optionen eingestellt werden sollten. Hier mein Quellcode:
vielleicht kannst du dein technisches Problem ein wenig genauer äußern. Ich beschäftige mich im Moment ziemlich viel mit MKS, also auch mit Koordinatentransformation.
1. Frage: Was bedeuten bei dir beta, s, d, delta? beta und delta sind höchstwahrscheinlich Winkel, aber was sind s und d?
2. Frage: Sind das reine Drehmatrizen oder 4x4 Matrizen, die auch Translationen ausführen?
3. Frage: Wenn es reine 3x3 Drehmatrizen sind, was führst du genau bei der Rücktransformation durch ? Die Rücktransformation kannst du einfach durch Transponieren der Matrix durchführen:
Beispiel :
4. Frage: Mir ist nicht ganz klar, welche Drehreihenfolge du benutzt, also wann du um welche Achse drehst.
bitte sage doch irgendwann mal, welches Gleichungssystem du überhaupt lösen willst.
Die von dir verwendete Syntax versteht MATLAB nicht, und ich damit leider auch nicht.
Insbesondere hier:
fsolve will die Zielfunktion als erstes mit b0, einem Double-Vektor, aufrufen. In diesen kannst du natürlich nicht wie in eine Struktur indizieren.
Vor allem aber hat dein fsolve-Befehl in der momentanen Form überhaupt nichts mit den ganzen vorherigen Definitionen zu tun.
Zudem: fsolve ist ein numerischer Löser. In dem Zusammenhang machen symbolische Variablen keinen Sinn. Entweder also durchgehend numerisch arbeiten (i.d.R. sinnvoller) oder rein symbolisch mit solve arbeiten.
Zusammenfassung:
- Bitte erläutere klar, welches Gleichungssystem du genau lösen willst.
- Wenn die Gleichungen linear in den Unbekannten sind, dann solltest du nicht fsolve, sondern \ verwenden.
Grüße,
Harald
OlegZ
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 24.06.2013, 10:46
Titel:
Hallo zusammen,
Um ein wenig genauer zu werden. Ich möchte ein Modell für einen Industrieroboter in der Simulationsumgebung Simmechanics aufstellen. Dafür möchte ich sowohl die Vorwärtskinematik als auch die Rückwärtskinematik anwenden. Heißt, ich möchte sowohl mit gegebenen Verdrehwinkel der einzelnen Bauteile die Position, als auch mit vorgegebener Position die Verdrehwinkel bestimmen.
ersteinmal zu dir, Bibonaut:
1. die 4 Parameter sind Denavit-Hartenberg-Parameter. Das heißt:
- Beta ist der Winkel zwischen der x(i) - und der x(i+1)- Achse,
gemessen im mathematisch positiven Sinn um die z- Achse
- s ist der Abstand zwischen der x(i)- und der x(i+1)- Achse,
gemessen in Richtung der z- Achse
- Delta ist der Kreuzungswinkel zwischen der z(i)- und der z(i+1)- Achse,
gemessen im mathematisch positiven Sinn um die x(i+1)- Achse
- d ist der Kreuzungsabstand zwischen der z(i)- und der z(i+1)- Achse,
gemessen in Richtung der x(i+1)- Achse
2. du hast Recht, Drehmatrizen ist der falsche Begriff. Es sind Transformationsmatrizen, da sie sich nicht um einen festen Raumpunkt verdreht. Ich habe eine Verschiebung der Relativkoordinatensysteme.
3. Ich weiß nicht genau, wo du meinst, dass ich eine Rücktransformation durchführe. Ich möchte mithilfe des Befehls fsolve meine relativen Drehwinkel der einzelnen Komponenten bei gegebener Endposition (06) bestimmen.
4. Die Drehreihenfolge beginnt bei 01 und endet bei 56. Heißt ich habe die Transformation vom KOS 0 und dem KOS 1. Dann bestimme ich die Transformation vom KOS 1 und dem KOS 2. etc..
jetzt noch zu Harald:
Ich habe bereits selbst festgestellt, dass fsolve mit meiner jetzigen Syntax nicht viel anfangen kann. Ich habe nochmal die Hilfe durchforstet, konnte aber aufgrund fehlenden Wissens zum Programm Matab nicht weiterarbeiten. Ich habe in meiner Funktion gleichungssystem versucht, die allgemeine Form für fsolve herzustellen: F(x) = 0 um dann function F = myfun(x) aufzustellen und diese zu lösen.
Dabei beinhaltet die Funktion F(x) die Differenz der einzelnen Einträge meiner beiden 4x4 Matrizen. Hierbei stelle ich nichtlineare trigonometrische Terme des Types
Ich möchte dann mithilfe von fsolve numerisch auf die fehlenden beta's gelangen, indem ich Startwerte vorgebe und dann per Levenberg-Marquardt methode bestimmt wird.
Hier meine Verständnisprobleme.
Ich bin mir schonmal nicht sicher, ob ich fsolve nur die Differenz der Matrizen oder ein gleichungssystem mit 2 Seiten vorgeben muss. Außerdem gebe ich dem Befehl nun ja eine Matrix, die 16 Einträge besitzt. Klappt das überhaupt?
Ich möchte lieber alle offenen Fragen beantworten, damit ich mit meinem Programm vorankomme. Also fragt ruhig.
diese Paremter, die du nutzt, sind ja eigentlich nichts anderes als die Verwendung der 4x4 Transformationsmatrizen mit vorgegebenem Schema.
Du kannst nicht alle Winkel und Verschiebungen mit einem LGS ausrechnen. Nagut, geht vielleicht schon, aber intuitiv ist das nicht. Mit fällt auch nicht auf die Schnelle ein, wie so ein großes Gleichungssystem aussehen soll.
Fakt ist, du weist in welcher Reihenfolge du die Rotationen und Translationen ausführst. Bei einem MKS kennst du auch immer die Lage deine Koordinatensysteme. Die benötigst du auch.
Hier mal ein Beispiel, wie du die Winkel berechnest, wenn du zwei Rotationen nacheinander ausführst:
Code:
% Beispiel: Koordinatentransformation für Rotation um z und y Achse
% Erst Rotation um z Achse
R01 = makehgtform('zrotate',pi/3);
% Zweite Rotation um y-Achse
R12 = makehgtform('yrotate',pi/4);
% Annahme: Körperfestes Koordinatensystem in 2 ist Einheitsmatrix:
KS2in2 = eye(4);
danke für die schnelle Antwort. Deine Schritte sind nachvollziehbar. Nur kann ich sie auf mein Problem nicht ganz anwenden. Zum einen drehe ich die KOS nicht um einen ortsfesten Punkt sondern, sie stehen relativ zueinander im Raum. Da mein Industrieroboter 6 Komponenten, also 6 Freiheitsgrade hat, brauche ich auch 6 relativ zueinander stehende Koordinatensysteme. Und diese beinhalten jeweils eine Verschiebung in eine Achsrichtung. Daher arbeite ich auch mit der Denavit-Hartenberg-Konvention, um so die Vorwärtskinematik schnell durchführen zu können.
Viel wichtiger für mich ist, die Matrix, welche die Differenz meiner Matrizen beinhaltet, mit einem Befehl numerisch zu lösen und somit die 6 Verdrehwinkel zu erhalten.
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.