Wie im Abschnitt "input arguments" der Doku beschrieben, übergibt fsolve an das Function Handle nur eine Variable.
Du wirst also y an x dranhängen müssen, sprich y(1) wird zu x(4), y(2) zu x(5) und y(3) zu x(6).
Dein Startvektor x0 muss soviele Komponenten haben wie Unbekannte, hier also sechs.
Das Programm rechnet nun, aber nach 44 Iterationen bricht es mit der Meldung:
Zitat:
No solution found.
fsolve stopped because the problem appears regular as measured by the gradient,
but the vector of function values is not near zero as measured by the
default value of the function tolerance.
mir scheint, dass das Gleichungssystem schlicht keine Lösung hat.
Begründung: die letzten drei Bedingungen heißen, dass die 3 "Punkte" auf dem Einheitskreis liegen sollen; insbesondere sind dadurch alle Werte zwischen -1 und 1.
Mit so etwas wird man aber nie die ersten beiden Gleichungen erfüllen können, da mit Faktoren zwischen -1 und 1 auch immer das Produkt in diesem Intervall liegt.
Tjo, und wenns keine Lösung gibt, kann MATLAB auch keine finden.
Vielleicht stimmt ja mit der Problem-Formulierung etwas nicht?
vielen Dank für den Tipp, es hat tatsächlich das Gleichungssystem nicht gestimmt
Aber ich habe jetzt zwei andere Probleme:
1) Ich kann irgendwie keine bekannten Variablen in meine Gleichung einsetzen, d.h. wenn ich die Variablen so wie sie unten steht in fsolve aufrufen will bekomme ich den Fehler obwohl sie bekannt sind:
Zitat:
Undefined function or method 'leg_v2' for input arguments of type 'double'
Kann man keine bekannten Variablen in fsolve einsetzen?
2) Wenn ich die beiden Variablen durch ihre Zahlenwerte ersetze berechnet mit fsolve die 6 gesuchten Lösungen x(1) - x(6), aber diese Werte sind viel zu ungenau!
Wenn ich mit ihnen nämlich die Probe mach und sie wieder in das Gleichungssystem einsetze kommt nur bei der ersten Gl ca. 0 heraus, die anderen sind zu groß bzw. zu klein, da ja alle 6 Gleichungen =0 sein sollten.
Wie kann ich fsolve genauer machen?
Habe schon probiert die Iterationsschritte zu erhöhen und mit Levenberg-marquardt zu arbeiten, aber die Lösungen ändern sich nicht
1) das liegt an den unterschiedlichen Workspaces.
Generell wird das so gelöst, dass man ein anonymous Function Handle verwendet und so die Daten verfügbar macht. Bei dir konkret:
2) Wie weit von 0 sind die Funktionswerte weg? Wenn sie sehr weit weg sind, dann heißt das schlicht, dass keine Lösung gefunden wurde.
Wenn eine Lösung gefunden wurde und sie nur nicht genau genug ist, dann würde ich über die Toleranzen gehen.
vielen Dank für die Hilfe, jetzt funktioniert es
Das mit der ungenauen Lösuung von fsolve lag schlicht an der ungenauen Vorgabe der Zeilenwerte von leg_v2 usw.
Jetzt da ich die Variable direkt einlesen passt es perfekt!
gerne doch.
Wenn Ungenauigkeiten in den Parametern starken Einfluss auf die Lösungen haben, so birgt das natürlich auch eine Gefahr in sich: wenn die Parameter mit Unsicherheiten, z.B. Messungenauigkeiten, behaftet sind, wird sich das auf die Lösung des Gleichungssystems übertragen.
Darüber sollte man sich bei der weiteren Verwendung der Lösung im klaren sein.
So, muss das Thema doch nochmal kurz aufgreifen.
Da es ja letztesmal so gut geklappt hat bin ich auch diesesmal guter Hoffnung
Es geht wieder um fsolve nur diesemal ist mein Nichtlineares-Gleichungssystem etwas komplizierter:
Das System hat 12 Gleichungen und 12 Unbekannte ( x(1) - x(12)), müsste also eindeutig lösbar sein...
Gleichung 1-9 dürften für fsolve ja kein Problem darstellen, aber bei den Gleichungen 10,11 und 12 habe ich so meine Bedenken dass das zu kompliziert für fsolve ist
fsolve löst das Ganze, es kommen aber falsche Ergebnisse raus die viel zu hoch sind:
z.B.:
x(1) = -1622518,97337817
x(2) = 39327071,9538859
x(3) = 485359,326670738
...
Kann mir jemand helfen? Kann ich das irgendwie vereinfachen bzw. für fsolve einfacher gestalten?
Ich würde also als erstes überprüfen, ob die Gleichungen tatsächlich stimmen und sich nicht irgendwo ein Vorzeichenfehler oder ähnliches eingeschlichen hat.
Dann würde ich es mit verschiedenen Startwerten probieren.
Man könnte auch über verschiedene Startvektoren iterieren und sehen, wo was vernünftiges herauskommt.
Wie auch vorher erwähnt, exitflag anschauen. Es kann durchaus sein, dass exitflag auf ein Problem hinweist und FSOLVE nur den letzten Punkt zurückgegeben hat.
Für weitere Unterstützung bitte Testdaten für die Parameter zur Verfügung stellen.
Das sind 3 Kugelgleichungen...
Rein mathematisch sollen beim Schnitt dieser 3 Kugeln nur genau ein gesuchter Schnittpunkt entstehen, da die 3 Kugeln tangential aneinander liegen.
Ich habe aus meinen vorangegangenen Berechnungen die Vektoren r_11, r_21 und r_31 ermittelt und anscheinend entstehen bei dieser Berechnung gewisse Ungenauigkeiten die sich auf die Schnittmenge der Kugeln negativ auswirken, d.h. ich bekomme zwei Punkte, die beide nicht stimmen!
Gibt es in Matlab die Möglichkeit diese numerischen Probleme zu minimieren bzw. zu eliminieren?
Geht dies evtl. über die Genauigkeit der Variablen o.ä.?
wie werden r11 etc. ermittelt?
Schneiden sich die Kugeln durch den Fehler gar nicht mehr, oder "mehr" als gewollt?
Ich habe da auch ein Vorstellungsproblem: zwei Kugeln tangential aneinander - klar. Aber wie soll das mit dreien gehen? Oder meinst du, dass zwei tangential sind und die andere "irgendwie" durchläuft?
FSOLVE sollte die Abweichungen minimieren und, wenn es keine Lösung gibt, eine "best-mögliche" Lösung produzieren.
Um mehr helfen zu können, bräuchte ich mehr Infos.
Das ganze läuft bei einer Kinematikberechnung eines Roboters ab.
Ich berechne einmal vom Werkzeug über die Arme zurück zu meinem Basiskoordinatensystem (Rückwärtskinematik) und bekomme während dieser Berechnung meine Vektoren r_11, r_21, r_31, bc_1, bc_2, bc_3, ed_1, ed_2, ed_3, l_1, l_2, l_3.
Diese setze ich dann in der Vorwärtskinematik in dieses Gleichungssystem ein und das Ergebniss also x(1),x(2) und x(3) sind dann die x,y und z Koordinaten meines Werkzeuges. Lieder stimmen diese Werte nicht mit den gegeben Werten im ersten Schritt überein, was darauf schließen lässt, dass bei dem Schnitt der 3 Kugeln der Fehler passiert!
Also 2 Kugeln schneiden sich waagrecht nur tangential in einem Punkt und die dritte schneidet dann wieder nur tangential an diesm Punkt, somit sollte das Gleichungssystem nur eine Lösung haben!
Beispiel:
Ich gebe einen TCP: [30; 1750; 600]
und bekommen einen Direct Kinematics TCP: [-26.9267; 1737.68; 580.906]
Die y und z Werte passen so ca. sind allerdings auch zu ungenau, der x Wert ist irgendwie total falsch, was drauf schließen lässt das sich die Kugeln in zwei Punkten schneiden und mir Matlab irgendeinen davon ausgibt
könntest du entsprechenden Code zur Verfügung stellen?
Das ist für mich leichter nachvollziehbar als verbale Beschreibungen.
Wenn du den falschen Schnittpunkt gefunden hast, war vielleicht der Startwert nicht gut? Sagt FSOLVE denn, dass die Minimumsuche erfolgreich war? Wie sehen die Abweichungen aus? (2. Rückgabeargument)
Hi Harald,
anbei findest du die zutreffenden Dateien, sind einige ich weiß
Inverse_Kinematics.m ist die Main Datei und ruft dann alle anderen auf, Parameter_Inverse_Kinematics liefert die ganzen geomtrischen Parameter usw....
Das sind die ersten 5 Dateien die die inverse Kinematik berechnen, die anderen 2 Dateien bei denen das Problem liegt poste ich einen Beitrag weiter unten.
Sie berechnen dann auch den Ergebnisse der inversen Kinematik die direkte Kinematik.....siehe Problem oben
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.