1

在 Matlab 2012 中,该cholinc命令被标记为过时。警告消息说它将被替换为ichol. 直到现在我都在使用cholinc(A,droptol),通常与droptol=1E-15. 在我尝试使用的新版本中ichol(A,struct('droptol',droptol,'type','ict')),大部分时间都可以使用,但有时我会收到警告消息

Error using ichol
Encountered nonpositive pivot.

这是一个基本问题(即一个问题cholinc也有但没有报告)还是有办法让ichol行为像cholinc以前那样?

4

1 回答 1

9

该错误表明不完全 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 的跌落公差非常小。如果这是您使用的那种容差,则最好使用完整的因式分解,例如cholldllu

于 2012-10-15T18:34:52.940 回答