繁体   English   中英

当条件数很大且矩阵对称且不定时,是否有任何 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可以。

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包中尝试一些东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM