ทำไมตัวแก้ปัญหาเชิงเส้นย้ำของฉันถึงไม่มาบรรจบกัน?


26

สิ่งที่ผิดพลาดเมื่อใช้วิธี Krylov แบบ preconditoned จากKSP ( แพคเกจแก้ปัญหาเชิงเส้นของPETSc ) เพื่อแก้ปัญหาระบบเชิงเส้นแบบกระจัดกระจายเช่นที่ได้จากการทำ discretizing และ linearizing สมการเชิงอนุพันธ์บางส่วน?

ฉันสามารถใช้ขั้นตอนใดในการพิจารณาว่าเกิดปัญหาอะไรขึ้นกับฉัน

ฉันสามารถเปลี่ยนแปลงอะไรได้บ้างเพื่อแก้ปัญหาระบบเชิงเส้นอย่างประสบความสำเร็จและมีประสิทธิภาพ


คุณตั้งใจจะให้คำถามนี้เป็นคำถามเกี่ยวกับตัวแก้เส้นตรงซ้ำ ๆ โดยเฉพาะใน PETSc (ซึ่งเป็นสิ่งที่ฉันจะรวบรวมจากเนื้อความคำถาม) หรือเป็นคำถามเกี่ยวกับความล้มเหลวของอัลกอริธึมเชิงเส้นของตัวแก้เชิงเส้นซ้ำในซอฟต์แวร์ส่วนใหญ่ บริบทที่ไม่เชื่อเรื่องพระเจ้า (ซึ่งเป็นสิ่งที่ฉันจะได้รวบรวมจากการดูพาดหัวคนเดียว)?
Geoff Oxberry

4
มันมีpetscแท็ก วิธีการเป็นเรื่องทั่วไป แต่ฉันคิดว่าคำตอบจะมีประโยชน์น้อยลงถ้า "ลองทำแบบนี้" ไม่ได้รวม "วิธี" ไว้ด้วย อีกวิธีหนึ่งคือ "วิธีการ" จะต้องมีมากอีกต่อไป (และผิดพลาดได้ง่ายสำหรับผู้ชมมากกว่า) ถ้ามันจำเป็นจะต้องอธิบายในทางซอฟแวร์ไม่เชื่อเรื่องพระเจ้า หากมีคนต้องการที่จะอธิบายวิธีการทำสิ่งต่าง ๆ เหล่านี้โดยใช้แพคเกจที่แตกต่างกันฉันจะทำให้คำถามที่ไม่เชื่อเรื่องพระเจ้าซอฟต์แวร์และเปลี่ยนคำตอบของฉันเพื่อระบุว่ามันอธิบายถึงสิ่งที่ต้องทำใน PETSc หมายเหตุ: ฉันได้เพิ่มสิ่งนี้ซึ่งเป็นรุ่นที่ปรับปรุงของคำถามที่พบบ่อยดังนั้นฉันจึงอยากให้ผู้คนเข้ามาที่ไซต์
Jed Brown

คำตอบ:


26

คำแนะนำเบื้องต้น

  • เรียกใช้ด้วยเสมอ-ksp_converged_reason -ksp_monitor_true_residualเมื่อพยายามที่จะเรียนรู้ว่าทำไมวิธีการไม่ได้มาบรรจบกัน
  • ทำให้ขนาดของปัญหาและจำนวนของกระบวนการเล็กที่สุดเท่าที่จะทำได้เพื่อแสดงให้เห็นถึงความล้มเหลว คุณมักจะเข้าใจอย่างถ่องแท้โดยการพิจารณาว่าปัญหาเล็ก ๆ นั้นแสดงพฤติกรรมที่ทำให้วิธีการของคุณพังทลายลงและลดระยะเวลาในการหมุนรอบ นอกจากนี้ยังมีเทคนิคการตรวจสอบบางอย่างที่สามารถใช้ได้กับระบบขนาดเล็กเท่านั้น
  • หากปัญหาเกิดขึ้นหลังจากขั้นตอนจำนวนมากขั้นตอนต่อเนื่องหรือขั้นตอนการแก้ปัญหาแบบไม่เชิงเส้นให้ลองเขียนสถานะของแบบจำลองออกมาเมื่อเกิดความล้มเหลวเพื่อให้คุณสามารถทดสอบได้อย่างรวดเร็ว
  • อีกทางเลือกหนึ่งโดยเฉพาะอย่างยิ่งหากซอฟต์แวร์ของคุณไม่มีความสามารถในการตรวจสอบใช้-ksp_view_binaryหรือMatView()บันทึกระบบเชิงเส้นจากนั้นใช้โค้ดที่$PETSC_DIR/src/ksp/ksp/examples/tutorials/ex10.cอ่านในเมทริกซ์และแก้ไขมัน (อาจมีกระบวนการที่แตกต่างกัน) นี่ต้องใช้เมทริกซ์ที่ประกอบขึ้นมาดังนั้นจึงมีประโยชน์ค่อนข้าง จำกัด
  • มีตัวเลือกการแก้ปัญหาที่เป็นไปได้มากมาย (เช่นจำนวนอนันต์ที่บรรทัดคำสั่งใน PETSc เนื่องจากจำนวนองค์ประกอบการจัดเรียงตามอำเภอใจ) ดูคำถามนี้สำหรับคำแนะนำทั่วไปเกี่ยวกับการเลือกตัวแก้เชิงเส้น

สาเหตุทั่วไปของ KSP ที่ไม่ได้มาบรรจบกัน

  • สมการนั้นเป็นเอกพจน์จากอุบัติเหตุ (เช่นลืมที่จะกำหนดเงื่อนไขขอบเขต) -pc_type svd -pc_svd_monitorตรวจสอบเรื่องนี้สำหรับปัญหาขนาดเล็กที่ใช้ ลองใช้วิธีแก้ปัญหาโดยตรงด้วย-pc_type lu(ผ่านแพ็คเกจของบุคคลที่สามพร้อมกันเช่น-pc_type lu -pc_factor_mat_solver_package superlu_dist)
  • สมการมีเจตนาเอกพจน์ (เช่นคงพื้นที่ null) แต่วิธี Krylov KSPSetNullSpace()ไม่ได้แจ้งให้ดู
  • สมการนั้นเป็นเอกพจน์โดยเจตนาและKSPSetNullSpace()ถูกนำมาใช้ แต่ด้านขวามือไม่สอดคล้องกัน คุณอาจจะมีการโทรบนด้านขวามือก่อนที่จะเรียกMatNullSpaceRemove()KSPSolve()
  • สมการนั้นไม่ จำกัด จำนวนเพื่อให้ผู้กำหนดเงื่อนไขมาตรฐานไม่สามารถทำงานได้ โดยปกติแล้วคุณจะรู้นี้จากฟิสิกส์ แต่คุณสามารถตรวจสอบกับ -ksp_gmres_restart 1000 -pc_type none-ksp_compute_eigenvalues -pc_type fieldsplit -pc_fieldsplit_type schur -pc_fieldsplit_detect_saddle_pointสำหรับปัญหาจุดง่ายอานลอง ดูคู่มือผู้ใช้และหน้าคน PCFIELDSPLITสำหรับรายละเอียดเพิ่มเติม สำหรับปัญหาที่ยากขึ้นอ่านวรรณกรรมเพื่อค้นหาวิธีการที่มีประสิทธิภาพและถามที่นี่ ( petsc-users@mcs.anl.govหรือpetsc-maint@mcs.anl.gov) หากคุณต้องการคำแนะนำเกี่ยวกับวิธีการใช้งาน ตัวอย่างเช่นดูคำถามนี้สำหรับความถี่สูง Helmholtz สำหรับขนาดของปัญหาที่พอประมาณดูว่าคุณสามารถใช้ชีวิตด้วยการใช้ตัวแก้ปัญหาโดยตรงหรือไม่
  • หากวิธีการมาบรรจบกันในสิ่งที่เหลืออยู่ก่อนกำหนด แต่ไม่ได้อยู่ในความจริงที่เหลืออยู่สิ่งที่น่าเป็นไปได้นั้นน่าจะเป็นเอกพจน์หรือเกือบจะเป็นเช่นนั้น นี่เป็นเรื่องธรรมดาสำหรับปัญหาของจุดอาน (เช่นการไหลที่ไม่บีบอัด) หรือตัวดำเนินการที่ไม่สมมาตรอย่างรุนแรง (เช่นปัญหาไฮเปอร์โบลิคต่ำแมชชีนที่มีขั้นตอนเวลามาก)
  • สิ่งที่จำเป็นก่อนหน้านี้อ่อนเกินไปหรือไม่มั่นคง ดูว่า-pc_type asm -sub_pc_type luปรับปรุงอัตราการลู่เข้าหรือไม่ หาก GMRES -ksp_gmres_restart 300คือการสูญเสียความคืบหน้ามากเกินไปในการรีสตาร์ทดูว่าเตะอีกต่อไปช่วยเหลือ หากมีทรานสโพสต์ให้ลอง-ksp_type bcgsหรือวิธีการอื่นที่ไม่ต้องรีสตาร์ท (โปรดทราบว่าการบรรจบกันกับวิธีการเหล่านี้มักจะผิดปกติ)
  • เมทริกซ์การปรับสภาพล่วงหน้าอาจไม่ใกล้เคียงกับโอเปอเรเตอร์ ลองแก้ด้วยตัวแก้ปัญหาโดยตรงทั้งแบบอนุกรม-pc_type luหรือแบบขนานโดยใช้แพ็คเกจของบุคคลที่สาม (เช่น-pc_type lu -pc_factor_mat_solver_package superlu_distหรือmumps) วิธีการควรมาบรรจบกันในการทำซ้ำหนึ่งถ้าเมทริกซ์เหมือนกันและในการทำซ้ำ "เล็ก" จำนวนอื่น ลอง-snes_type testตรวจสอบเมทริกซ์หากการแก้ปัญหาไม่เชิงเส้น
  • preconditioner คือไม่เชิงเส้น (เช่นซ้อนกันย้ำแก้) -ksp_type fgmres or -ksp_type gcrลอง
  • คุณกำลังใช้เรขาคณิตหลายจุด แต่สมการบางอย่าง (มักจะเป็นเงื่อนไขขอบเขต) ไม่ได้ถูกปรับอัตราส่วนให้เข้ากันได้ระหว่างระดับ ลอง-pc_mg_galerkinสร้างตัวดำเนินการเชิงพีชคณิตที่ปรับขนาดได้อย่างถูกต้องในเชิงพีชคณิตหรือตรวจสอบให้แน่ใจว่าสมการทั้งหมดได้รับการปรับขนาดในลักษณะเดียวกันหากคุณต้องการใช้ระดับหยาบที่ลดลง
  • เมทริกซ์นั้นปรับอากาศมาก ตรวจสอบหมายเลขสภาพโดยใช้วิธีการอธิบายไว้ที่นี่ พยายามปรับปรุงโดยเลือกการปรับขนาดของส่วนประกอบ / เงื่อนไขขอบเขต ลอง-ksp_diagonal_scale -ksp_diagonal_scale_fixดู อาจเปลี่ยนการกำหนดปัญหาเพื่อสร้างสมการพีชคณิตที่เป็นมิตรมากขึ้น หากคุณไม่สามารถแก้ไขมาตราส่วนคุณอาจต้องใช้ตัวแก้ปัญหาโดยตรง
  • เมทริกซ์เป็นแบบไม่เชิงเส้น (เช่นประเมินโดยใช้การหาผลต่าง จำกัด ของฟังก์ชันแบบไม่เชิงเส้น) ลองใช้พารามิเตอร์ที่แตกต่างกัน (เช่น-mat_mffd_type ds) ลองใช้ความแม่นยำที่สูงขึ้นจะทำให้ differencing ./configure --with-precision=__float128 --download-f2cblaslapackถูกต้องมากขึ้น ตรวจสอบว่ามันมาบรรจบกันในระบบพารามิเตอร์ "ง่ายขึ้น"
  • มีการใช้วิธีการแบบสมมาตรสำหรับปัญหาที่ไม่สมมาตร
  • คลาสสิกแกรมชมิดท์จะกลายเป็นไม่แน่นอนลอง-ksp_gmres_modifiedgramschmidtหรือใช้วิธีการที่แตกต่างกัน orthogonalizes -ksp_type gcrเช่น

16

คำแนะนำของฉันสำหรับนักเรียนคือลองแก้ปัญหาโดยตรงในกรณีเหล่านี้ เหตุผลก็คือมีเหตุผลสองประการที่นักแก้ปัญหาอาจไม่มาบรรจบกัน: (i) เมทริกซ์นั้นผิดหรือ (ii) มีปัญหากับตัวแก้ / ตัวสร้างเงื่อนไข Direct solver ให้ผลลัพธ์ที่คุณสามารถเปรียบเทียบกับโซลูชันที่คุณคาดหวังได้เสมอดังนั้นหากคำตอบของตัวแก้ปัญหาโดยตรงนั้นดูถูกต้องคุณจะรู้ว่าปัญหานั้นเกิดจากตัวแก้ / การวนซ้ำที่ซ้ำซ้อน ในทางกลับกันถ้าคำตอบดูผิดปัญหาก็คือการประกอบเมทริกซ์และด้านขวามือ

ฉันมักจะใช้ UMFPACK เป็นตัวแก้ปัญหาโดยตรง ฉันแน่ใจว่ามันง่ายที่จะลองอะไรที่คล้ายกับ PETSC


5
-pc_type lu -pc_factor_mat_solver_type umfpackเพื่อใช้ UMFPACK (หรือ-pc_type cholesky -pc_factor_mat_solver_package cholmodสำหรับปัญหา SPD) ผ่าน PETSc แต่โปรดทราบว่า UMFPACK และ CHOLMOD เป็นอนุกรม สำหรับคู่ขนานการใช้งาน-pc_factor_mat_solver_package superlu_distหรือmumps, ,pastix spooles
Jed Brown

2
เพียงเพื่อจะชัดเจนชุดตัวเลือกที่สมบูรณ์แบบสำหรับการใช้งาน (เช่น) จะเป็นsuperlu_dist -ksp_type preonly -pc_type lu -pc_factor_mat_solver_package superlu_distนั่นถูกต้องใช่ไหม?
Leon Avery

ฉันไม่รู้ จะเกิดอะไรขึ้นถ้าคุณทำเช่นนี้?
Wolfgang Bangerth
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.