Verfasst am: 05.02.2020, 13:37
Titel: fsolve gibt stets meinen Startwert zurück
Hallo Forengemeinde
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:
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:
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.
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
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 ;)
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...
fsolve stopped because the size of the current stepis less than the
value of the stepsize tolerance, but the vector of function values
is not near zero as measured by the value of the function tolerance.
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
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.
und
Danke danke danke schonmal..... Ich bin langsam echt am verzweifeln
=====
Edit: Die i-Subskripte in den Latex-Formeln bitte ignorieren, sie lassen sich irgendwie nicht entfernen...
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 ;)
fsolve stopped because the size of the current stepis less than the default
value of the stepsize tolerance and the vector of function values
is near zero as measured by the value of the function tolerance.
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.
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?
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.
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 ;)
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.