Wybór solvera: NonlinearBlockGS vs NewtonSolver
Mam dwie grupy openmdao z cyklicznymi zależnościami między grupami. Obliczam pochodne za pomocą kroku złożonego. Mam nieliniowy solver dla zależności i używam SLSQP do optymalizacji mojej funkcji celu. Problem polega na wyborze nieliniowego solwera. Kiedy używam, NonlinearBlockGSoptymalizacja przebiega pomyślnie w 12 iteracjach. Ale kiedy używam NewtonSolverwith Directsolverlub ScipyKrylovoptymalizacja nie powiedzie się (przekroczono limit iteracji), nawet z maxiter=2000. Połączenia cykliczne są zbieżne, ale po prostu zmienne projektowe nie osiągają optymalnych wartości. Różnica między zmiennymi projektowymi w kolejnych iteracjach jest rzędu 1e-5. A to zwiększa liczbę potrzebnych iteracji. Również wtedy, gdy zmienię początkowe przypuszczenie na wartość bliższą wartości optymalnej, działa.
Aby to sprawdzić, przekonwertowałem model na IDF (tworząc kopie zmiennych sprzęgających i ograniczeń spójności), eliminując w ten sposób potrzebę rozwiązywania problemów. Teraz optymalizacja zakończyła się sukcesem w 5 iteracjach, a wyniki są podobne do wyników, gdy NonlinearBlockGSjest używany.
Dlaczego to się zdarza? Czy coś mi brakuje? Kiedy powinienem używać NewtonSolverzamiast innych? Wiem, że trudno jest odpowiedzieć bez zobaczenia kodu. Ale po prostu mój kod jest długi i zawiera wiele komponentów i nie mogłem odtworzyć problemu za pomocą modelu zabawki. Tak więc każdy ogólny wgląd jest bardzo cenny.
Odpowiedzi
Nie widząc kodu, masz rację, że trudno jest podać szczegóły.
Mówiąc najogólniej, Newton może czasami mieć dużo więcej problemów z konwergencją niż NLBGS (uwaga: nie jest to do końca prawdą, ale jest to dobra zasada praktyczna). Więc przypuszczam, że dzieje się tak, że podczas pierwszej lub drugiej iteracji solver Newtona w rzeczywistości nie jest zbieżny. Możesz to sprawdzić, ustawiając newton.options['iprint']=2i przeglądając historię iteracji podczas iteracji optymalizatora.
Jeśli masz solwera w swojej optymalizacji, bardzo ważne jest, aby upewnić się, że ustawisz go tak, aby zgłaszał błąd dotyczący braku zbieżności. Niektóre optymalizatory mogą sobie poradzić z tym błędem i cofną się podczas przeszukiwania linii. Inni po prostu umrą. Tak czy inaczej, to ważne. W przeciwnym razie optymalizator otrzyma przypadek nieskonwergentny, o którym nie wie, że jest niespójny.
Jest to złe z dwóch powodów. Po pierwsze, wartości celu i ograniczeń, które otrzyma, będą nieprawidłowe! Po drugie, i być może ważniejsze, pochodne, które oblicza, będą błędne! Możesz przeczytać szczegóły [w podręczniku teorii], ale podsumowując, analityczne metody pochodne, których używa OpenMDAO, zakładają, że reszty spadły do 0. Jeśli tak nie jest, matematyka się psuje. Nawet jeśli robiłeś pełny model z różnicą skończoną, niezbieżne modele stanowią problem. Kiedy spróbujesz go znaleźć, dostaniesz hałaśliwe śmieci. 2
Tak więc, zakładając, że poprawnie skonfigurowałeś swój model i masz liniowe rozwiązania do rozwiązywania problemów (brzmi to tak, jakbyś to robił, ponieważ działa z NLBGS), najprawdopodobniej solver Newtona nie jest zbieżny. Użyj iprint, być może w połączeniu z drukowaniem debugowania sterowników , aby to sprawdzić samodzielnie. Jeśli tak jest, musisz dowiedzieć się, jak sprawić, by Newton zachowywał się lepiej.
Jest tutaj kilka wskazówek, które są dość ogólne. Możesz również spróbować użyć wyszukiwania liniowego armijo , które często może ustabilizować rozwiązanie Newtona kosztem pewnej szybkości.
Wreszcie ... Newton nie jest najlepszą odpowiedzią we wszystkich sytuacjach. Jeśli NLBGS jest stabilniejszy i tańszy obliczeniowo, powinieneś go użyć. Doceniam twoje pragnienie, aby to zadziałało z Newtonem. Zdecydowanie powinieneś dowiedzieć się, dlaczego tak nie jest, ale jeśli okaże się, że Newton po prostu nie może niezawodnie rozwiązać Twojego połączonego problemu, to też jest w porządku!