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

Problem bei Fsolve - nichtlineares Gleichungssystem zu löse

 

Pumuckl

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2013, 22:47     Titel: Problem bei Fsolve - nichtlineares Gleichungssystem zu löse
  Antworten mit Zitat      
Hallo, ich bekomme beim Lösen eines nichtlinearen Gleichungssystems einen Fehler, den ich nicht verstehe und wo ich auch unter Help nicht weiter komme:

ich habe die Datei f.m erstellt, in der die zu lösenden 4 Gleichungen abgebildet werden mit:

Code:
function z=f(x)

% Temperatur [K]
Temp=353.15;
% Pressure [MPa]
Ptot=8;

A=8800;
B=5.04;
h1=4.25;
h2=1.88;
% strut length [m]
de = 0.38e-3;
% dynamic viscosity of hydrogen at 353.15 K [uPa*s]

muG=10.166;


muL=0.001;

g= 9.8;

eps=0.91;
% packing

epsL0=0.115;

rohG=5.27;
rohL=1100;

DR=0.038;

L=0.4;

VpointL= 5;

uL=(VpointL/1000/60)/(3.14*DR^2/4);

ReL=rohL*uL*de/(muL*(1-eps));

GaL=rohL^2*g*de^3*eps^3/(muL^2*(1-eps)^3);

mpointG=1;

uG=mpointG/rohG;

ReG=rohG*uG*de/(muG*(1-eps));

GaG=rohG^2*g*de^3*eps^3/(muG^2*(1-eps)^3);

sigmaL=0.1;


Eostar=rohL*g*de^2*eps/(sigmaL*(1-eps)^2);

SL0=1/(eps*(20+0.9*Eostar));

x0=[1.1982 0.0354 1 0.0082]';

z=[(1/(x(2)/eps)^h1)*(A*ReG/GaG+B*ReG^2/GaG)*rohG*g-x(1)/x(2);(1/(((x(4)/eps)-SL0)/(1-SL0))^h2)*(A*ReL/GaL+B*ReL^2/GaL)*rohL*g-x(3)/x(4);x(1)/x(2)-x(3)/x(4)+(rohG-rohL)*g;eps-x(2)-x(4)];
 

und dann die Datei x.m mit:
x=fsolve('f(x)',[1.1982;0.0354;1;0.0082])


Hierbei bekomme ich Ergebnisse, die aber sinnlos sind und eine Fehlermeldung:

Warning: Cannot determine from calling sequence whether to use new
(2.0 or later) FSOLVE function or grandfathered FSOLVE function.
Assuming new syntax; if call was grandfathered FSOLVE syntax,
this may give unexpected results.
To force new syntax and avoid warning, add options structure argument:
x = fsolve(@sin,3,optimset('fsolve'));
To force grandfathered syntax and avoid warning, add options array argument:
x = fsolve(@sin,3,foptions);

> In C:\Programme\MATLAB\toolbox\optim\fsolve.m (parse_call) at line 389
In C:\Programme\MATLAB\toolbox\optim\fsolve.m at line 101
In C:\Programme\Matlab\work\x.m at line 1
Maximum number of function evaluations reached:
increase options.MaxFunEvals

x =

1.0e+004 *

0.2078 - 0.1607i
0.0043 + 0.0005i
1.0756 + 1.0280i
-0.0002 - 0.0003i

Kann mir jemand sagen, was ich falsch gemacht habe? Ich habe mich an einem Beispiel aus einem Buch langgehangelt. Aber unter der Suche Help taucht "grandfather" nicht auf und ich weiss nicht, ob, was und warum ich etwas ergänzen könnte, das hilft zu sinnvollen Ergebnissen zu kommen.


Harald
Forum-Meister

Forum-Meister


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

schau doch mal in die Dokumentation von fsolve.
Die Fehlermeldung lässt mich vermuten, dass du eine ältere MATLAB-Version verwendest.

Ich würde es mit
Code:
x=fsolve(@f,[1.1982;0.0354;1;0.0082])

versuchen.

Grüße,
Harald

P.S. eine Datei x.m und eine Variable x führt schnell zu Verwirrungen. Ich würde etwas mehr Kreativität versuchen ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Pumuckl

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2013, 19:30     Titel:
  Antworten mit Zitat      
benutze Version 6.5. Habe nun den Dateinamen x geändert,
x=fsolve(@f,[1.1982;0.0354;1;0.0082])
entsprechend dem Vorschlag geändert, komme aber immer noch auf unrealistische Ergebnisse und die Warnung

>> Warning: Cannot determine from calling sequence whether to use new
(2.0 or later) FSOLVE function or grandfathered FSOLVE function.
Assuming new syntax; if call was grandfathered FSOLVE syntax,
this may give unexpected results.
To force new syntax and avoid warning, add options structure argument:
x = fsolve(@sin,3,optimset('fsolve'));
To force grandfathered syntax and avoid warning, add options array argument:
x = fsolve(@sin,3,foptions);

> In C:\Programme\MATLAB\toolbox\optim\fsolve.m (parse_call) at line 389
In C:\Programme\MATLAB\toolbox\optim\fsolve.m at line 101
In C:\Programme\Matlab\work\Loeser.m at line 1
Maximum number of function evaluations reached:
increase options.MaxFunEvals

x =

1.0e+004 *

0.2078 - 0.1607i
0.0043 + 0.0005i
1.0756 + 1.0280i
-0.0002 - 0.0003i

Was ich auch nicht verstehe ist, ich habe gar keine Line 101 und fsolve.m Datei. Legt er diese selbst an? Ich komm hier nicht wirklich weiter.
 
Harald
Forum-Meister

Forum-Meister


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

6.5 ist eine sehr alte Version, da kann ich nur begrenzt weiterhelfen. Lies bitte (wie zuvor gesagt) die Dokumentation von fsolve
Code:


Zitat:
ich habe gar keine Line 101 und fsolve.m Datei.

natürlich nicht, aber hinter den meisten Funktionen stecken letztlich .m-Dateien, und du rufst ja fsolve auf.

Da ich nicht weiß, was "packing" macht, kann ich auch nicht sagen, ob du mit neueren MATLAB-Versionen mehr Glück hättest.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2013, 22:56     Titel:
  Antworten mit Zitat      
so, habe nun die frische Version 2012A drauf und es hat sich die Fehlermeldung geändert.
Solver stopped prematurely.

fsolve stopped because it exceeded the function evaluation limit,
options.MaxFunEvals = 400 (the default value).


x1 =

1.0e+05 *

1.8424 - 0.4667i
0.0001 + 0.0000i
-0.1388 + 0.0455i
-0.0000 - 0.0000i

EDU>>
Es klingt so als würde es abbrechen, bevor es konvergiert, interpretiere ich das richtig? Eigentlich sollte hier etwas ohne i drin rauskommen, sprich ganz normale Zahlen, nichts komplexes
 
Harald
Forum-Meister

Forum-Meister


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

du kannst die Anzahl der Iterationen erhöhen. Ich vermute aber, dass das Problem woanders liegt.
Kommt beim Startwert ein reeller Wert zurück? Wenn ja, sollte man die komplexen Ergebnisse über Nebenbedingungen (Schranken kann man z.B. in lsqnonlin angeben) abfangen.
Wie gesagt: wirklich weiterhelfen kann man dir nicht, wenn man nicht weiß, was "packing" macht.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2013, 19:41     Titel:
  Antworten mit Zitat      
hallo,
das wort packing ist da nur reingerutscht, sollte mit einem % versehen sein und beeinflusst es nicht.
Wie ändere ich denn die voreingestellten 400?
Ich habe es unter options gesucht, aber offensichtlich mache ich die Syntax falsch, denn es sagt mir, es hätte jetzt zu viele/zu wenige Variablen, je nachdem, wo ich optimset einsetzen wollte und fval zum anzeigen.
 
Pumuckl

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2013, 19:49     Titel:
  Antworten mit Zitat      
auch wenn ich fsolve durch lsqnonlin ersetze, ergibt sich ein Abbruch nach 400 Zyklen und es kommen komplexe Werte raus.
 
Harald
Forum-Meister

Forum-Meister


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

gehe bitte immer gleich auf alle Fragen ein.
Da packing auskommentiert werden kann, konnte ich das nun reproduzieren.

Code:
format shortg
f([1.1982;0.0354;1;0.0082])
ans =
   1.2424e+15              
   1.8865e+07 + 7.4692e+06i
       -10816              
       0.8664


Wenn du einen Startwert angibst, der komplexwertige Rückgabe liefert, ist es nicht weiter verwunderlich, wenn das auch so bleibt. Darauf hatte ich dich auch schon hingewiesen.

Die Optionen könntest du so setzen:
Code:
opts = optimset('MaxFunEvals', 4000);
x=fsolve(@f,[1.1982;0.0354;1;0.0082], opts)
aber das hilft nicht gegen den schlechten Startwert.

lsqnonlin erlaubt das Setzen von Schrankenbedingungen, macht aber ansonsten nichts wesentlich anderes.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.01.2013, 20:34     Titel:
  Antworten mit Zitat      
vielen Dank, dies hat mir schon viel Verständnis gebracht, jetzt arbeite ich an den Startwerten, vielen Dank!
 
Pumuckl

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.01.2013, 18:41     Titel:
  Antworten mit Zitat      
jetzt werd ich verrückt. Als ich Deinen Vorschlag gestern eingegeben habe, ist es durchgelaufen. Jetzt passe ich die Ausgangswerte und Startwerte auf die aktuellen Messwerte an und es stoppt wieder nach 400 Iterationen, obwohl die Option noch drin ist. Ich kann mir das nicht erklären.
Ausserdem wollte ich mir gern die Iterationsergebnisse anzeigen lassen, habe die vermeintlich richtige Funktion gesucht und eingegeben. Diese zeigt mir nicht das, was ich wollte, nämlich die Funktionswerte, aber sie läuft wenigstens durch. Das erklärt mir das ganze noch viel weniger (aktuell ist diese Option wieder ausge%.
Könntest Du mir nochmals helfen hierbei?

hydrodynamics1_STEMMET_draft3.m
 Beschreibung:

Download
 Dateiname:  hydrodynamics1_STEMMET_draft3.m
 Dateigröße:  2.55 KB
 Heruntergeladen:  270 mal
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
es stoppt wieder nach 400 Iterationen, obwohl die Option noch drin ist.

Es gibt zwei Optionen, MaxFunEvals und MaxIter. Du setzt MaxFunEvals, überschritten wird MaxIter.

Zitat:
Diese zeigt mir nicht das, was ich wollte, nämlich die Funktionswerte

Bei mir sind in der dritten Spalte die Funktionswerte f(x), wenn ich 'Display' auf 'iter' setze.

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.