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

3
我的问题源于对大规模电阻器系统的节点分析。我基本上要建立一个大型稀疏矩阵A,我的解向量b,并尝试解线性方程A * x = b。为此,我使用scipy.sparse.linalg.spsolve方法。直到最近,一切都很正常,直到我将SciPy从v0.13.3升级到v0.19.1(也包括NumPy升级到v1.13.1)。我正在运行Python 2.7.6。当使用与更新之前相同的代码时,我会收到错误提示,特别是对于产生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. 我生成一个随机三维电阻网络(我意识到可能会意外创建无法解决的网络,但上述百分比不应该发生太大变化)。这里仅使用了np.random的SciPy / NumPy函数
  2. 我创建了一个稀疏lil矩阵,其中填充了从电阻器网络中提取的电导值。我还创建了一个非稀疏的解向量。
  3. 我将电导矩阵转换为csr格式并使用spsolve方法。这是我最近代码失败的地方。

可能是方法发生了变化吗?

spsolve也许不太适合吗?我创建的矩阵通常是对称的,呈块三角形形式。是否有比spsolve更有效的解决线性方程的方法?

非常感谢任何形式的帮助!感谢阅读。

以下是我的矩阵在“spy”表示中的样子

1个回答

1

你之前使用的scipy版本相当古老,用了umfpack 来完成这个任务。

由于许可问题(GPL与scipy不兼容,我认为umfpack在某个时候改变了许可证),该库已被移除,现在使用 superlu。许多人观察到了速度变慢和鲁棒性问题,但是评估性能可能并不容易(superlu 也可以快速和稳健)。

也请阅读this

你可能有两个选择:

  • 调整superlu的参数(查看官方superlu文档和scipy有关如何传递这些选项的文档)
    • 重要的是旋转和排序!
    • 还有一个对称模式(并非高度调整的对称矩阵求解器,但可能具有更好的旋转规则)
    • 也许迭代改进也有帮助(不确定!)
  • 如果许可证不是问题,请使用scikit-umfpack来让scipy再次使用umfpack!

如果您的矩阵是半正定的,则cholmod(目前未维护!)可用于scikit-sparse,可能是要使用的库(同样需要许可证)!


太好了,谢谢你的回答,听起来很合理。我会在周一与我的系统管理员讨论一下。对于'minres'作为直接求解器,你有什么看法?由于我的矩阵是对称的,我认为这是一个可行的替代方案。我知道,在文档中它说这个函数是实验性的,可能会发生变化,但它在我的代码中运行良好。对于大型系统,它甚至比spsolve更快,并且结果在99.9%的范围内一致。此外,它肯定能产生一个结果。 - lmr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接