首页 > 解决方案 > 当条件数很大并且矩阵是对称且不定的时,是否有任何 ojAlgo 求解器?

问题描述

我使用 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;
         }

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

标签: javasolverlinear-equationojalgoindefinite

解决方案


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

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

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包装中的一些东西。


推荐阅读