【问题标题】:Scipy Sparse: Singular Matrix Warning after SciPy/NumPy UpdateScipy Sparse:SciPy/NumPy 更新后的奇异矩阵警告
【发布时间】:2017-08-11 07:59:31
【问题描述】:

我的问题源于对大型电阻系统的节点分析。我基本上是在设置一个大的稀疏矩阵A,我的解向量b,我正在尝试求解线性方程A * x = b。 为此,我使用了 scipy.sparse.linalg.spsolve 方法。

直到最近,一切正常,直到我将 SciPy 从 v0.13.3 升级到 v0.19.1(其中还包括 NumPy 升级到 v1.13.1)。我正在运行 Python 2.7.6。使用与更新前相同的代码时,我会遇到错误,尤其是对于产生 matrices > 10000 x 10000 的系统。 警告是:

SparseEfficiencyWarning: splu requires CSC matrix format
  warn('splu requires CSC matrix format', SparseEfficiencyWarning)
MatrixRankWarning: Matrix is exactly singular
  warn("Matrix is exactly singular", MatrixRankWarning)

spsolve 然后 - 有时 - 无法找到解决方案。

当我执行节点分析时,由于接地电位的位置通常没有明确定义,因此预计会出现奇异矩阵。但是,在更新之前,在 99% 的情况下找到了解决方案,也许更多。现在,对于大型系统,我最多只有 10%。我没有更改算法,并且在一些测试中,我使用了与以前相同的代码。以下是我设置计算的方式:

  1. 我生成了一个随机的 3D 电阻网络(我意识到我可能会不小心创建无法解决的网络,但上面的百分比不应该有太大的变化)。这里使用的唯一 SciPy/NumPy 函数是 np.random
  2. 我创建了一个稀疏的 lil 矩阵,填充了从电阻网络中提取的电导值。我还创建了一个不稀疏的解向量。
  3. 我将电导矩阵转换为 csr 格式并使用 spsolve 方法。这是我的代码最近失败的地方。

会不会是方​​法变了?

spsolve 是否可能不合适?我创建的矩阵通常是对称的,并且是块三对角形式。有没有比 spsolve 更有效的方法来求解线性方程?

非常感谢各种帮助!感谢阅读。

Here is how my matrices look like in 'spy'-representation

【问题讨论】:

    标签: python numpy scipy sparse-matrix linear-equation


    【解决方案1】:

    您以前的 scipy 版本相当旧,它使用 umfpack 完成此任务。

    由于许可问题(GPL 与 scipy 不兼容,我认为 umfpack 在某些时候切换了许可证),此库已被删除,现在 superlu用来。许多人观察到速度下降(和健壮性问题),但评估性能可能并不那么容易(superlu 也可以快速且健壮)。

    另请阅读this

    你可能有两个选择:

    • 调整 superlu 的参数(阅读官方的 superlu 文档和 scipy 的文档,了解如何传递这些选项)
      • 透视和排序非常重要!
      • 还有一个对称模式(不是真正高度调整的对称矩阵求解器,但可能是更好的旋转规则)
      • 也许迭代细化也有帮助(不确定!)
    • 如果许可证对您来说不是问题:使用 scikit-umfpack 让 scipy 再次使用 umfpack!

    如果您的矩阵是 PSD,cholmod,在 scikit-sparse 中可用(当前未维护!)可能是要使用的库(再次:许可证)!

    【讨论】:

    • 太好了,感谢您的回答,这听起来很合理。我将在星期一与我的系统管理员讨论。作为直接求解器,您对“minres”有何看法?由于我的矩阵是对称的,我认为它是一个可行的选择。我知道,在文档中它说该功能是实验性的并且可能会发生变化,但它适用于我的代码。对于大型系统,它甚至比 spsolve 还要快,结果一致性在 99.9% 以内。另外,它肯定会产生结果。
    猜你喜欢
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多