该错误表明不完全 Cholesky 方法已失效,这是众所周知的对称正定矩阵的可能性,但不是对角占优矩阵。也就是说,即使矩阵具有(完全)Cholesky 分解,它也可能没有不完全 Cholesky 分解。
cholinc
不会出现故障,因为它不是真正的不完整 Cholesky。相反,它luinc
在没有旋转的情况下调用,抛出 L,然后缩放得到的 U 以获得一种不完整的 Cholesky 因子(请参阅 文档cholinc
,算法部分的第一段)。cholinc
您可以通过 using获得与 from 非常相似的因子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
上面的时间包括发出警告的时间,但是只有一个警告的 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
。