类 SymmLQ


public class SymmLQ extends PreconditionedIterativeLinearSolver

实现了由Paige和Saunders(1975年)提出的SYMMLQ迭代线性求解器。该实现在很大程度上基于Pr. Michael A. Saunders的FORTRAN代码,可在此处找到。

SYMMLQ旨在解决线性方程组A · x = b,其中A是一个n × n自伴随线性算子(定义为RealLinearOperator),b是一个给定的向量。算子A不需要是正定的。如果已知A是定的,可能更喜欢共轭梯度法,因为它将需要大约与SYMMLQ相同数量的迭代,但每次迭代的工作量略少。

SYMMLQ旨在解决系统(A - shift · I) · x = b,其中shift是一个指定的标量值。如果shift和b选择得当,计算得到的向量x可能近似于A的一个(未归一化的)特征向量,就像逆迭代和/或瑞利商迭代的方法一样。同样,线性算子(A - shift · I)不需要是正定的(但必须是自伴随的)。如果shift = 0,则每次迭代的工作量会略微减少。

预处理

预处理可以减少所需的迭代次数。求解器可以提供一个已知以某种方式近似(A - shift · I)-1的正定预处理器M = PT · P,其中形如M · y = x的矩阵-向量乘积可以高效计算。然后,SYMMLQ将隐式解决方程组P · (A - shift · I) · PT · xhat = P · b,即Ahat · xhat = bhat,其中Ahat = P · (A - shift · I) · PT,bhat = P · b,并返回解x = PT · xhat。相关的残差为rhat = bhat - Ahat · xhat = P · [b - (A - shift · I) · x] = P · r。

在预处理的情况下,此求解器触发的IterativeLinearSolverEvent是这样的,IterativeLinearSolverEvent.getNormOfResidual()返回的是预处理后、更新后的残差范数,||P · r||,而不是真实残差||r||的范数。

默认停止准则

实现了默认的停止准则。当|| rhat || ≤ δ || Ahat || || xhat ||时,迭代停止,其中xhat是转换后系统解的当前估计值,rhat是相应残差的当前估计值,δ是用户指定的容差。

迭代次数

在当前情况下,一个迭代应理解为一次矩阵-向量乘积A · x的评估。因此,初始化阶段计为一次迭代。如果用户要求对A的对称性进行检查,这将在初始阶段需要进行一次额外的矩阵-向量乘积。这一额外的乘积计入迭代次数。换句话说,达到收敛所需的迭代次数将是相同的,无论是否需要进行检查。

当前的迭代次数定义与原始FOTRAN代码中采用的定义不同,原始代码中初始化阶段计入迭代次数。

解的初始猜测

中,x参数在初始阶段被设置为零,不应被视为初始猜测。如果x0已知是对x的良好近似,应计算r0 = b - A · x,求解A · dx = r0,并设置x = x0 + dx。

异常上下文

除了标准的MathIllegalArgumentException外,如果线性算子或预处理器不对称,此类可能会抛出MathIllegalArgumentException

  • "operator"指向有问题的线性算子L,
  • "vector1"指向第一个有问题的向量x,
  • "vector2"指向第二个有问题的向量y,使得xT · L · y ≠ yT · L · x(在一定精度内)。

还可能在预处理器不是正定的情况下抛出MathIllegalArgumentException

参考文献

Paige和Saunders(1975年)
C. C. Paige和M. A. Saunders,稀疏不定线性方程组的解法,SIAM Journal on Numerical Analysis 12(4):617-629,1975年