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_view
hoặ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_sequence
là 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-f2cblaslapack
vớ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
if
câ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ỏ.