このエラーは、不完全なコレスキー法が破綻したことを示しています。これは、対称正定行列ではよく知られている可能性ですが、対角優勢行列ではそうではありません。つまり、行列に (完全な) コレスキー分解が含まれていても、不完全なコレスキー分解が含まれていない場合があります。
cholinc
真の不完全コレスキーではないため、故障しません。むしろ、luinc
ピボットなしで呼び出し、L をスローし、結果の U をスケーリングして一種の不完全なコレスキー係数を取得します (cholinc
アルゴリズム セクションの最初の段落のドキュメントを参照してください)。cholinc
を使用して、それと非常によく似た係数を取得できます(これも廃止されていることにilu
注意してください)。luinc
[L,U] = ilu(A,struct('type','ilutp','droptol',droptol,'thresh',0));
R = diag(sqrt(abs(diag(U))))\U;
% Essentially the same as cholinc.
ichol
可能であれば、 を使用することを強くお勧めします。このオプションを使用'diagcomp'
して因数分解の崩壊を防ぐことができますが、効果的なパラメーターを見つけるにalpha
は実験が必要になる場合があることに注意してください。例については、ドキュメントを参照してくださいichol
。ichol
が壊れていない場合は、対称性を利用するため、はるかに高速になる傾向があります。cholinc
また、前処理としての因子の適用が高速になる結果よりもまばらな因子が生成される傾向がありpcg
ます。例えば、
M = delsq(numgrid('L',200));
tic; R1 = ichol(M,struct('type','ict','droptol',1e-2,'shape','upper')); toc
% Elapsed time is 0.013809 seconds.
nnz(R1)
% ans = 145632
tic; R = cholinc(M,1e-2); toc
% Elapsed time is 0.167155 seconds.
nnz(R)
% ans = 173851
公平を期すために、cholinc
上記のタイミングには警告を発信する時間が含まれていますが、ただ 1 つの警告の tic/toc は、この特定の計算のノイズの中にいる時間を示しています。
ichol
最後に、既定では、 は入力行列の下三角を参照し、下三角係数を返すことに注意してください。下三角因子を優先すると、パフォーマンスが大幅に向上する可能性があります。
tic; L = ichol(M,struct('type','ict','droptol',1e-2)); toc
% Elapsed time is 0.008895 seconds.
最後に、上記で参照した 1e-15 のドロップ許容値は非常に小さいです。chol
使用している許容範囲がこのようなものである場合は、 、ldl
、またはなどの完全な因数分解を使用する方がよい場合がありますlu
。