Çözücü seçimi: NonlinearBlockGS vs NewtonSolver
Gruplar arasında döngüsel bağımlılığı olan iki openmdao grubum var. Türevleri Kompleks adım kullanarak hesaplıyorum. Bağımlılık için doğrusal olmayan bir çözücüm var ve hedef işlevimi optimize etmek için SLSQP kullanıyorum. Sorun, doğrusal olmayan çözücü seçimidir. NonlinearBlockGSOptimizasyonu kullandığımda 12 yinelemede başarılı oluyor. Ancak NewtonSolverbirlikte kullandığımda Directsolverveya ScipyKrylovoptimizasyon başarısız olduğunda (Yineleme sınırı aşıldı), ile bile maxiter=2000. Döngüsel bağlantılar birleşir, ancak sadece tasarım değişkenleri optimal değerlere ulaşmaz. Ardışık yinelemelerde tasarım değişkenleri arasındaki fark 1e-5 sırasındadır. Bu da ihtiyaç duyulan yinelemeleri artırır. Ayrıca ilk tahmini optimum değere daha yakın bir değere değiştirdiğimde işe yarıyor.
Daha fazla kontrol etmek için, modeli IDF'ye dönüştürdüm (birleştirme değişkenlerinin ve tutarlılık kısıtlamalarının kopyalarını oluşturarak) ve böylece bir çözücü ihtiyacını ortadan kaldırdım. Şimdi optimizasyon 5 iterasyonda başarılı ve sonuçlar NonlinearBlockGSkullanıldığında sonuçlara benziyor .
Bu neden oluyor? Bir şey mi kaçırıyorum? NewtonSolverBaşkalarına göre ne zaman kullanmalıyım ? Kodu görmeden cevap vermenin zor olduğunu biliyorum. Ancak kodumun birden fazla bileşenle uzun olması ve sorunu bir oyuncak modelle yeniden oluşturamamıştım. Bu nedenle, herhangi bir genel anlayış çok takdir edilmektedir.
Yanıtlar
Kodu görmeden, ayrıntıları vermenin zor olduğu konusunda haklısınız.
Genel olarak konuşursak, Newton bazen NLBGS'den çok daha fazla yakınsama sorunu yaşayabilir (Not: Bu kesinlikle doğru değildir, ancak iyi bir kuraldır). Öyleyse, ilk veya ikinci yinelemenizde Newton çözücünün aslında yakınsamadığını tahmin ediyorum. newton.options['iprint']=2İyileştirici yineledikçe yineleme geçmişini ayarlayarak ve bakarak bunu kontrol edebilirsiniz .
Optimizasyonunuzda bir çözücünüz olduğunda, yakınsamama durumunda bir hata atacak şekilde ayarladığınızdan emin olmanız da çok önemlidir . Bazı optimize ediciler bu hatayı halledebilir ve satır aramaya geri dönecektir. Diğerleri ölecek. Her iki durumda da önemli. Aksi takdirde, optimize ediciye, dönüştürülmemiş olduğunu bilmediği birleştirilmiş bir vaka verirsiniz.
Bu iki nedenden dolayı kötü. Birincisi, aldığı amaç ve kısıtlama değerleri yanlış olacak! İkincisi ve belki daha da önemlisi, hesapladığı türevler yanlış olacak! Ayrıntıları [teori kılavuzunda] okuyabilirsiniz, ancak özet olarak OpenMDAO'nun kullandığı analitik türev yöntemleri, kalıntıların 0'a gittiğini varsayar. Durum bu değilse, matematik bozulur. Tam model sonlu fark yapıyor olsanız bile, yakınsamalı olmayan modeller bir sorundur. FD yapmaya çalıştığınızda sadece gürültülü çöpler alırsınız. 2
Dolayısıyla, modelinizi doğru bir şekilde kurduğunuzu ve problemleri kuran lineer çözücülere sahip olduğunuzu varsayarsak (NLBGS ile çalıştığı için yaptığınız gibi görünüyor), o zaman büyük olasılıkla newton çözücüsü yakınlaşmıyor. Bunu kendiniz kontrol etmek için muhtemelen sürücü hata ayıklama baskısıyla birlikte iprint'i kullanın . Durum buysa, Newton'un nasıl daha iyi davranacağını bulmanız gerekir.
Burada oldukça genel olan bazı ipuçları var . Ayrıca bir newton çözümünü bir miktar hız pahasına sabitleyen armijo satır aramasını kullanmayı da deneyebilirsiniz .
Son olarak ... Newton her durumda en iyi cevap değildir. NLBGS daha kararlıysa ve hesaplama açısından daha ucuzsa, onu kullanmalısınız. Newton ile çalışmasını sağlama arzunuzu alkışlıyorum. Neden olmadığını kesinlikle bulmalısınız, ancak Newton'un bağlı sorununuzu güvenilir bir şekilde çözemediği ortaya çıkarsa, bu da tamamdır!