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

Probleme mit fsolve

 

Paprika_25
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 04.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2011, 09:17     Titel: Probleme mit fsolve
  Antworten mit Zitat      
Hallo Leute,

vorab, ja ich habe die doc zu fsolve mehrfach gelesen, trotzdem komme ich nicht drauf warum mein Programm nicht funktioniert Crying or Very sad

Das ist mein Code
Code:
function F = myfun(x, y)
F = [y(3) * y(1) - x(3) * y(2) * x(1) - 5;
     -y(3) * x(1) - x(3) * y(2) * y(1) - 3;
     x(3) * x(2) - 2;
     x(1)^2 + y(1)^2 - 1;
     x(2)^2 + y(2)^2 - 1;
     x(3)^2 + y(3)^2 - 1];


Und das ist mein Hauptprogramm mit dem ich die Funktion aufrufe zum lösen:

Code:
x0 = [-5; -5];          
options=optimset('Display','iter');  
[x,y,fval] = fsolve(@myfun,x0,options);
 


Matlab zeigt den Fehler an:

Input argument "y" is undefined.
Error in ==> myfun at 2
F = [y(3) * y(1) - x(3) * y(2) * x(1) - 5;

....dabei ist doch alles so aufgebaut wie im Beispiel
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.07.2011, 09:24     Titel:
  Antworten mit Zitat      
Hallo,

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.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 04.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2011, 09:34     Titel:
  Antworten mit Zitat      
Ah okay, das hat mir schonmal sehr geholfen Very Happy

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.


ab.

Kann man da was dagegen machen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

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?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 04.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2011, 08:58     Titel:
  Antworten mit Zitat      
Hi Harald,

vielen Dank für den Tipp, es hat tatsächlich das Gleichungssystem nicht gestimmt Embarassed

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 Crying or Very sad


Hier mein Quellcode:
- Funktion
Code:
function F = Eta1(x)
F = [x(6) * x(4) - x(3) * x(5) * x(1) - (leg_v2(1,1)/ l);
     -x(6) * x(1) - x(3) * x(5) * x(4) - (leg_v2(2,1)/ l);
     x(3) * x(2) + (leg_v2(3,1)/ l);
     x(1)^2 + x(4)^2 - 1;
     x(2)^2 + x(5)^2 - 1;
     x(3)^2 + x(6)^2 - 1];


-Aufruf in der Main
Code:
x0 = [0.5; 0.1; 0.5; 0; 0.2; 0.01];
            [x ,fval] = fsolve(@Eta1,x0,{'levenberg-marquardt',.1});
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.07.2011, 10:25     Titel:
  Antworten mit Zitat      
Hallo,

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:

Code:
function F = Eta1(x, leg_v2, l)
F = [x(6) * x(4) - x(3) * x(5) * x(1) - (leg_v2(1,1)/ l);
     -x(6) * x(1) - x(3) * x(5) * x(4) - (leg_v2(2,1)/ l);
     x(3) * x(2) + (leg_v2(3,1)/ l);
     x(1)^2 + x(4)^2 - 1;
     x(2)^2 + x(5)^2 - 1;
     x(3)^2 + x(6)^2 - 1];  

und der angepasste Aufruf
Code:
x0 = [0.5; 0.1; 0.5; 0; 0.2; 0.01];
l = ...
leg_v2 = ...
[x ,fval] = fsolve(@(x)Eta1(x, leg_v2, l) ,x0)



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.
Code:
opts = optimset('TolX', 1e-6, 'TolFun', 1e-6)
[x ,fval, exitflag] = fsolve(@(x)Eta1(x, leg_v2, l) ,x0, opts)

... und dann exitflag ansehen, um Aussagen über die Korrektheit der Lösung machen zu können.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 04.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2011, 10:34     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für die Hilfe, jetzt funktioniert es Very Happy
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!

Vielen Dank dir! Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.07.2011, 10:39     Titel:
  Antworten mit Zitat      
Hallo,

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.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 04.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2011, 15:30     Titel:
  Antworten mit Zitat      
So, muss das Thema doch nochmal kurz aufgreifen.
Da es ja letztesmal so gut geklappt hat bin ich auch diesesmal guter Hoffnung Wink
Es geht wieder um fsolve nur diesemal ist mein Nichtlineares-Gleichungssystem etwas komplizierter:

Code:
function F = Direct_Leg_Calc(x, r_11, r_21, r_31, bc_1, bc_2, bc_3, ed_1, ed_2, ed_3, norm_tri12, norm_tri23, norm_tri31)
F = [   r_11(1,1) + bc_1(1,1) + x(1) - ed_1(1,1) - x(10);
        r_11(2,1) + bc_1(2,1) + x(2) - ed_1(2,1) - x(11);
        r_11(3,1) + bc_1(3,1) + x(3) - ed_1(3,1) - x(12);
        r_21(1,1) + bc_2(1,1) + x(4) - ed_2(1,1) - x(10);
        r_21(2,1) + bc_2(2,1) + x(5) - ed_2(2,1) - x(11);
        r_21(3,1) + bc_2(3,1) + x(6) - ed_2(3,1) - x(12);
        r_31(1,1) + bc_3(1,1) + x(7) - ed_3(1,1) - x(10);
        r_31(2,1) + bc_3(2,1) + x(8) - ed_3(2,1) - x(11);
        r_31(3,1) + bc_3(3,1) + x(9) - ed_3(3,1) - x(12);
        ((r_11(1,1) + bc_1(1,1) + x(1)) - (r_21(1,1) + bc_2(1,1) + x(4)))^2 + ((r_11(2,1) + bc_1(2,1) + x(2)) - (r_21(2,1) + bc_2(2,1) + x(5)))^2 + ((r_11(3,1) + bc_1(3,1) + x(3)) - (r_21(3,1) + bc_2(3,1) + x(6)))^2 - norm_tri12^2;
        ((r_21(1,1) + bc_2(1,1) + x(4)) - (r_31(1,1) + bc_3(1,1) + x(7)))^2 + ((r_21(2,1) + bc_2(2,1) + x(5)) - (r_31(2,1) + bc_3(2,1) + x(8)))^2 + ((r_21(3,1) + bc_2(3,1) + x(6)) - (r_31(3,1) + bc_3(3,1) + x(9)))^2 - norm_tri23^2;
        ((r_31(1,1) + bc_3(1,1) + x(7)) - (r_11(1,1) + bc_1(1,1) + x(1)))^2 + ((r_31(2,1) + bc_3(2,1) + x(8)) - (r_11(2,1) + bc_1(2,1) + x(2)))^2 + ((r_31(3,1) + bc_3(3,1) + x(9)) - (r_11(3,1) + bc_1(3,1) + x(3)))^2 - norm_tri31^2];
       
 


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 Crying or Very sad

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?

Danke!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.07.2011, 19:26     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Das System hat 12 Gleichungen und 12 Unbekannte ( x(1) - x(12)), müsste also eindeutig lösbar sein...

Da will ich doch protestieren. Es geht ja schon, dass 2 Gleichungen in 2 Unbekannten keine Lösung haben, z.B.:
Code:
x1 + x2 = 3
x1 + x2 = 4

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.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 04.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.07.2011, 11:12     Titel:
  Antworten mit Zitat      
Hallo Harald,

also mein Gleichungssystem hat in der Tat nicht ganz gestimmt, ich habe nun ein neues aufgestellt welches folgendermaßen aussieht:

Code:
function F = Direct_Leg_Calc(x, r_11, r_21, r_31, bc_1, bc_2, bc_3, ed_1, ed_2, ed_3, l_1, l_2, l_3)
F = [   (x(1) - (r_11(1,1) + bc_1(1,1) - ed_1(1,1)))^2 + (x(2) - (r_11(2,1) + bc_1(2,1) - ed_1(2,1)))^2 + (x(3) - (r_11(3,1) + bc_1(3,1) - ed_1(3,1)))^2 - l_1^2;
        (x(1) - (r_21(1,1) + bc_2(1,1) - ed_2(1,1)))^2 + (x(2) - (r_21(2,1) + bc_2(2,1) - ed_2(2,1)))^2 + (x(3) - (r_21(3,1) + bc_2(3,1) - ed_2(3,1)))^2 - l_2^2;
        (x(1) - (r_31(1,1) + bc_3(1,1) - ed_3(1,1)))^2 + (x(2) - (r_31(2,1) + bc_3(2,1) - ed_3(2,1)))^2 + (x(3) - (r_31(3,1) + bc_3(3,1) - ed_3(3,1)))^2 - l_3^2;];


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.ä.?

Danke für eure Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.07.2011, 19:24     Titel:
  Antworten mit Zitat      
Hallo,

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.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 04.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.07.2011, 09:03     Titel:
  Antworten mit Zitat      
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! Rolling Eyes

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 Crying or Very sad
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.07.2011, 19:12     Titel:
  Antworten mit Zitat      
Hallo,

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)

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 04.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2011, 13:42     Titel:
  Antworten mit Zitat      
Hi Harald,
anbei findest du die zutreffenden Dateien, sind einige ich weiß Rolling Eyes
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

Calc_Trans_RB_R2.m
 Beschreibung:

Download
 Dateiname:  Calc_Trans_RB_R2.m
 Dateigröße:  403 Bytes
 Heruntergeladen:  341 mal
Calc_Trans_RB_R1.m
 Beschreibung:

Download
 Dateiname:  Calc_Trans_RB_R1.m
 Dateigröße:  403 Bytes
 Heruntergeladen:  344 mal
Leg_Calculation_Inverse_Kinematics.m
 Beschreibung:

Download
 Dateiname:  Leg_Calculation_Inverse_Kinematics.m
 Dateigröße:  2.06 KB
 Heruntergeladen:  342 mal
Parameter_Inverse_Kinematics.m
 Beschreibung:

Download
 Dateiname:  Parameter_Inverse_Kinematics.m
 Dateigröße:  4.67 KB
 Heruntergeladen:  319 mal
Inverse_Kinematics.m
 Beschreibung:
Main Datei

Download
 Dateiname:  Inverse_Kinematics.m
 Dateigröße:  11.26 KB
 Heruntergeladen:  350 mal
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.