类 SymmLQ
实现了由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代码中采用的定义不同,原始代码中初始化阶段不计入迭代次数。
解的初始猜测在
solve(RealLinearOperator, RealVector, RealVector)
,solve(RealLinearOperator, RealLinearOperator, RealVector, RealVector)
},solveInPlace(RealLinearOperator, RealVector, RealVector)
,solveInPlace(RealLinearOperator, RealLinearOperator, RealVector, RealVector)
,solveInPlace(RealLinearOperator, RealLinearOperator, RealVector, RealVector, boolean, double)
,
中,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年
-
构造器概要
构造器说明SymmLQ
(int maxIterations, double delta, boolean check) 创建此类的新实例,使用默认停止准则。SymmLQ
(IterationManager manager, double delta, boolean check) 创建此类的新实例,使用默认停止准则和自定义迭代管理器。 -
方法概要
修饰符和类型方法说明final boolean
返回true
,如果应检查矩阵的对称性,以及预处理器的对称性和正定性。返回线性系统A · x = b的解的估计值。solve
(RealLinearOperator a, RealLinearOperator m, RealVector b, boolean goodb, double shift) 返回线性系统(A - shift · I) · x = b的解的估计值。solve
(RealLinearOperator a, RealLinearOperator m, RealVector b, RealVector x) 返回线性系统A · x = b的解的估计值。返回线性系统A · x = b的解的估计值。solve
(RealLinearOperator a, RealVector b, boolean goodb, double shift) 返回系统(A - shift · I) · x = b的解。solve
(RealLinearOperator a, RealVector b, RealVector x) 返回线性系统A · x = b的解的估计值。返回线性系统A · x = b的解的估计值。solveInPlace
(RealLinearOperator a, RealLinearOperator m, RealVector b, RealVector x, boolean goodb, double shift) 返回线性系统(A - shift · I) · x = b的解的估计值。返回线性系统A · x = b的解的估计值。从类继承的方法 org.hipparchus.linear.PreconditionedIterativeLinearSolver
checkParameters
从类继承的方法 org.hipparchus.linear.IterativeLinearSolver
checkParameters, getIterationManager
-
构造器详细资料
-
SymmLQ
public SymmLQ(int maxIterations, double delta, boolean check) - 参数:
-
maxIterations
- 最大迭代次数 -
delta
- 默认停止准则的δ参数 -
check
- 如果应检查矩阵和预处理器的自伴性,则为true
-
SymmLQ
- 参数:
-
manager
- 自定义迭代管理器 -
delta
- 默认停止准则的δ参数 -
check
- 如果应检查矩阵和预处理器的自伴性,则为true
-
-
方法详细资料
-
shouldCheck
public final boolean shouldCheck()返回true
,如果应检查矩阵的对称性,以及预处理器的对称性和正定性。- 返回:
-
如果要执行测试,则为
true
- 从以下版本开始:
- 1.4
-
solve
public RealVector solve(RealLinearOperator a, RealLinearOperator m, RealVector b) throws MathIllegalArgumentException, NullArgumentException, MathIllegalStateException, MathIllegalArgumentException 返回线性系统A · x = b的解的估计值。- 覆盖:
-
solve
在类中PreconditionedIterativeLinearSolver
- 参数:
-
a
- 系统的线性算子 A -
m
- 预处理器 M(可以为null
) -
b
- 右侧向量 - 返回:
- 包含解的新向量
- 抛出:
-
MathIllegalArgumentException
- 如果shouldCheck()
为true
,且a
或m
不是自共轭的 -
MathIllegalArgumentException
- 如果m
不是正定的 -
MathIllegalArgumentException
- 如果a
条件数不好 -
NullArgumentException
- 如果参数中有一个为null
-
MathIllegalStateException
- 在迭代计数耗尽时,除非在构造IterationManager
时设置了自定义callback
-
solve
public RealVector solve(RealLinearOperator a, RealLinearOperator m, RealVector b, boolean goodb, double shift) throws MathIllegalArgumentException, NullArgumentException, MathIllegalStateException 返回线性系统(A - shift · I)· x = b 的解的估计。如果预期解x包含大量
b
的倍数(如瑞利商迭代),则可以通过将goodb
设置为true
来获得更好的精度;但这需要额外调用预处理器。如果要解决系统A · x = b,则
shift
应为零。否则,它可以是A的特征值的近似值,例如与向量b对应的瑞利商bT · A · b / (bT · b)。如果b足够像与shift附近的特征值对应的特征向量,则计算得到的x可能具有非常大的分量。归一化后,x可能比b更接近特征向量。- 参数:
-
a
- 系统的线性算子 A -
m
- 预处理器 M(可以为null
) -
b
- 右侧向量 -
goodb
- 通常为false
,除非预期x
包含b
的大量倍数 -
shift
- 要从A的所有对角元素中减去的量 - 返回:
-
对
x
的引用(浅拷贝) - 抛出:
-
NullArgumentException
- 如果参数中有一个为null
-
MathIllegalArgumentException
- 如果a
或m
不是方阵 -
MathIllegalArgumentException
- 如果m
或b
的维度与a
不一致 -
MathIllegalStateException
- 在迭代计数耗尽时,除非在构造IterationManager
时设置了自定义callback
-
MathIllegalArgumentException
- 如果shouldCheck()
为true
,且a
或m
不是自共轭的 -
MathIllegalArgumentException
- 如果m
不是正定的 -
MathIllegalArgumentException
- 如果a
条件数不好
-
solve
public RealVector solve(RealLinearOperator a, RealLinearOperator m, RealVector b, RealVector x) throws MathIllegalArgumentException, NullArgumentException, MathIllegalArgumentException, MathIllegalStateException 返回线性系统 A · x = b 的解的估计。- 覆盖:
-
solve
在类中PreconditionedIterativeLinearSolver
- 参数:
-
a
- 系统的线性算子 A -
m
- 预处理器 M(可以为null
) -
b
- 右侧向量 -
x
- 在此实现中无意义;不应将其视为初始猜测(更多) - 返回:
- 包含解的新向量
- 抛出:
-
MathIllegalArgumentException
- 如果shouldCheck()
为true
,且a
或m
不是自共轭的 -
MathIllegalArgumentException
- 如果m
不是正定的 -
MathIllegalArgumentException
- 如果a
条件数不好 -
NullArgumentException
- 如果参数中有一个为null
-
MathIllegalStateException
- 在迭代计数耗尽时,除非在构造IterationManager
时设置了自定义callback
-
solve
public RealVector solve(RealLinearOperator a, RealVector b) throws MathIllegalArgumentException, NullArgumentException, MathIllegalArgumentException, MathIllegalStateException 返回线性系统 A · x = b 的解的估计。- 覆盖:
-
solve
在类中PreconditionedIterativeLinearSolver
- 参数:
-
a
- 系统的线性算子 A -
b
- 右侧向量 - 返回:
- 包含解的新向量
- 抛出:
-
MathIllegalArgumentException
- 如果shouldCheck()
为true
,且a
不是自共轭的 -
MathIllegalArgumentException
- 如果a
条件数不好 -
NullArgumentException
- 如果参数中有一个为null
-
MathIllegalStateException
- 在迭代计数耗尽时,除非在构造IterationManager
时设置了自定义callback
-
solve
public RealVector solve(RealLinearOperator a, RealVector b, boolean goodb, double shift) throws MathIllegalArgumentException, NullArgumentException, MathIllegalStateException 返回系统(A - shift · I)· x = b 的解。如果预期解x包含大量
b
的倍数(如瑞利商迭代),则可以通过将goodb
设置为true
来获得更好的精度。如果要解决系统A · x = b,则
shift
应为零。否则,它可以是A的特征值的近似值,例如与向量b对应的瑞利商bT · A · b / (bT · b)。如果b足够像与shift附近的特征值对应的特征向量,则计算得到的x可能具有非常大的分量。归一化后,x可能比b更接近特征向量。- 参数:
-
a
- 系统的线性算子A -
b
- 右手边的向量 -
goodb
- 通常为false
,除非期望x
包含b
的大倍数 -
shift
- 要从A的所有对角线元素中减去的量 - 返回:
-
对
x
的引用 - 抛出:
-
NullArgumentException
- 如果参数中有一个是null
-
MathIllegalArgumentException
- 如果a
不是方阵 -
MathIllegalArgumentException
- 如果b
的维度与a
不一致 -
MathIllegalStateException
- 在迭代计数耗尽时,除非在IterationManager
的构造中设置了自定义callback
-
MathIllegalArgumentException
- 如果shouldCheck()
为true
,且a
不是自共轭的 -
MathIllegalArgumentException
- 如果a
病态
-
solve
public RealVector solve(RealLinearOperator a, RealVector b, RealVector x) throws MathIllegalArgumentException, NullArgumentException, MathIllegalArgumentException, MathIllegalStateException 返回线性系统A · x = b的解的估计值。- 覆盖:
-
solve
在类中PreconditionedIterativeLinearSolver
- 参数:
-
a
- 系统的线性算子A -
b
- 右手边的向量 -
x
- 在此实现中无意义;不应被视为初始猜测(更多) - 返回:
- 包含解的新向量
- 抛出:
-
MathIllegalArgumentException
- 如果shouldCheck()
为true
,且a
不是自共轭的 -
MathIllegalArgumentException
- 如果a
病态 -
NullArgumentException
- 如果参数中有一个是null
-
MathIllegalStateException
- 在迭代计数耗尽时,除非在IterationManager
的构造中设置了自定义callback
-
solveInPlace
public RealVector solveInPlace(RealLinearOperator a, RealLinearOperator m, RealVector b, RealVector x) throws MathIllegalArgumentException, NullArgumentException, MathIllegalArgumentException, MathIllegalStateException 返回线性系统A · x = b的解的估计值。解是原地计算的(初始猜测被修改)。- 指定者:
-
solveInPlace
在类中PreconditionedIterativeLinearSolver
- 参数:
-
a
- 系统的线性算子A -
m
- 预处理器M(可以为null
) -
b
- 右手边的向量 -
x
- 要更新为解的向量;x
不应被视为初始猜测(更多) - 返回:
-
对
x0
的引用(浅拷贝),更新为解 - 抛出:
-
MathIllegalArgumentException
- 如果shouldCheck()
为true
,且a
或m
不是自共轭的 -
MathIllegalArgumentException
- 如果m
不是正定的 -
MathIllegalArgumentException
- 如果a
病态 -
NullArgumentException
- 如果参数中有一个是null
-
MathIllegalStateException
- 在迭代计数耗尽时,除非在IterationManager
的构造中设置了自定义callback
-
solveInPlace
public RealVector solveInPlace(RealLinearOperator a, RealLinearOperator m, RealVector b, RealVector x, boolean goodb, double shift) throws MathIllegalArgumentException, NullArgumentException, MathIllegalStateException 返回线性系统(A - shift · I) · x = b的解的估计值。解是原地计算的。如果预计解x包含
b
的大倍数(如瑞利商迭代),则可以通过将goodb
设置为true
来获得更好的精度;但这需要额外调用预处理器。如果预计解x包含
b
的大倍数(如瑞利商迭代),则可以通过将goodb
设置为true
来获得更好的精度;但这需要额外调用预处理器。shift
如果要解决系统A · x = b,则应为零。否则,它可以是A的特征值的近似值,例如与向量b对应的瑞利商bT · A · b / (bT · b)。如果b足够像接近shift的特征向量,则计算的x可能具有非常大的分量。归一化后,x可能比b更接近特征向量。- 参数:
-
a
- 系统的线性算子A -
m
- 预处理器M(可以为null
) -
b
- 右手边的向量 -
x
- 要更新为解的向量;x
不应被视为初始猜测(更多) -
goodb
- 通常为false
,除非期望x
包含b
的大倍数 -
shift
- 要从A的所有对角线元素中减去的量 - 返回:
-
对
x
的引用(浅拷贝)。 - 抛出:
-
NullArgumentException
- 如果参数中有一个是null
-
MathIllegalArgumentException
- 如果a
或m
不是方阵 -
MathIllegalArgumentException
- 如果m
,b
或x
的维度与a
不一致 -
MathIllegalStateException
- 在迭代计数耗尽时,除非在IterationManager
的构造中设置了自定义callback
-
MathIllegalArgumentException
- 如果shouldCheck()
为true
,且a
或m
不是自共轭的 -
MathIllegalArgumentException
- 如果m
不是正定的 -
MathIllegalArgumentException
- 如果a
病态
-
solveInPlace
public RealVector solveInPlace(RealLinearOperator a, RealVector b, RealVector x) throws MathIllegalArgumentException, NullArgumentException, MathIllegalArgumentException, MathIllegalStateException 返回线性系统A · x = b的解的估计值。解是原地计算的(初始猜测被修改)。- 覆盖:
-
solveInPlace
在类中PreconditionedIterativeLinearSolver
- 参数:
-
a
- 系统的线性算子 A -
b
- 右侧向量 -
x
- 要更新为解的向量;x
不应被视为初始猜测(更多) - 返回:
-
引用更新为解的
x0
(浅拷贝) - 抛出:
-
MathIllegalArgumentException
- 如果shouldCheck()
为true
,且a
不是自共轭的 -
MathIllegalArgumentException
- 如果a
病态 -
NullArgumentException
- 如果参数中有一个是null
-
MathIllegalStateException
- 在迭代次数耗尽时,除非在IterationManager
的构造中设置了自定义callback
-