Solver-Auswahl: NonlinearBlockGS vs. NewtonSolver
Ich habe zwei Openmdao-Gruppen mit zyklischer Abhängigkeit zwischen den Gruppen. Ich berechne die Ableitungen mit Complex step. Ich habe einen nichtlinearen Solver für die Abhängigkeit und verwende SLSQP, um meine Zielfunktion zu optimieren. Das Problem liegt in der Wahl des nichtlinearen Solvers. Bei mir ist NonlinearBlockGSdie Optimierung in 12 Iterationen erfolgreich. Aber wenn ich NewtonSolverwith verwende Directsolveroder ScipyKrylovdie Optimierung fehlschlägt (Iterationslimit überschritten), auch mit maxiter=2000. Die zyklischen Verbindungen konvergieren, aber es ist nur so, dass die Designvariablen nicht die optimalen Werte erreichen. Der Unterschied zwischen den Entwurfsvariablen in aufeinanderfolgenden Iterationen liegt in der Reihenfolge 1e–5. Und dies erhöht die erforderlichen Iterationen. Auch wenn ich die anfängliche Schätzung auf einen Wert ändere, der näher am optimalen Wert liegt, funktioniert es.
Um dies weiter zu überprüfen, habe ich das Modell in IDF konvertiert (indem ich Kopien von Kopplungsvariablen und Konsistenzbeschränkungen erstellt habe), wodurch die Notwendigkeit eines Solvers beseitigt wurde. Jetzt ist die Optimierung in 5 Iterationen erfolgreich und die Ergebnisse sind ähnlich wie bei der NonlinearBlockGSVerwendung.
Warum passiert das? Übersehe ich etwas? Wann sollte ich NewtonSolverüber andere verwenden? Ich weiß, dass es schwierig ist zu antworten, ohne den Code zu sehen. Aber es ist nur so, dass mein Code mit mehreren Komponenten lang ist und ich das Problem nicht mit einem Spielzeugmodell reproduzieren konnte. Daher ist jeder allgemeine Einblick sehr willkommen.
Antworten
Ohne den Code zu sehen, haben Sie Recht, dass es schwierig ist, Einzelheiten zu nennen.
Ganz allgemein kann Newton manchmal viel mehr Probleme beim Konvergieren haben als NLBGS (Hinweis: Dies ist nicht absolut richtig, aber eine gute Faustregel). Ich würde also vermuten, dass der Newton-Löser bei Ihrer ersten oder zweiten Iteration nicht wirklich konvergiert. Sie können dies überprüfen, indem Sie newton.options['iprint']=2den Iterationsverlauf einstellen und betrachten, während der Optimierer iteriert.
Wenn Sie einen Solver in Ihrer Optimierung haben, ist es wichtig, dass Sie ihn auch so einstellen, dass er bei Nichtkonvergenz einen Fehler ausgibt. Einige Optimierer können mit diesem Fehler umgehen und werden die Liniensuche zurückverfolgen. Andere werden einfach sterben. Wie auch immer, es ist wichtig. Andernfalls geben Sie dem Optimierer am Ende einen nicht konvergierten Fall, von dem er nicht weiß, dass er nicht konvergiert ist.
Das ist aus zwei Gründen schlecht. Erstens werden die Werte für das Ziel und die Einschränkungen falsch sein! Zweitens, und vielleicht noch wichtiger, werden die berechneten Ableitungen falsch sein! Sie können die Details [im Theoriehandbuch] lesen, aber zusammenfassend gehen die analytischen Ableitungsmethoden, die OpenMDAO verwendet, davon aus, dass die Residuen auf 0 gegangen sind. Wenn das nicht der Fall ist, bricht die Mathematik zusammen. Selbst wenn Sie ein vollständiges Modell mit finiten Differenzen erstellen, sind nicht konvergente Modelle ein Problem. Sie erhalten nur lauten Müll, wenn Sie versuchen, es zu FD. 2
Angenommen, Sie haben Ihr Modell korrekt eingerichtet und die linearen Löser haben Probleme eingerichtet (es hört sich so an, als würden Sie dies tun, da es mit NLBGS funktioniert), dann ist es höchstwahrscheinlich, dass der Newton-Löser nicht konvergiert. Verwenden Sie iprint, möglicherweise kombiniert mit Treiber-Debug-Druck , um dies selbst zu überprüfen. Wenn das der Fall ist, müssen Sie herausfinden, wie Sie Newton dazu bringen können, sich besser zu verhalten.
Es gibt hier einige Tipps , die ziemlich allgemein sind. Sie können auch versuchen, die Armijo-Liniensuche zu verwenden , die eine Newton-Lösung oft auf Kosten einer gewissen Geschwindigkeit stabilisieren kann.
Schließlich ... Newton ist nicht in allen Situationen die beste Antwort. Wenn NLBGS stabiler und rechengünstiger ist, sollten Sie es verwenden. Ich begrüße Ihren Wunsch, es mit Newton zum Laufen zu bringen. Sie sollten auf jeden Fall herausfinden, warum das nicht der Fall ist, aber wenn sich herausstellt, dass Newton Ihr gekoppeltes Problem einfach nicht zuverlässig lösen kann, ist das auch in Ordnung!