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

fsolve gibt stets meinen Startwert zurück

 

ZRotan
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 05.02.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.02.2020, 13:37     Titel: fsolve gibt stets meinen Startwert zurück
  Antworten mit Zitat      
Hallo Forengemeinde Smile

Danke schon mal fürs Durchlesen meines Problems. Ich habe ein nichtlineares Gleichungssystem aus zwei Funktionen in Nullstellen-Form. Beide Funktionen habe ich, der Matlab-Hilfe folgend, in einer Datei root2d.m abgespeichert. Diese lautet:

Code:
[...]

% Li:

F(1)=Li-1/(2*w0^2*x(1))+(w0/x(2)+x(2)/w0)/((2*pi*w0/(4*ZR))*(w0/x(2)+x(2)/w0)^2);

% Ci:
F(2)=Ci-1/(1/(2*x(1))+(w0/x(2)+x(2)/w0)/((2*pi/(4*ZR*w0))*(w0/x(2)+x(2)/w0)^2));


Dabei sind Li, Ci, w0 etc. Variablen bzw. eigentlich Konstanten, die weiter oben in der Funktion definiert sind, sie sind nicht weiter wichtig. Ich möchte gerne die Variablen x(1) und x(2) bekommen. Mein fsolve-Aufruf:

Code:
>> x = fsolve(@root2d,[440e-15,2*pi*801e6],options)


Diese Startwerte müssten eigentlich bereits relativ nahe an der Lösung sein und daher gute Startwerte.
Da die Startwerte um viele Größenordnungen auseinanderliegen bzw weil x(1) ja relativ klein ist, habe ich mit optimset entsprechend die Toleranzen angepasst:

Code:
options=optimset('disp','iter','LargeScale','off','TolFun',0.000000000000000000000001,'MaxIter',100000,'MaxFunEvals',1000000,'Algorithm','trust-region','TolX',0.0000000000000000000000000000001);


Jedoch bekomme ich, unabhängig von meinen Startwerten, für x(1) immer dasselbe heraus und für x(2) meinen ursprünglichen Startwert.

Code:
>> x = fsolve(@root2d,[400e-15,2*pi*800.83192e6],options)

                                         Norm of      First-order
 Iteration  Func-count     f(x)          step          optimality
     0          3     4.16214e-13                      2.14e-06
     1          6     4.16214e-13    1.94321e-07       2.14e-06      
     2          9     4.16214e-13    4.85802e-08       2.14e-06      
     3         12     4.16214e-13    1.21451e-08       2.14e-06      
     4         15     4.16214e-13    3.03626e-09       2.14e-06      
     5         18     4.16214e-13    7.59066e-10       2.14e-06      
     6         21     4.16214e-13    1.89766e-10       2.14e-06      
     7         24     4.16214e-13    4.74416e-11       2.14e-06      
     8         27     4.16214e-13    1.18604e-11       2.14e-06      
     9         30     4.16214e-13     2.9651e-12       2.14e-06      
    10         33     4.16214e-13    7.41275e-13       2.14e-06      
    11         36     3.62934e-13    1.85319e-13       3.73e-06      
    12         39     3.62934e-13    3.70638e-13       3.73e-06      
    13         42     2.83494e-13    9.26594e-14       5.79e-06      
    14         45     2.83494e-13    1.85319e-13       5.79e-06      
    15         48     1.87641e-13    4.63297e-14        7.6e-06      
    16         51     1.87641e-13    9.26594e-14        7.6e-06      
    17         54     1.01046e-13    2.31648e-14       8.04e-06      
    18         57     1.01046e-13    4.63297e-14       8.04e-06      
    19         60     4.46495e-14    1.15824e-14       6.85e-06      
    20         63     4.46495e-14    2.31648e-14       6.85e-06      
    21         66     1.73404e-14    5.79121e-15       4.97e-06      
    22         69     1.73404e-14    1.15824e-14       4.97e-06      
    23         72     6.58561e-15    2.89561e-15       3.34e-06      
    24         75      2.8176e-15    5.79121e-15       2.66e-06      
    25         78      2.8176e-15    1.15824e-14       2.66e-06      
    26         81     4.26592e-16    2.89561e-15       9.34e-07      
    27         84     4.26592e-16    5.79121e-15       9.34e-07      
    28         87     2.04528e-16     1.4478e-15        6.8e-07      
    29         90     2.04528e-16    2.89561e-15        6.8e-07      
    30         93     1.30912e-17    7.23901e-16       1.68e-07      
    31         96     1.30912e-17     1.4478e-15       1.68e-07      
    32         99     1.30912e-17    3.61951e-16       1.68e-07      
    33        102       2.039e-18    9.04877e-17       6.64e-08      
    34        105       2.039e-18    1.80975e-16       6.64e-08      
    35        108     1.07322e-19    4.52438e-17       1.53e-08      
    36        111     1.07322e-19    9.04877e-17       1.53e-08      
    37        114     5.01217e-20    2.26219e-17       1.04e-08      
    38        117     5.01217e-20    4.52438e-17       1.04e-08      
    39        120     2.70088e-21     1.1311e-17       2.42e-09      
    40        123     2.70088e-21    2.26219e-17       2.42e-09      
    41        126     2.70088e-21    5.65548e-18       2.42e-09      
    42        129      3.0628e-22    1.41387e-18       8.16e-10      
    43        132      3.0628e-22    2.82774e-18       8.16e-10      
    44        135      7.0242e-26    7.06935e-19       1.24e-11      
    45        138      7.0242e-26    1.41387e-18       1.24e-11      
    46        141      7.0242e-26    3.53467e-19       1.24e-11      
    47        144      7.0242e-26    8.83669e-20       1.24e-11      
    48        147      7.0242e-26    2.20917e-20       1.24e-11      
    49        150     1.69973e-26    5.52293e-21       6.08e-12      

Equation solved, inaccuracy possible.

fsolve stopped because the vector of function values is near zero, as measured by the value
of the function tolerance. However, the last step was ineffective.

<stopping criteria details>

x =

   1.0e+09 *

    0.0000    5.0318


Nach Doppelklick auf die Variable x:
    x(1)=2.848939710011552e-14 (immer genau dieser Wert, bei Variation ändert sich manchmal die vierte Nachkommastelle)
    x(2)= (eben genau mein Startwert, 2pi*801e6 oder was ich eingegeben habe).

Kann mir jemand helfen, was ich falsch mache, oder ob ich ein generelles Problem habe?

Ich wäre super dankbar wenn jemand mir dazu was sagen könnte!!
LG
Yannik
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.02.2020, 14:02     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Dabei sind Li, Ci, w0 etc. Variablen bzw. eigentlich Konstanten, die weiter oben in der Funktion definiert sind, sie sind nicht weiter wichtig.

Wäre schon wichtig, um das Problem nachvollziehen zu können.

Problem dürfte hier sein, dass die Startwerte extrem unterschiedlich groß sind und die Schrittweite in jede Richtung gleich ist. Was für x(1) eine riesige Änderung wäre, ist für x(2) noch nicht mal im Rahmen der Maschinengenauigkeit. Hier kann die Option TypicalX helfen, oder eine manuelle Vorskalierung (z.B. Einheitenwechsel auf micro-irgendwas oder mega-etwasanderes).

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
ZRotan
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 05.02.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.02.2020, 14:54     Titel: Ein paar Änderungen
  Antworten mit Zitat      
Danke erstmal für Deine schnelle Antwort. ich hab jetzt noch etwas rum probiert, jedoch bisher noch nicht wirklich mit Erfolg...

Weil Du meintest, es sei schon wichtig, hier der gesamte Code (im Vergleich zu letztem Mal etwas angepasst):

Code:
function F = root2d(x)

Li=6.93886E-07;
Ci=5.70413E-14;
ZR=11.586646387326759;
f0=800e6;
w0=2*pi*f0;
u=4*ZR/pi;


% x(1) soll CB sein
% x(2) soll w0/wR sein

%F(1)=L1-(u/x(2))*(x(1)+1/(u*x(2)))^2/(x(1)^2);
%F(2)=L1*sqrt(L1*C1)-(((x(1)-4/(u*x(2)))*(x(1)+1/(u*x(2)))*((u/x(2))*(x(1)+1/(u*x(2))))^(3/2)))/(x(1)^3);

% Li:

F(1)=Li-(1e15)/(2*w0^2*x(1))+(x(2)+1/x(2))/((2*pi*w0/(4*ZR))*(x(2)+1/x(2))^2);

% Ci:
F(2)=Ci-(1e15)/(1/(2*x(1))+(x(2)+1/x(2))/((2*pi/(4*ZR*w0))*(x(2)+1/x(2))^2));

 


Ich habe da jetzt für x(2) das Verhältnis von w0 zu wR gesetzt, das herauszubekommen, statt nur wR, wäre auch in Ordnung. Allerdings taucht w0 ja weiter vorne auch alleine auf - ich weiß nicht ob das ein Problem ist...

Meine aktuellen options sind:
Code:
options=optimset('disp','iter','LargeScale','off','TolFun',0.001,'MaxIter',1000,'MaxFunEvals',1000000,'Algorithm','trust-region','TolX',0.01);


Jetzt findet er keine Lösung mehr.

Code:
No solution found.

fsolve stopped because the size of the current step is less than the
value of the step size tolerance, but the vector of function values
is not near zero as measured by the value of the function tolerance.

<stopping criteria details>

x =

  400.0000    0.9998


Der zweite Wert, also der für x(2), hat sich wie man sehen kann leicht verändert. eine Lösung wird jedoch nicht gefunden.
Ich habe ein bisschen mit TolX gespielt, und versucht die Größenordnungen mehr aneinander anzugleichen, leider geht es noch nicht wirklich Crying or Very sad

Könntest du bitte nochmal schauen, welchen Fehler ich mache? Habe ich das, was Du mit der extrem unterschiedlichen Größenordnungen der Anfangswerte gemeint hattest, auf diese Weise besser umgesetzt?

Ich habe hier mal die Formeln in Latex geschrieben, damit es besser lesbar ist.

L_i=\dfrac{1}{2\omega_0^2 C_{B,i}}+\dfrac{\dfrac{\omega_0}{\omega_R}+\dfrac{\omega_R}{\omega_0}}{\dfrac{2\pi\omega_0}{4Z_R}\left(\dfrac{\omega_0}{\omega_R}-\dfrac{\omega_R}{\omega_0}\right)^2}

und

C_i=\frac{1}{\frac{1}{2C_{B,i}}+\frac{\frac{\omega_0}{\omega_{R,i}}+\frac{\omega_{R,i}}{\omega_0}}{\frac{2\pi}{4Z_R\omega_0}\left(\frac{\omega_0}{\omega_{R,i}}-\frac{\omega_{R,i}}{\omega_0}\right)^2}}


Danke danke danke schonmal..... Ich bin langsam echt am verzweifeln Crying or Very sad

=====
Edit: Die i-Subskripte in den Latex-Formeln bitte ignorieren, sie lassen sich irgendwie nicht entfernen...
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ich habe jetzt nicht versucht, die manuelle Skalierung nachzuvollziehen, aber mit der vorgeschlagenen Option TypicalX klappt es:

Code:
options = optimset(........, 'TypicalX', [1e-15, 1e9]);


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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
ZRotan
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 05.02.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.02.2020, 10:48     Titel:
  Antworten mit Zitat      
Danke Harald. Ich habe jetzt die Option TypicalX hinzugefügt:

Code:
options=optimset('disp','iter','LargeScale','off','TolFun',1e-6,'MaxIter',1000,'MaxFunEvals',1000000,'Algorithm','trust-region','TolX',1e-6,'TypicalX',[1e-15, 1e9]);


Also die Standardwerte für die Toleranzen eingestellt und direkt Deine options übernommen. Das Ergebnis von

Code:
x = fsolve(@root2d,[400e-15,2*pi*801.34e6],options)


ist

Code:
Iteration  Func-count     f(x)          step          optimality
     0          3     4.16214e-13                        0.0798
     1          6     4.16214e-13    5.21613e-12         0.0798      
     2          9     4.16214e-13    1.30403e-12         0.0798      

Equation solved, [b]fsolve stalled[/b].

fsolve stopped because the size of the current step is less than the default
value of the step size tolerance and the vector of function values
is near zero as measured by the value of the function tolerance.

<stopping criteria details>

x =

   1.0e+09 *

    0.0000    5.0350



Dabei ist das Ergebnis x(1) nicht null, sondern genau der Startwert, also 400e-15. x(2) ist ebenfalls unverändert.

Passe ich die Toleranzen etwas an, also mit

Code:
options=optimset('disp','iter','LargeScale','off','TolFun',1e-20,'MaxIter',1000,'MaxFunEvals',1000000,'Algorithm','trust-region','TolX',1e-20,'TypicalX',[1e-15, 1e7]);


dann bekomme ich etwas feinere Steps in x(2)-Richtung. Mit

Code:
x = fsolve(@root2d,[400e-15,2*pi*801.34e6],options)


bekomme ich

Code:
Iteration  Func-count     f(x)          step          optimality
     0          3     4.16214e-13                        0.0798
     1          6     4.16214e-13    5.21613e-12         0.0798      
     2          9     4.16214e-13    1.30403e-12         0.0798      
     3         12     1.82473e-13    3.26008e-13           1.54      
     4         15     1.82473e-13    1.18179e-13           1.54      
     5         18     6.21955e-14    2.95448e-14            2.5      
     6         21     6.21955e-14    2.48967e-14            2.5      
     7         24     3.12901e-14    6.22418e-15            2.4      
     8         27     8.42783e-15    1.30595e-14           2.87      
     9         30     9.20912e-17    2.93749e-15           0.24      
    10         33     1.66444e-20    3.82937e-16        0.00315      
    11         36     5.73669e-28    5.28942e-18       5.84e-07      
    12         39     1.50406e-32    9.82338e-22       8.26e-15      

Equation solved, [b]inaccuracy possible[/b].

fsolve stopped because the vector of function values is near zero, as measured by the value
of the function tolerance. However, the last step was ineffective.

<stopping criteria details>

x =

   1.0e+09 *

    0.0000    5.0350


und damit zwar einen neuen Wert für x(1), nämlich 2.848939177880972e-14, jedoch für x(2) genau den Startwert heraus. Das ändert sich auch nicht, wenn ich feinere/gröbere Steps in beiden Richtungen einstelle, in allen Kombinationen.

Ein Unterschied in den jetzt ausgegebenen Meldungen von fsolve ist, dass oben "Equation solved, fsolve stalled" steht und unten "Equation solved, inaccuracy possible".

Als immerhin ändert sich schon mal einer der beiden Werte. Für meine konkrete Anwendung sollte ein größeres x(1) auch ein größeres x(2) mit sich bringen: x(2) müsste nach der Lösung des NLGS ein kleines bisschen größer sein als der Startwert, und die Auswirkung auf die Schaltung wird durch das x(1) kompensiert, das sehr klein, aber nicht Null ist.

Gibt es in diesen Größenordnungen bessere Werte der StepTolerance bzw der FunctionTolerance? Oder ist noch was anderes falsch?

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

Forum-Meister


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

ich würde mir immer die Abweichung ansehen, die man vorher und nachher hat. Du hast am Anfang ein f in der Größenordnung von 1e-14 und am Ende 1e-32. Das ist meines Erachtens eine enorme Verbesserung. Natürlich kann man noch mit weiteren Optionen spielen um zu sehen, ob man noch mehr herausholen kann.
Letztlich ist es fsolve quasi egal, welche Variablen es wie ändern muss, solange es das Ergebnis verbessert. Wenn es am besten (möglicherweise im Sinne eines lokalen Minimums) scheint, eine Variable gar nicht zu ändern, dann wird sie halt auch nicht geändert.

Grüße,
Harald

solveEq.m
 Beschreibung:

Download
 Dateiname:  solveEq.m
 Dateigröße:  343 Bytes
 Heruntergeladen:  373 mal
root2d.m
 Beschreibung:

Download
 Dateiname:  root2d.m
 Dateigröße:  308 Bytes
 Heruntergeladen:  369 mal

_________________

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 ;)
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.