Verfasst am: 21.08.2020, 09:48
Titel: Optimale Lösung eines nichtlinearen Gleichungsystems finden
Hallo zusammen,
ich habe ein nichtlineares Gleichungssystem mit 13 Gleichungen aufgestellt und möchte 9 Unbekannte so berechnen, dass alle 13 Gleichungen 0 werden. Meine Punkte, die ich dem Gleichungssystem übergebe lauten:
Code:
% ein Beispiel
d = 17;
x11 = [1;6;6];
x12 = [-1;8;1];
x13 = [-2;14;2];
x21 = [6;-1;11];
x22 = 0.5*[1;1;9];
x23 = 0.25*[2;2;3];
Hierbei ist ts ein Vektor mit den Unbekannten, die optimiert werden sollen. Ich habe versucht, dass mit der Funktion lsqcurvefit zu lösen, jedoch kommt nur das richtige Ergebnis raus, wenn ich die richtige Lösung als Startvektor eingebe.
Code:
% Startwert
ts0 = [0;0;0;0;0;0;1;1;1];
% untere Grenze
lb = [-10;-20;-10;-180;-180;-180;0.1;0.1;0.1];
% obere Grenze
ub = [10;20;10;180;180;180;10;10;10];
[ts,resnorm,residual,exitflag,output] = lsqcurvefit(F,ts0,x,x_0,lb,ub);
%ts = [0;17;0;90;-90;0;1;2;4]; = richtige Lösung, die berechnet werden soll
Sobald ich als Startvektor nicht den Lösungsvektor (z.B den in dem Code oben) eingebe, erhalte ich eine Lösung, die sehr weit weg von der gewollten Lösung liegt. Hat jemand eine Idee, wie ich meine Berechnung verändern kann, um auf die richtige Lösung ts = [0;17;0;90;-90;0;1;2;4] zu kommen? Ich hatte schon versucht, dass mit lsqnonlin zu lösen, was jedoch auch nicht gut funktioniert hat. Das Gleichungsystem ist richtig aufgestellt, da für den Beispielfall mit der Lösung das richtige Ergebnis rauskommt. Im Normalfall kenne ich die richtige Lösung jedoch nicht und es wäre git, wenn der Algorithmus mir zuverlässig eine Lösung, die sehr nah an der richtigen Lösung liegt wenn möglich zurückgeben.
Zuverlässig wird aber auch das genau genommen nicht sein. Mit einer ausreichend großen Anzahl an Startpunkten hast du nur eine hohe Wahrscheinlichkeit, die richtige Lösung zu finden.
Die Alternative ist leider nur, in welcher Form auch immer ausreichend gute Startwerte zu ermitteln.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Danke für die Antwort! Ich habe es mit lsqnonlin ausprobiert, jedoch war auch hier das Ergebnis nicht zufrieden stellend. Jetzt habe ich Multistart ausprobiert, bin mir aber nicht sicher, was ich für "preal" eingeben. Die Unbekannten kenne ich ja eigentlich noch nicht...
Mein Code sieht folgendermaßen aus (mit den selben Startwerten wie oben):
rng default % For reproducibility
N = 400; % Number of data points
preal = [0,15,0,90,-80,0]; % was setze ich hier ein? Bei meinem Beispiel weiß ich, was als Ergebnis rauskommen soll und kann das hier einsetzten, aber bei der eigentlichen Berechnung weiß ich das nicht
Wenn ich für preal nicht etwas einsetzte, was in der Nähe der Lösung liegt wird die richtige Lösung ts=[0;17;0;90;-90;0] nicht gefunden. Hat jemand eine Idee, was ich hier noch verändern kann, um vielleicht näher an die Lösung, die ich suche, ranzukommen?
wieso denn jetzt wieder lsqcurvefit? Das ist nicht wirklich sinnvoll, wenn man keine Kurvenanpassung machen möchte.
Meine Empfehlung wäre wirklich MultiStart um lsqnonlin herum.
Ich habe das mal mehrfach laufen lassen und finde jedes Mal eine Lösung (errormulti = 0), aber jedes Mal eine andere. Die Lösung ist also nicht eindeutig und man müsste wissen, was die gewünschte Lösung gegenüber den anderen auszeichnet.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Ja ich habe das erstmal versucht so aufzubauen, wie auf der Seite für MultiStart um das auszuprobieren, aber danach wollte ich auch wieder lsqnonlin benutzen...
Kannst du deinen Code hier mal reinstellen, mit dem du immer unterschiedliche, aber gut Lösungen mit errormulti = 0 Lösungen rausbekommen hast? Ich bekomme das irgendwie nicht so aufgestellt, dass etwas gutes bei rauskommt. Danke!
Es kommt zwar nicht genau 0 raus, aber etwas wie 1e-21. Das sollte reichen? ;)
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Einstellungen und Berechtigungen
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.