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

Nullstellensuche eines nichtlinearen Gleichungssystems

 

Matlab_lm
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 23.06.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.06.2020, 21:52     Titel: Nullstellensuche eines nichtlinearen Gleichungssystems
  Antworten mit Zitat      
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);

 


Da erhalte ich aber diese Warnung:

Code:


Warning: Length of lower bounds is > length(x); ignoring extra bounds.
> In checkbounds (line 27)
  In lsqnsetup (line 77)
  In lsqcurvefit (line 210)
  In test (line 47)
Exiting due to infeasibility:  1 lower bound exceeds the corresponding upper bound.

 


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.
Private Nachricht senden Benutzer-Profile anzeigen


T16
Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 31.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.06.2020, 09:47     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Matlab_lm
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 23.06.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.06.2020, 10:15     Titel:
  Antworten mit Zitat      
Die bekannten Werte sind diese:

Code:


d = 5*sqrt(5);

x11 = [5;5];
x12 = [19;6];
x13 = [13;4];

x21 = [-6.5*sqrt(2);0.5*sqrt(2)];
x22 = [0;8*sqrt(2)];
x23 = [-2*sqrt(2);4*sqrt(2)];

 


Zitat:

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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 - 2024 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.