Scipy 稀疏:SciPy/NumPy 更新后出现奇异矩阵警告

Scipy Sparse: Singular Matrix Warning after SciPy/NumPy Update

我的问题来自大型电阻器系统的节点分析。我基本上是在设置一个大的稀疏矩阵 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. 我生成了一个随机的三维电阻网络(我意识到我可能会不小心创建无法解决的网络,但上面的百分比应该不会发生太大变化)。这里使用的唯一 SciPy/NumPy 函数是 np.random
  2. 我创建了一个稀疏的 lil 矩阵,其中填充了从我的电阻网络中提取的电导值。我还创建了一个不稀疏的解向量。
  3. 我将电导矩阵转换为 csr 格式并使用 spsolve 方法。这是我的代码最近失败的地方。

难道是方法变了?

spsolve 甚至可能不合适吗?我创建的矩阵通常是对称的并且是块三对角形式的。有没有比 spsolve?

更有效的求解线性方程的方法

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

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

您之前的 scipy 版本很旧,它使用 umfpack 完成此任务。

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

另请阅读 this

你可能有两个选择:

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

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