Tại sao phương pháp của Newton không hội tụ?


22

Tôi đang sử dụng gói giải quyết phi tuyến SNES của PETSc để giải một hệ phương trình phi tuyến thu được bằng cách phân biệt một phương trình vi phân từng phần. Làm thế nào tôi có thể xác định tại sao người giải không hội tụ và tôi có thể làm gì để giải thành công phương trình của mình?


8
Như với bất kỳ phương pháp lặp lại nào, điều tối quan trọng là người ta nghĩ ra một hạt giống tốt để khởi động phương pháp Newton-Raphson. Một điểm khởi đầu kém thường dẫn đến hỗn loạn.
JM

6
Tôi nghĩ rằng "thường dẫn đến hỗn loạn" là không chính xác. Nhắc đến Blum, Cucker, Shub và Smale, Newton có các lưu vực hấp dẫn cách nhau bởi các ranh giới có thể dẫn đến việc lặp lại hỗn loạn. Do đó loại hành vi này rất khó xảy ra so với hội tụ. Nếu thuật toán chỉ tìm kiếm các giải pháp thực sự, nó sẽ không hội tụ thường xuyên, nhưng sẽ không trở nên hỗn loạn.
Matt Knepley

5
Tôi có nghĩa là "hỗn loạn" theo nghĩa phi kỹ thuật, @Matt; ví dụ, phân kỳ đến vô cực, hoặc hành vi tuần hoàn. Có lẽ "thảm họa" sẽ là một lựa chọn tốt hơn của các từ?
JM

Câu trả lời:


42

Phương pháp của Newton có thể không hội tụ vì nhiều lý do, đây là một số trong những lý do phổ biến nhất.

  • Jacobian sai (hoặc đúng theo tuần tự nhưng không song song).
  • Hệ thống tuyến tính không được giải quyết hoặc không được giải quyết đủ chính xác.
  • Hệ thống Jacobian có một điểm kỳ dị mà bộ giải tuyến tính không xử lý.
  • Có một lỗi trong thói quen đánh giá chức năng.
  • Hàm này không liên tục hoặc không có đạo hàm đầu tiên liên tục (ví dụ: thay đổi pha hoặc bộ giới hạn TVD).
  • Các phương trình có thể không có giải pháp (ví dụ chu kỳ giới hạn thay vì trạng thái ổn định) hoặc có thể có một "ngọn đồi" giữa dự đoán ban đầu và trạng thái ổn định (ví dụ: chất phản ứng phải đốt cháy và đốt cháy trước khi đạt đến trạng thái ổn định, nhưng ổn định- trạng thái dư sẽ lớn hơn trong quá trình đốt cháy).

Dưới đây là một số cách giúp gỡ lỗi thiếu sự hội tụ của Newton.

  • Chạy với các tùy chọn -snes_monitor -ksp_monitor_true_residual -snes_converged_reason -ksp_converged_reason. Nếu giải quyết tuyến tính không hội tụ, hãy kiểm tra xem Jacobian có đúng không, sau đó xem câu hỏi này . Nếu phần dư tiền điều kiện hội tụ, nhưng phần dư thực sự thì không, phần tiền điều kiện có thể là số ít. Nếu giải quyết tuyến tính hội tụ tốt, nhưng tìm kiếm dòng không thành công, Jacobian có thể không chính xác.
  • Chạy với -pc_type lu or -pc_type svdđể xem nếu vấn đề là một người giải tuyến tính kém
  • Chạy với -mat_viewhoặc -mat_view_drawđể xem Jacobian có hợp lý không
  • Chạy với -snes_type test -snes_test_displayđể xem nếu Jacobian bạn đang sử dụng là sai. So sánh đầu ra khi bạn thêm -mat_fd_type dsđể xem kết quả có nhạy cảm với lựa chọn tham số khác biệt hay không.
  • Chạy với -snes_mf_operator -pc_type luđể xem nếu Jacobian bạn đang sử dụng là sai. Nếu vấn đề quá lớn để giải quyết trực tiếp, hãy thử -snes_mf_operator -pc_type ksp -ksp_ksp_rtol 1e-12. So sánh đầu ra khi bạn thêm -mat_mffd_type dsđể xem kết quả có nhạy cảm với lựa chọn tham số khác biệt hay không.
  • Chạy trên một bộ xử lý để xem sự cố chỉ xảy ra song song.
  • Chạy với -snes_ls_monitorđể xem nếu tìm kiếm dòng không thành công (đây thường là dấu hiệu của một Jacobian xấu).
  • Chạy với -infođể có được thông tin chi tiết hơn về quy trình giải pháp.

Dưới đây là một số cách giúp Newton xử lý nếu mọi thứ ở trên kiểm tra

  • Chạy với trình tự lưới ( -snes_grid_sequencelà tất cả những gì bạn cần nếu làm việc với a DM) để tạo dự đoán ban đầu tốt hơn trên lưới tốt hơn của bạn
  • Chạy với độ chính xác quad ( ./configure --with-precision=__float128 --download-f2cblaslapackvới PETSc 3.2 trở lên, cần trình biên dịch GNU phiên bản 4.6 trở lên)
  • Thay đổi các đơn vị (không phá hủy), chia tỷ lệ điều kiện biên hoặc xây dựng sao cho Jacobian được điều hòa tốt hơn.
  • Các tính năng mollify trong chức năng không có đạo hàm đầu tiên liên tục (thường xảy ra khi có các ifcâu lệnh trong đánh giá dư, ví dụ: thay đổi pha hoặc bộ hạn chế TVD). Sử dụng một bộ giải bất đẳng thức đa dạng ( SNESVINEWTONRSLS ) nếu sự không liên tục có tầm quan trọng cơ bản.
  • Hãy thử một phương pháp vùng tin cậy ( -ts_type tr, có thể phải điều chỉnh các tham số).
  • Chạy với một số tham số tiếp tục từ một điểm mà bạn biết giải pháp, xem TSPSEUDO để giải quyết các vấn đề ở trạng thái ổn định. Có các gói giải đồng tính như PHCpack có thể cung cấp cho bạn tất cả các giải pháp có thể (và nói với bạn rằng nó đã tìm thấy tất cả) nhưng chúng không thể mở rộng và không thể giải quyết bất cứ điều gì ngoại trừ các vấn đề nhỏ.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.