Làm thế nào tôi có thể tính toán bổ sung Schur:
Ở đâu
(trong một số thứ tự) là một ma trận PETSc ( Mat
)?
Làm thế nào tôi có thể tính toán bổ sung Schur:
Ở đâu
(trong một số thứ tự) là một ma trận PETSc ( Mat
)?
Câu trả lời:
Nó rất tốn kém để tính toán bổ sung Schur của một ma trận và rất hiếm khi cần thiết trong thực tế. PETSc khuyên bạn nên tránh các thuật toán cần nó. Bổ sung Schur của một ma trận (dày đặc hoặc thưa thớt) về cơ bản luôn luôn dày đặc, vì vậy hãy bắt đầu bằng:
MatLUFactor()
MatCholeskyFactor()
MatGetFactor()
MatLUFactorSymbolic()
MatLUFactorNumeric()
A
MatMatSolve(A,Kba,T)
.MatMatMult(Kab,T,MAT_INITIAL_MATRIX,1.0,&S)
.MatAXPY(S,-1.0,Kbb,MAT_SUBSET_NONZERO)
.MatScale(S,-1.0)
KSP
MatCreateSchurComplement(Kaa,Kaa_pre,Kab,Kba,Kbb,&S)
S
Kaa_pre
Kaa
IS
MatGetSchurComplement()
MatGetSchurComplement()
Một cách khác là diễn giải các ma trận như các toán tử vi phân và áp dụng các đối số của bộ chuyển đổi gần đúng để tìm một phép toán tương đương có thể được áp dụng hiệu quả (xem các điều kiện tiên quyết "PCD" từ Elman, Silvester và Wathen). Một biến thể của điều này là cổ góp bình phương nhỏ nhất, có liên quan chặt chẽ với giả hành Moore-Penrose, và có sẵn trong PCLSC
đó hoạt động trên ma trận loại MATSCHURCOMPLEMENT
.