当条件数很大且矩阵对称且不定时,是否有任何 ojAlgo 求解器?

Is there any ojAlgo solver for when the condition number is large and the matrix is symmetric and indefinite?

我使用 ojAlgo 求解线性方程组。 在一种情况下,我得到一个 RecoverableCondition 异常。可能因为矩阵是病态的,条件数大约是1e15.

我使用 ojAlgo 来解决它,如下面的代码所示。它通常有效,但在这种情况下无效。

是否有任何其他求解器可用于对称不定(病态)矩阵?

目前的失败尺寸是 18x18,但以后可能需要 1000x1000。由于它是迭代算法的一部分,因此准确性并不是特别重要。

         SolverTask<Double> equationSolver = SolverTask.PRIMITIVE.make(KKT, rhs.negate());
         MatrixStore<Double> deltaX = null;
         try {
            deltaX = equationSolver.solve(KKT, rhs.negate());
         } catch (RecoverableCondition ex) {
            int i = 0;
         }

我试图在一个自包含的例子中重现这个但失败了,因为它在那里工作。也许我没有得到完全相同的矩阵到最后一位。

对于您的情况,该方法将使用 Cholesky 分解作为求解器。

如果这里有问题,请尝试通过直接实例化一个合适的替代方案来选择另一个分解。 SVD 通常可以处理任何事情,但那会非常昂贵。或许二维码可以吧

QR<Double> qr = QR.PRIMITIVE.make(templateBody);
qr.decompose(body);
qr.getSolution(rhs,x);

这样您就可以重用分解实例和解向量 x

另一种方法是预处理 body/KKT 矩阵。也许添加一条小对角线 - 刚好足以使 Cholesky 分解可解。

if (!cholesky.isSolvable()) {
    // Fix that
}

或者尝试 org.ojalgo.matrix.task.iterative 包中的东西。