Verfasst am: 23.06.2020, 20:52
Titel: Nullstellensuche eines nichtlinearen Gleichungssystems
Hallo zusammen,
ich möchte gerne einen Vektor u (Dimension 3x1) so bestimmen, dass 10 Funktionsausdrücke 0 werden. Ich habe die 10 Formeln in eine Funktion geschrieben.
Code:
% bekannte, feste Werte
d = 5*sqrt(5);
% auch x11, ... sind bekannte Vektoren mit jeweils der Dimension 2x1
x = [x11;x12;x13;x21;x22;x23];
% jede Zeile soll mit dem optimalem Vektor u zu 0 werden % x und d: Verwendung der bekannten Werte von oben
F = @(u,x,d)[u(1)^2 + u(2)^2 - d^2;
u(1)^2 + u(2)^2-2*x(1)*u(1)-2*x(2)*u(2)-norm(x(7:8))^2+x(1)^2+x(2)^2;
u(1)^2 + u(2)^2-2*x(3)*u(1)-2*x(4)*u(2)-norm(x(9:10))^2+x(3)^2+x(4)^2;
u(1)^2 + u(2)^2-2*x(5)*u(1)-2*x(6)*u(2)-norm(x(11:12))^2+x(5)^2+x(6)^2;
cosd(u(3))*x(7) - sind(u(3))*x(8) - (x(1)-u(1));
sind(u(3))*x(7) + cosd(u(3))*x(8) - (x(2)-u(2));
cosd(u(3))*x(9) - sind(u(3))*x(10) - (x(3)-u(1));
sind(u(3))*x(9) + cosd(u(3))*x(10) - (x(4)-u(2));
cosd(u(3))*x(11) - sind(u(3))*x(12) - (x(5)-u(1));
sind(u(3))*x(11) + cosd(u(3))*x(12) - (x(6)-u(2))];
Dann habe ich mit lscurvefit versucht den Vektor u zu berechnen:
Code:
% Nullvektor, der die gleiche Dimension wie x besitzt
v = zeros(12,1);
% Startwert für u
u0 = [0;0;0];
% untere Grenze
lb = [0;0;-180.01];
% obere Grenze
ub = [100;100;180.01];
% u = gefundener Vektor [u,resnorm,residual,exitflag,output] = lsqcurvefit(F,u0,x,d,v,lb,ub);
Die Lösung, die zurückgegeben wird, ist [0;0;0], also entspricht einfach dem Startvektor und ist nicht die Lösung, die eigentlich berechnet werden sollte.
Die Lösung, für die alle Formeln 0 ergeben, ist: u = [11;-2;-45]
Hat jemand eine Idee, was ich anders machen kann um u so zu bestimmen, dass alle 10 Formeln zu 0 werden? Gibt es eine andere Funktion mit dem ich dieses Nullstellenproblem lösen kann? Ich möchte am Ende auf die Lösung u = [11;-2;-45] kommen.
2 Sachen die mir auffallen: Dein Lösungsvektor v ist 12x1, nicht 10x1 und deine bekannte Lösung liegt außerhalb deiner Bounds. Ich bezweifle allerdings, dass dadurch die Fehlermeldung hervorgerufen wird. Kannst du uns noch die Werte für x11, x23 etc. geben, dann probiere ich das ganze mal aus.
Dein Lösungsvektor v ist 12x1, nicht 10x1 und deine bekannte Lösung liegt außerhalb deiner Bounds
Oh stimmt, das ist noch falsch...
Die ersten beiden Werte der unteren Grenze müssten bei -100 liegen.
Es kann sein, das da aber generell etwas mit den Dimensionen nicht passt, da ich 10 Gleichungen habe, die 0 werden müssen, und der Funktion aber u (3x1), x (12x1) und d(1x1) übergebe... Muss die Anzahl der Gleichungen immer mit der Dimension der Eingabevektoren übereinstimmen? Wenn ja, gibt es einen andere Möglichkeit, wie man mein Problem anders aufstellen kann, um zu der gewünschten Lösung zu kommen?
Mein Gleichungssystem ist generell überbestimmt, man würde also wahrscheinlich auch mit weniger Gleichungen auf das richtige Ergebnis kommen, aber ich möchte gerne, das geprüft wird, ob alle 10 Gleichungen 0 werden.
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.