|
|
Fsolve mit Grenzen-Handling |
|
muenzi |
Forum-Anfänger
|
|
Beiträge: 26
|
|
|
|
Anmeldedatum: 12.11.08
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 09.03.2015, 10:36
Titel: Fsolve mit Grenzen-Handling
|
|
|
|
|
Hallo zusammen,
manch einer wird wohl gerade die Hände über dem Kopf zusammenschlagen, dass eine solche Frage schon wieder auftaucht. Natürlich weiß ich, dass Fsolve nativ keine Grenzen unterstützt. Nun habe ich aber ein "großes" (mehrere tausend Variablen) schlecht skaliertes (Variablen befinden sich zu 98 % in den Grenzen zwischen 0 bis 1. 2 % zwischen -1 und 0. Die kleinsten Variablen gehen in den Bereich 1e-9) dünnbesetztes (etwa 10 % der Gleichungen sind ungleich 0) Gleichungssystem.
Bisher habe ich dieses Gleichungssystem mit lsqnonlin und trust-region-reflective gelöst. Doch aufgrund der schlechten Skalierbarkeit und der Funktionsweise von lsqnonlin, das 0 = f_1(x)^2 + f_2(x)^2 + ... + f_n(x)^2 löst, gibt es häufiger mal extreme Konvergenzprobleme. Dann dauert eine Lösung schon mal mehrere Stunden, statt wie sonst einige Sekunden oder mal eine Minute.
Daher bin ich zu Fsolve mit trust-region-reflective gewechselt. Hier wird 0 = f_n für n = 1,...,N, also jede Gleichung einzeln, gelöst und so schlägt die schlechte Skalierung nicht so stark rein. Allerdings kann es hier bei ungünstigen Startwerten dazu kommen, dass meine physikalischen Grenzen überschritten werden.
Deshalb wüsste ich gern ob es möglich ist fsolve so umzuschreiben, dass es wie lsqnonlin Grenzen beachtet oder welche anderen Lösungsmöglichkeiten ich habe. Über ein paar Schlagworte wäre ich sehr froh. Bereits versucht habe ich übrigens auch schon das Gleichungssystem auf seine Startwerte zu normieren und somit mit lsqnonlin eine bessere Konvergenz zu erreichen. Leider ohne Erfolg.
|
|
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 09.03.2015, 10:53
Titel:
|
|
Hallo,
lsqnonlin ist an sich der richtige Solver, wenn es Schrankenbedingungen gibt.
Wenn die Skalierungsinformation bekannt ist, sollte eine entsprechende Wahl der Option TypicalX (zu setzen über optimoptions) helfen.
Grüße,
Harald
|
|
|
muenzi |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 26
|
|
|
|
Anmeldedatum: 12.11.08
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 09.03.2015, 11:36
Titel:
|
|
Hallo Harald, die Option von TypicalX hatte ich auch schon einmal getestet. Leider kein Erfolg. Während fsolve für die Lösung des Gleichungssystems bei gleichen Startwerten und trust-region-reflective 10 Iterationen benötigt, braucht lsqnonlin über 1000 Iterationen.
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 09.03.2015, 16:18
Titel:
|
|
Hallo,
ist schwierig, da zu helfen, ohne das Problem vor sich zu haben.
Im Zweifelsfall mal den Technischen Support von MathWorks kontaktieren.
Grüße,
Harald
|
|
|
muenzi |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 26
|
|
|
|
Anmeldedatum: 12.11.08
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 10.03.2015, 02:20
Titel:
|
|
|
|
|
Das kann ich gut nachvollziehen. Da der Programmcode mittlerweile aber schon einige tausend Zeilen umfasst (mit Startwertbestimmung, Grenzenvorgabe und Gleichungssystem und Nachverarbeitung der Ergebnisse) und zusätzlich zu der Simulation noch einige Veröffentlichungen in Planung sind, kann ich den Code leider nicht im Detail anbieten.
Bis noch jemandem etwas einfällt werde ich mir vorerst damit behelfen, das Gleichungssystem mit fsolve zu lösen. Anschließend werden die Grenzen mit dem Ergebnisvektor abgeglichen. Wenn die Grenzen erfüllt sind, dann wird das Ergebnis akzeptiert, wenn nicht dann wird das Gleichungssystem mit lsqnonlin und gesetzten Grenzen gelöst.
Da die Konvergenzprobleme maximal bei 1-2 % der berechneten Gleichungssystemlösungen auftreten, ist das bisher ein ganz guter Kompromiss. Im Falle von Konvergenzproblemen kann nun ein weiteres Mal fsolve, diesmal mit den schon recht genauen Ergebnissen von lsqnonlin als Startwertvektor, aufgerufen werden.
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 10.03.2015, 19:10
Titel:
|
|
Hallo,
mich verwundert das wie gesagt sehr.
Die Details könnte ich mir ohnehin nicht ansehen. Je kleiner das Beispiel, umso lieber. Ohne zumindest ein Beispiel zu haben, in dem das Problem auftritt, weiß ich aber wirklich nicht weiter.
Bleibt wie gesagt der Technische Support von MathWorks. Ich glaube nicht, dass man Sorgen haben muss, dass von dort was nach außen dringt ;)
Grüße,
Harald
|
|
|
muenzi |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 26
|
|
|
|
Anmeldedatum: 12.11.08
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 13.03.2015, 09:49
Titel:
|
|
Da gebe ich dir sicher Recht Harald. Vielen Dank für die Hilfe.
|
|
|
|
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| 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.
|
|