java - 当条件数很大并且矩阵是对称且不定的时,是否有任何 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;
}
我试图在一个自包含的示例中重现这一点,但失败了,因为它在那里工作。也许我没有得到完全相同的矩阵直到最后一位。
解决方案
在您的情况下,该方法将使用 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
包装中的一些东西。
推荐阅读
- apache-spark - 外部查找 Spark Streaming
- r - 如何制作包含大量数据的热图?
- python - ansible 错误:从版本导入 VERSION\nImportError: No module named version\n", "module_stdout": "", "msg": "MODULE FAILURE", "rc": 0}
- web-services - 从 Oracle 触发器调用 Web 服务
- angularjs - Ionic 2 中具有多个字段的条码扫描器
- angularjs - AngularJS - 客户端 MVC - 在目录结构中放置“模型”的位置
- jekyll - 包括来自另一个 MD 文件的前事
- ruby-on-rails - 地理编码器 - 如何使用多点附近查询?
- javascript - 如何在 react-native 中从 AsyncStorage 中删除特定项目?
- python - django 扩展隐藏前后导入