Tại sao bộ giải tuyến tính lặp của tôi không hội tụ?


26

Điều gì có thể sai khi sử dụng các phương pháp Krylov được đặt trước từ KSP ( gói bộ giải tuyến tính của PETSc ) để giải quyết một hệ thống tuyến tính thưa thớt như các phương pháp thu được bằng cách rời rạc và tuyến tính hóa các phương trình vi phân từng phần?

Những bước nào tôi có thể thực hiện để xác định điều gì đang xảy ra cho vấn đề của mình?

Những thay đổi nào tôi có thể thực hiện để giải quyết thành công và hiệu quả hệ thống tuyến tính của mình?


Bạn có dự định câu hỏi này là một câu hỏi về các bộ giải tuyến tính lặp cụ thể trong PETSc (đó là những gì tôi đã thu thập được từ văn bản thân câu hỏi), hoặc là một câu hỏi về các lỗi thuật toán tiềm năng của các bộ giải tuyến tính lặp trong phần lớn bối cảnh bất khả tri (đó là những gì tôi đã thu thập được khi chỉ nhìn vào tiêu đề)?
Geoff Oxberry

4
Nó có petscthẻ. Phương pháp này là chung chung, nhưng tôi nghĩ rằng câu trả lời sẽ ít hữu ích hơn nếu mỗi "thử cái này" không bao gồm "làm thế nào". Ngoài ra, "cách" sẽ cần dài hơn nhiều (và dễ bị lỗi hơn cho người xem) nếu cần được giải thích theo cách không thể tin được bằng phần mềm. Nếu ai đó muốn giải thích cách thực hiện tất cả những điều này bằng cách sử dụng một gói khác, tôi sẽ vui vẻ đưa ra câu hỏi không biết phần mềm và thay đổi câu trả lời của tôi để nói rằng nó mô tả những việc cần làm trong PETSc. Lưu ý: Tôi đã thêm cái này, đây là phiên bản nâng cao của Câu hỏi thường gặp, vì vậy tôi có thể thích mọi người vào trang web này.
Jed Brown

Câu trả lời:


26

Lời khuyên ban đầu

  • Luôn luôn chạy với -ksp_converged_reason -ksp_monitor_true_residualkhi cố gắng tìm hiểu tại sao một phương thức không hội tụ.
  • Làm cho kích thước vấn đề và số lượng quá trình càng nhỏ càng tốt để chứng minh sự thất bại. Bạn thường có được cái nhìn sâu sắc bằng cách xác định những vấn đề nhỏ thể hiện hành vi khiến phương pháp của bạn bị phá vỡ và thời gian quay vòng được giảm. Ngoài ra, có một số kỹ thuật điều tra chỉ có thể được sử dụng cho các hệ thống nhỏ.
  • Nếu sự cố chỉ phát sinh sau một số lượng lớn các bước thời gian, các bước tiếp tục hoặc các bước giải quyết phi tuyến, hãy xem xét viết trạng thái mô hình ra khi thất bại xảy ra để bạn có thể thử nghiệm nhanh chóng.
  • Ngoài ra, đặc biệt là nếu phần mềm của bạn không có khả năng điểm kiểm tra, sử dụng -ksp_view_binaryhoặc MatView()lưu hệ thống tuyến tính, sau đó sử dụng mã tại $PETSC_DIR/src/ksp/ksp/examples/tutorials/ex10.cđể đọc trong ma trận và giải quyết nó (có thể với một số quy trình khác nhau). Điều này đòi hỏi một ma trận lắp ráp, vì vậy tính hữu dụng của nó có thể bị hạn chế phần nào.
  • Có nhiều lựa chọn người giải có thể (ví dụ: số vô hạn có sẵn trong dòng lệnh trong PETSc do số lượng thành phần tùy ý), hãy xem câu hỏi này để được tư vấn chung về cách chọn người giải tuyến tính.

Những lý do phổ biến khiến KSP không hội tụ

  • Các phương trình là số ít do tình cờ (ví dụ quên áp đặt điều kiện biên). Kiểm tra điều này cho một vấn đề nhỏ bằng cách sử dụng -pc_type svd -pc_svd_monitor. Đồng thời thử -pc_type lusong song với người giải quyết (thông qua gói bên thứ ba, ví dụ -pc_type lu -pc_factor_mat_solver_package superlu_dist).
  • Các phương trình là số ít có chủ ý (ví dụ không gian null không đổi), nhưng phương pháp Krylov không được thông báo, xem KSPSetNullSpace().
  • Các phương trình được cố ý số ít và KSPSetNullSpace()đã được sử dụng, nhưng phía bên tay phải không nhất quán. Bạn có thể phải gọi MatNullSpaceRemove()ở phía bên tay phải trước khi gọi KSPSolve().
  • Các phương trình là không xác định để các điều kiện tiên quyết tiêu chuẩn không hoạt động. Thông thường bạn sẽ biết điều này từ vật lý, nhưng bạn có thể kiểm tra với -ksp_compute_eigenvalues -ksp_gmres_restart 1000 -pc_type none. Đối với các vấn đề điểm yên đơn giản, hãy thử -pc_type fieldsplit -pc_fieldsplit_type schur -pc_fieldsplit_detect_saddle_point. Xem trang hướng dẫn sử dụnghướng dẫn sử dụng PCFIELDSPLIT để biết thêm chi tiết. Đối với các vấn đề khó khăn hơn, hãy đọc tài liệu để tìm các phương pháp mạnh mẽ và hỏi tại đây (hoặc petsc-users@mcs.anl.govhoặc petsc-maint@mcs.anl.gov) nếu bạn muốn tư vấn về cách thực hiện chúng. Ví dụ, xem câu hỏi này cho Helmholtz tần số cao. Đối với kích thước vấn đề khiêm tốn, hãy xem liệu bạn có thể sống với chỉ bằng cách sử dụng một bộ giải trực tiếp.
  • Nếu phương pháp hội tụ ở phần dư tiền điều kiện, nhưng không phải là phần dư thực sự, thì điều kiện tiên quyết có thể là số ít hoặc gần như vậy. Điều này là phổ biến đối với các vấn đề về điểm yên ngựa (ví dụ như dòng chảy không thể nén) hoặc các toán tử không đối xứng mạnh (ví dụ: các vấn đề hyperbol Mach thấp với các bước thời gian lớn).
  • Điều kiện tiên quyết quá yếu hoặc không ổn định. Xem nếu -pc_type asm -sub_pc_type lucải thiện tỷ lệ hội tụ. Nếu GMRES mất quá nhiều tiến bộ trong quá trình khởi động lại, hãy xem nếu trợ giúp khởi động lại lâu hơn -ksp_gmres_restart 300. Nếu chuyển đổi có sẵn, hãy thử -ksp_type bcgshoặc các phương pháp khác không yêu cầu khởi động lại. (Lưu ý rằng sự hội tụ với các phương thức này thường xuyên thất thường.)
  • Ma trận tiền điều kiện có thể không gần với toán tử (có thể chưa được lắp ráp). Hãy thử giải quyết bằng một bộ giải trực tiếp, nối tiếp với -pc_type luhoặc song song bằng cách sử dụng gói của bên thứ ba (ví dụ: -pc_type lu -pc_factor_mat_solver_package superlu_disthoặc mumps). Phương thức sẽ hội tụ trong một lần lặp nếu các ma trận giống nhau và trong một số lần lặp "nhỏ" khác. Cố gắng -snes_type testkiểm tra ma trận nếu giải bài toán phi tuyến.
  • Điều kiện tiên quyết là phi tuyến (ví dụ: giải quyết lặp lồng nhau), hãy thử -ksp_type fgmres or -ksp_type gcr.
  • Bạn đang sử dụng đa hình học, nhưng một số phương trình (thường là điều kiện biên) không được chia tỷ lệ tương thích giữa các cấp. Cố gắng -pc_mg_galerkinxây dựng đại số một toán tử thô được chia tỷ lệ chính xác hoặc đảm bảo rằng tất cả các phương trình được chia tỷ lệ theo cùng một cách nếu bạn muốn sử dụng các mức thô được tái phân bổ.
  • Ma trận rất không điều hòa. Kiểm tra số điều kiện bằng các phương pháp được mô tả ở đây . Cố gắng cải thiện nó bằng cách chọn tỷ lệ tương đối của các thành phần / điều kiện biên. Hãy thử -ksp_diagonal_scale -ksp_diagonal_scale_fix. Có lẽ thay đổi công thức của bài toán để tạo ra các phương trình đại số thân thiện hơn. Nếu bạn không thể sửa tỷ lệ, bạn có thể cần sử dụng bộ giải trực tiếp.
  • Ma trận là phi tuyến (ví dụ: được đánh giá bằng cách sử dụng sự khác biệt hữu hạn của hàm phi tuyến). Hãy thử các tham số khác nhau (ví dụ -mat_mffd_type ds). Hãy thử sử dụng độ chính xác cao hơn để làm cho sự khác biệt chính xác hơn , ./configure --with-precision=__float128 --download-f2cblaslapack. Kiểm tra nếu nó hội tụ trong chế độ tham số "dễ dàng hơn".
  • Một phương pháp đối xứng đang được sử dụng cho một vấn đề không đối xứng.
  • Gram-Schmidt cổ điển đang trở nên không ổn định, hãy thử -ksp_gmres_modifiedgramschmidthoặc sử dụng một phương pháp trực giao hóa khác nhau, ví dụ -ksp_type gcr.

16

Lời khuyên của tôi cho sinh viên là thử một người giải trực tiếp trong những trường hợp này. Lý do là có hai loại lý do tại sao người giải có thể không hội tụ: (i) ma trận sai hoặc (ii) có vấn đề với người giải / điều kiện tiên quyết. Người giải quyết trực tiếp hầu như luôn mang lại một cái gì đó mà bạn có thể so sánh với giải pháp mà bạn mong đợi, vì vậy nếu câu trả lời của người giải trực tiếp có vẻ đúng, thì bạn biết vấn đề là với bộ giải / điều kiện lặp. Mặt khác, nếu câu trả lời có vẻ sai, vấn đề là với việc lắp ráp ma trận và phía bên tay phải.

Tôi thường chỉ sử dụng UMFPACK làm người giải trực tiếp. Tôi chắc chắn thật đơn giản để thử một cái gì đó tương tự với PETSC.


5
-pc_type lu -pc_factor_mat_solver_type umfpackđể sử dụng UMFPACK (hoặc -pc_type cholesky -pc_factor_mat_solver_package cholmodcho các sự cố SPD) thông qua PETSc, nhưng lưu ý rằng UMFPACK và CHOLMOD là nối tiếp. Đối với song song, sử dụng -pc_factor_mat_solver_package superlu_disthoặc mumps, pastix, spooles.
Jed Brown

2
Để rõ ràng, tùy chọn hoàn chỉnh được thiết lập để sử dụng (ví dụ) superlu_distsẽ là -ksp_type preonly -pc_type lu -pc_factor_mat_solver_package superlu_dist. Có đúng không?
Leon Avery

Tôi không biết. Điều gì xảy ra nếu bạn làm điều này?
Wolfgang Bangerth
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.