Lựa chọn bộ giải: NonlinearBlockGS so với NewtonSolver

Aug 22 2020

Tôi có hai nhóm openmdao với sự phụ thuộc theo chu kỳ giữa các nhóm. Tôi tính toán các dẫn xuất bằng cách sử dụng Bước phức tạp. Tôi có một bộ giải phi tuyến tính cho phần phụ thuộc và sử dụng SLSQP để tối ưu hóa hàm mục tiêu của mình. Vấn đề là với sự lựa chọn của bộ giải phi tuyến tính. Khi tôi sử dụng NonlinearBlockGStối ưu hóa thành công trong 12 lần lặp lại. Nhưng khi tôi sử dụng NewtonSolvervới Directsolverhoặc ScipyKrylovtối ưu hóa không thành công (Đã vượt quá giới hạn lặp lại), ngay cả với maxiter=2000. Các kết nối tuần hoàn hội tụ, nhưng đó chỉ là các biến thiết kế không đạt được các giá trị tối ưu. Sự khác biệt giữa các biến thiết kế trong các lần lặp liên tiếp theo thứ tự 1e-5. Và điều này làm tăng số lần lặp lại cần thiết. Ngoài ra khi tôi thay đổi phỏng đoán ban đầu thành một giá trị gần với giá trị tối ưu thì nó hoạt động.

Để kiểm tra thêm, tôi đã chuyển đổi mô hình thành IDF (bằng cách tạo bản sao của các biến ghép nối và các ràng buộc nhất quán) do đó loại bỏ nhu cầu về bộ giải. Bây giờ việc tối ưu hóa thành công trong 5 lần lặp và kết quả tương tự như kết quả khi NonlinearBlockGSđược sử dụng.

Lý do tại sao điều này xảy ra? Tui bỏ lỡ điều gì vậy? Khi nào tôi nên sử dụng NewtonSolverhơn những người khác? Tôi biết rằng rất khó để trả lời nếu không nhìn thấy mã. Nhưng chỉ là mã của tôi dài với nhiều thành phần và tôi không thể tạo lại sự cố với một mô hình đồ chơi. Vì vậy, bất kỳ cái nhìn sâu sắc chung nào cũng được đánh giá cao.

Trả lời

2 JustinGray Aug 22 2020 at 08:57

Nếu không nhìn thấy mã, bạn nói đúng rằng rất khó để đưa ra chi tiết cụ thể.

Nói một cách rộng rãi, Newton đôi khi có thể gặp nhiều khó khăn khi hội tụ hơn NLBGS (Lưu ý: điều này không hoàn toàn đúng, nhưng là một quy tắc ngón tay cái). Vì vậy, những gì tôi đoán đang xảy ra là trong lần lặp đầu tiên hoặc lần thứ hai của bạn, bộ giải newton không thực sự hội tụ. Bạn có thể kiểm tra điều này bằng cách thiết lập newton.options['iprint']=2và xem lịch sử lặp lại khi trình tối ưu hóa lặp lại.

Khi bạn có một bộ giải trong việc tối ưu hóa của mình, điều quan trọng là bạn cũng phải đảm bảo rằng bạn đặt nó để tạo ra lỗi không hội tụ. Một số trình tối ưu hóa có thể xử lý lỗi này và sẽ quay lại quá trình tìm kiếm theo dòng. Những người khác sẽ chết. Dù bằng cách nào, nó cũng quan trọng. Nếu không, bạn sẽ đưa cho trình tối ưu hóa một trường hợp không hợp nhất mà nó không biết là không hợp nhất.

Điều này là xấu vì hai lý do. Đầu tiên, các giá trị mục tiêu và ràng buộc mà nó nhận được sẽ sai! Thứ hai, và có lẽ quan trọng hơn, các dẫn xuất mà nó tính toán sẽ sai! Bạn có thể đọc chi tiết [trong sách hướng dẫn lý thuyết], nhưng tóm lại, các phương pháp đạo hàm giải tích mà OpenMDAO sử dụng giả định rằng phần dư đã bằng 0. Nếu không đúng như vậy, phép toán sẽ bị phá vỡ. Ngay cả khi bạn đang thực hiện mô hình sai biệt hữu hạn đầy đủ, thì các mô hình không hội tụ cũng là một vấn đề. Bạn sẽ chỉ nhận được rác ồn ào khi bạn cố gắng FD nó. 2

Vì vậy, giả sử bạn đã thiết lập mô hình của mình một cách chính xác và bạn có bộ giải tuyến tính thiết lập các vấn đề (nghe có vẻ giống như bạn làm vì nó hoạt động với NLBGS), thì rất có thể bộ giải newton không hội tụ. Sử dụng iprint, có thể kết hợp với in gỡ lỗi trình điều khiển , để tự kiểm tra điều này. Nếu đúng như vậy, bạn cần phải tìm ra cách để newton hoạt động tốt hơn.

Có một số mẹo ở đây khá chung chung. Bạn cũng có thể thử sử dụng tìm kiếm theo đường armijo , thường có thể ổn định một giải newton với cái giá phải trả là tốc độ.

Cuối cùng ... Newton không phải là câu trả lời tốt nhất trong mọi tình huống. Nếu NLBGS ổn định hơn và tính toán rẻ hơn, bạn nên sử dụng nó. Tôi hoan nghênh mong muốn của bạn để nó hoạt động với Newton. Bạn chắc chắn nên tìm ra lý do tại sao không, nhưng nếu hóa ra Newton không thể giải quyết vấn đề liên kết của bạn một cách đáng tin cậy thì điều đó cũng ổn!