Pilihan pemecah: NonlinearBlockGS vs NewtonSolver
Saya memiliki dua grup openmdao dengan ketergantungan siklik antar grup. Saya menghitung turunan menggunakan langkah Kompleks. Saya memiliki pemecah non-linier untuk ketergantungan dan menggunakan SLSQP untuk mengoptimalkan fungsi tujuan saya. Masalahnya adalah dengan pilihan pemecah non-linier. Ketika saya menggunakan NonlinearBlockGSoptimasi berhasil dalam 12 iterasi. Tetapi ketika saya menggunakan NewtonSolverdengan Directsolveratau ScipyKrylovpengoptimalan gagal (melebihi batas Iterasi), bahkan dengan maxiter=2000. Koneksi siklik bertemu, tetapi hanya saja variabel desain tidak mencapai nilai optimal. Perbedaan antara variabel desain dalam iterasi yang berurutan ada di urutan 1e-5. Dan ini meningkatkan iterasi yang dibutuhkan. Juga ketika saya mengubah tebakan awal ke nilai yang lebih dekat ke nilai optimal, itu berfungsi.
Untuk memeriksa lebih lanjut, saya mengubah model menjadi IDF (dengan membuat salinan variabel penggandengan dan batasan konsistensi) sehingga menghilangkan kebutuhan akan pemecah. Sekarang optimasi berhasil dalam 5 iterasi dan hasilnya sama dengan hasil saat NonlinearBlockGSdigunakan.
Mengapa ini terjadi? Apakah saya melewatkan sesuatu? Kapan saya harus menggunakan di NewtonSolveratas orang lain? Saya tahu bahwa sulit untuk menjawab tanpa melihat kodenya. Tetapi hanya saja kode saya panjang dengan banyak komponen dan saya tidak dapat membuat ulang masalah dengan model mainan. Jadi pemahaman umum apa pun sangat dihargai.
Jawaban
Tanpa melihat kodenya, Anda benar bahwa sulit untuk memberikan spesifikasinya.
Secara umum, Newton terkadang memiliki lebih banyak masalah konvergen daripada NLBGS (Catatan: ini tidak sepenuhnya benar, tetapi merupakan aturan praktis yang baik). Jadi yang saya duga yang terjadi adalah pada iterasi pertama atau kedua Anda, newton solver tidak benar-benar konvergen. Anda dapat memeriksanya dengan menyetel newton.options['iprint']=2dan melihat riwayat iterasi saat pengoptimal melakukan iterasi.
Ketika Anda memiliki pemecah dalam pengoptimalan Anda, sangat penting bahwa Anda juga memastikan bahwa Anda mengaturnya untuk menimbulkan kesalahan pada non-konvergensi. Beberapa pengoptimal dapat menangani kesalahan ini, dan akan mundur pada pencarian baris. Yang lainnya akan mati begitu saja. Bagaimanapun, ini penting. Jika tidak, Anda akhirnya memberikan pengoptimal kasus yang tidak terkonvergensi yang tidak diketahui sebagai tidak terkonvergensi.
Ini buruk karena dua alasan. Pertama, nilai obyektif dan batasan yang didapatnya akan salah! Kedua, dan mungkin yang lebih penting, turunan yang dihitungnya akan salah! Anda dapat membaca detailnya [di manual teori,] tetapi secara ringkas metode turunan analitik yang digunakan OpenMDAO mengasumsikan bahwa residu telah mencapai 0. Jika bukan itu masalahnya, matematika akan rusak. Bahkan jika Anda melakukan model beda hingga model penuh, model non-konvergensi merupakan masalah. Anda hanya akan mendapatkan sampah yang berisik saat mencoba FD-nya. 2
Jadi, dengan asumsi Anda telah menyiapkan model Anda dengan benar, dan bahwa Anda memiliki pemecah linier yang mengatur masalah (sepertinya Anda melakukannya karena ia bekerja dengan NLBGS), maka kemungkinan besar pemecah newton tidak konvergen. Gunakan iprint, mungkin digabungkan dengan pencetakan debug driver , untuk memeriksanya sendiri. Jika itu masalahnya, Anda perlu mencari cara agar newton berperilaku lebih baik.
Ada beberapa tip di sini yang cukup umum. Anda juga dapat mencoba menggunakan pencarian baris armijo , yang sering kali dapat menstabilkan penyelesaian newton dengan mengorbankan beberapa kecepatan.
Akhirnya ... Newton bukanlah jawaban terbaik dalam semua situasi. Jika NLBGS lebih stabil, dan komputasi lebih murah, Anda harus menggunakannya. Saya memuji keinginan Anda untuk membuatnya berhasil dengan Newton. Anda pasti harus mencari tahu mengapa tidak, tetapi jika ternyata Newton tidak dapat menyelesaikan masalah gabungan Anda dengan andal, tidak apa-apa juga!