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

Nicht-lineares Gleichungssystem lösen (fsolve)

 

Maya
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 22.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.12.2012, 14:36     Titel: Nicht-lineares Gleichungssystem lösen (fsolve)
  Antworten mit Zitat      
Hallo ihr Lieben,

ich habe nochmal ne Frage.

Versuche gerade ein nicht-lineares Gleichungssystem über solve zu lösen:

Code:
function F = termin(x)
F = [0.5 - x(4)/x(1) - x(2);
   
x(4)/(x(1) + 3*x(3)) - x(2);
   
(x(4)*log(x(1)+3*x(3)))/x(3) - 3*x(2) -(x(4)*log(x(1)))/x(3) - 1;

-(x(3)*x(4))/x(1)^2 - 2];


und dann über

Code:
x0 = [0.5; 0.8; 1.5; 1];           % Make a starting guess at the solution
options=optimset('Display','iter');   % Option to display output
[x,fval] = fsolve(@termin,x0,options)  % Call solver


Leider will er nicht und spuckt sowas hier raus:

Code:
Error using vertcat
Dimensions of matrices being concatenated are not consistent.

Error in termin (line 2)
F = [0.5 - x(4)/x(1) - x(2);

Error in fsolve (line 241)
            fuser = feval(funfcn{3},x,varargin{:});

Error in loesun (line 3)
[x,fval] = fsolve(@termin,x0,options)  % Call solver
Caused by:
    Failure in initial user-supplied objective function evaluation. FSOLVE cannot
    continue.


Es scheint irgendwas mit dem Startwert nicht zu passen? Habt ihr eine Idee Sad

Vielen Dank

Grüße
Maya
Private Nachricht senden Benutzer-Profile anzeigen


Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.12.2012, 16:20     Titel:
  Antworten mit Zitat      
Hallo,

die Fehlermeldung besagt das bei deiner Funktion was nicht stimmt. Hat also nichts mit Startwerten zu tun. Das hier läuft durch:

Code:

F = @(x) [0.5-x(4)/x(1)-x(2);x(4)/(x(1)+3*x(3))-x(2);(x(4)*log(x(1)+3*x(3)))/x(3)-3*x(2)-(x(4)*log(x(1)))/x(3)- 1;-(x(3)*x(4))/x(1)^2-2];


x0 = [0.5; 0.8; 1.5; 1];           % Make a starting guess at the solution
options=optimset('Display','iter');   % Option to display output
[x,fval] = fsolve(F,x0,options)  % Call solver

 



Wenn du über mehrere Zeilen schreiben willst musst du drei Punkte machen.

viele Grüße
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Maya
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 22.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.12.2012, 17:52     Titel:
  Antworten mit Zitat      
Vielen Dank erstmal,

leider ist die erhaltene Lösung noch etwas unbefriedigend.

Alle Gleichungen sollten eigentlich 0 ergeben....

Ist es außerdem irgendwie möglich eine obere und untere Grenze vorzugeben?
Private Nachricht senden Benutzer-Profile anzeigen
 
Maya
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 22.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.01.2013, 22:13     Titel:
  Antworten mit Zitat      
hat vielleicht noch einer eine Idee?

Bin echt am verzweifeln... Rolling Eyes
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.01.2013, 22:59     Titel:
  Antworten mit Zitat      
Hallo,

ich sehe verschiedene Möglichkeiten:
- lsqnonlin statt fsolve (dann kannst du Schranken angeben)
- manuelles Iterieren über verschiedene Startwerte
- Iterieren über versch. Startwerte mit MultiStart oder GlobalSearch in Verbindung mit lsqnonlin
- genetische Algorithmen (ga)

Ich frage mal so:
- ist das System korrekt aufgestellt?
- bist du sicher, dass es eine Lösung gibt?
- falls ja: kennst du die Lösung?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 22.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.01.2013, 23:02     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank erstmal für die Antwort.

Zu deinen Frage:

Das System ist korrekt aufgestellt. Allerdings weiß ich nicht, ob es eine Lösung gibt und kenne sie somit auch nicht. Gerade das würde ich gerne herausfinden.

Gruß
Maya
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.01.2013, 00:51     Titel:
  Antworten mit Zitat      
Hallo,

dann würde ich mal sehen, was sich analytisch machen lässt.
Die beiden ersten Gleichungen bedeuten, dass

0.5 - x(4)/x(1) = x(4)/(x(1) + 3*x(3))

Zudem kann x(2) = 0.5 - x(4)/x(1) in die weitere Gleichung, in der x(2) vorkommt, eingesetzt werden, so dass 3 Gleichungen mit 3 Unbekannten verbleiben.

Mit etwas Geschick gelingt es dir vielleicht, eine weitere Unbekannte zu eliminieren. Bei zwei Gleichungen mit zwei Unbekannten könnte man dann einen Plot über einer Ebene zulässiger Punkte machen um zu sehen, ob es da eine Lösung gibt, oder das weiter analytisch betrachten.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 22.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.01.2013, 02:29     Titel:
  Antworten mit Zitat      
Hallo Harald,

Vielen Dank nochmal für diese grandiosen Tipps. Habe es tatsächlich geschafft das ganze auf zwei Gleichungen mit x(1) (x) und x(3) (y) zu reduzieren:

\frac{x(1)^2}{5x(3)^2} * \frac{log(x(1)+5*x(3)}{1}  - (0,5 - \frac{x(1)^2}{5x(3)x(1)} )*5 - \frac{x(1)^2}{5x(3)^2} *\frac{log(x(1))}{1} = 1

0,5 - \frac{x(1)}{5x(3)}  = \frac{x(1)^2}{5x(3)*(x(1)+5x(3))}

anschließend habe ich beide Gleichungen gleich 0 gesetzt und dann "gleichgesetzt". Als Ergebnis erhält man

\frac{x(1)^2}{5x(3)^2} * \frac{log(x(1)+5*x(3)}{1}  - (0,5 - \frac{x(1)^2}{5x(3)x(1)} )*5 - \frac{x(1)^2}{5x(3)^2} *\frac{log(x(1))}{1} -1 = (0,5 - \frac{x(1)}{5x(3)} ) - \frac{x(1)^2}{5x(3)*(x(1)+5x(3))}

Auch hier habe ich so umgeformt, dass auf der rechten Seite wieder eine 0 steht.

\frac{x(1)^2}{5x(3)^2} * \frac{log(x(1)+5*x(3)}{1}  - (0,5 - \frac{x(1)^2}{5x(3)x(1)} )*5 - \frac{x(1)^2}{5x(3)^2} *\frac{log(x(1))}{1} -1 - (0,5 - \frac{x(1)}{5x(3)} ) + \frac{x(1)^2}{5x(3)*(x(1)+5x(3))} = 0

Das habe ich nun versucht in Matlab reinzubringen:


Code:
clear all
clc
close all

x=0:0.005:2
y=0:0.005:2;

[X,Y]=meshgrid(x,y);

for i=1:1:length(x)
   
    for j = 1:1:length(y)

    Z(j,i) = ((X(j,i)^2*log(X(j,i)+5*y(j)))/(5*y(j)^2) - (0.5 - (X(j,i)^2)/5*y(j)*X(j,i))*5 - (X(j,i)^2*log(X(j,i)))/(5*y(j)^2)) - 1 -(0.5 - X(j,i)/(5*y(j))) + (X(j,i)^2)/(5*y(j)*(X(j,i)+y(j)*5));
    end
end

surf(X,Y,Z); xlabel('x(1)'); ylabel('x(3)')
shading interp;

hold on

Z1 = zeros(length(x),length(y))

surf(X,Y,Z1)


Als Plot-Ergebnis erhalte ich das hier:



Auf der Kurve wo die Ebene die "0/0 Ebene" schneidet, sind jetzt nun meine Lösungen?

Ich hoffe du kannst mein Vorgehen nochmal nachvollziehen und bestätigen.

Vielen Dank nochmal!

Gruß
Maya
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ich habe die Gleichungen jetzt nicht nachkontrolliert oder so.

Was du aber brauchst: zwei Gleichungen für x1 und x3, und die müssen beide 0 sein. Dass die linken Seiten dieser beiden Gleichungen gleich sind, heißt ja dann noch nicht, dass sie 0 sind.
Dann kannst du entweder beide Oberflächen plotten und schauen, ob sie sich in der z=0-Ebene überlappen (das wäre dann eine Lösung) oder die Summe der Quadrate der Abweichungen bei beiden Gleichungen als Oberfläche plotten und schauen, wann das die z=0-Ebene berührt.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 22.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.01.2013, 22:13     Titel:
  Antworten mit Zitat      
Ja, das war natürlich etwas dämlich von mir die Gleichungen nicht getrennt zu behandeln... Danke

Ich habe jetzt 2 Ebenen und die Schnittkurve verläuft tatsächlich durch die z-Ebene:


Es gibt also eine Lösung. Ich habe den Wert graphisch so gut es geht abgelesen und die Überprüfung hat so in etwa hin.

Da ich die ganze Sache später für verschiedene Parameter (also viele verschiedene Gleichungssysteme) ausrechnen muss, wäre eine etwas "automatischere Lösung" (wenn denn wie vorliegend eine existiert) natürlich hilfreich.

Hast du da evtl. eine Idee?

Danke nochmal
Grüße
Maya
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.01.2013, 23:16     Titel:
  Antworten mit Zitat      
Hallo,

hast du denn mit besseren Startwerten eine Lösung gefunden?

Ansonsten kann ich nur auf meine Vorschläge aus 03.01.2013, 21:59 (Teil 1) verweisen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 22.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.01.2013, 00:56     Titel:
  Antworten mit Zitat      
leider nicht so wirklich...

wenn ich das hier eingebe
Code:
clear all
clc

F = @(x) [-0.6+(x(4)/x(1))-x(2);x(4)/(x(1)+5*x(3))-x(2);(x(4)*log(x(1)+5*x(3)))/x(3)-5*x(2)-(x(4)*log(x(1)))/x(3)- 1;-(x(3)*x(4))/x(1)^2+0.2];


x0 = [1.35; 0.9172; 0.1897; 2.2];           % Make a starting guess at the solution
options=optimset('Display','iter');   % Option to display output
[x,fval] = lsqnonlin(F,x0,[0; 0; 0; 0],[2; 2; 2; 2 ],options)  % Call solver
 


Code:
kommt das hier:

x =

    0.9995
    0.6725
    0.1845
    1.2347


fval =

    0.0032


warum erhalte ich nur einen fval Wert? Müssten es nicht 4 sein, damit ich die Näherungsgüte überprüfen kann?

Würde jetzt gerne nochmal einen letzten Versuch mit globalsearch starten:

Code:
clear all
clc

F = @(x) [-0.6+(x(4)/x(1))-x(2);x(4)/(x(1)+5*x(3))-x(2);(x(4)*log(x(1)+5*x(3)))/x(3)-5*x(2)-(x(4)*log(x(1)))/x(3)- 1;-(x(3)*x(4))/x(1)^2+0.2];


x0 = [1.35; 0.9172; 0.1897; 2.2];           % Make a starting guess at the solution


ms = MultiStart;

problem = createOptimProblem('fmincon','x0',x0,'objective',F,'lb',[0; 0; 0; 0],'ub',[2; 2; 2; 2 ]);

[xmin,fmin,flag,outpt,allmins] = run(ms,problem,30);


leider will er nicht richtig...

Code:
Error using fmincon (line 704)
User supplied objective function must return a scalar value.

Error in
/Applications/MATLAB_R2012b.app/toolbox/globaloptim/globaloptim/private/fmultistart.p>fmultistart
(line 34)


Error in MultiStart/run (line 246)
           [x,fval,exitflag,output,solutions] = ...

Error in hiwimodell (line 17)
[xmin,fmin,flag,outpt,allmins] = run(ms,problem,30);

Caused by:
    Failure in evaluation call to the local solver with user-supplied problem
    structure.



Verstehe das nicht Question

Grüße
Maya
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ich hole mal etwas aus. Wenn man vier Gleichungen lösen will, gibt es verschiedene Möglichkeiten:

- fsolve: geht das direkt an.
- lsqnonlin: minimiert automatisch norm(F(x))^2. Eine Lösung liegt dann vor, wenn das Minimum [bis auf die Toleranz] Null ist.
- fmincon: kann nur mit skalaren Zielfunktionen umgehen. Wenn man fmincon verwenden möchte, muss man also F2 = @(x) norm(F(x)) als Zielfunktion verwenden.
Bei den beiden letzten kannst du anschließend x wieder in F einsetzen, um alle F-Werte zu bekommen.

Ich würde aber lsqnonlin gegenüber fmincon bevorzugen, da hier die Problemstruktur besser ausgenutzt wird.

1. Versuch: leider ist das keine Lösung, da die Abweichung von 0.0032 auch dann bestehen bleibt, wenn man TolFun verkleinert, um die Genauigkeit zu erhöhen.

2. Versuch: scheitert daran, dass fmincon eine skalare Zielfunktion benötigt. Es funktioniert entweder so:
Code:
opts = optimset('TolFun', 1e-9);
problem = createOptimProblem('lsqnonlin','x0',x0,'objective',F,'lb',[0; 0; 0; 0],'ub',[2; 2; 2; 2 ], 'options', opts);

oder so
Code:
opts = optimset('TolFun', 1e-9);
problem = createOptimProblem('fmincon','x0',x0,'objective',@(x)norm(F(x)),'lb',[0; 0; 0; 0],'ub',[2; 2; 2; 2 ], 'options', opts);


Das Problem ist so oder so, dass selbst ein x-Wert, der die Gleichungen am besten erfüllt, keine Lösung ist.
Was ich interessant finde: ich bekomme jedes Mal einen andere Lösung, die diese geringe Abweichung hat. Ich habe also den Eindruck, dass das Gleichungssystem quasi keinen vollen Rang hat.

Weitere Fragen/Anmerkungen:
- sind die Grenzen so sinnvoll, d.h. gehen sie aus der praktischen Anwendung hervor?
- log ist (im Gegensatz zu manchen Büchern) der natürliche Logarithmus. Der Logarithmus mit Basis 10 wäre log10.

Grüße,
Harald
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 - 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.