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

2024-05-18

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

直到最近,一切都工作正常,直到我将 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方法。这就是我的代码最近失败的地方。

难道是方法变了?

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

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

这是我的矩阵在“间谍”表示中的样子 https://i.stack.imgur.com/m88y5.png


你以前的 scipy 版本很旧并且它使用了umfpack https://en.wikipedia.org/wiki/UMFPACK为了这个任务。

由于许可问题(GPL 与 scipy 不兼容,我认为 umfpack 在某个时候切换了许可证),该库已被删除现在superlu http://crd-legacy.lbl.gov/~xiaoye/SuperLU/用来。许多人观察到速度变慢(以及稳健性问题),但评估性能可能并不那么容易(superlu 也可以快速且稳健)。

另请阅读this https://github.com/scipy/scipy/issues/3831#issuecomment-50230520.

你可能有两个选择:

  • Tune superlu's parameters (read the official superlu documentation and scipy's docs on how to pass these options)
    • 旋转和排序非常重要!
    • 还有一个对称模式(并不是真正的高度调整的对称矩阵求解器,但可能是更好的旋转规则)
    • 也许迭代细化也有帮助(不确定!)
  • 如果许可证对您来说不是问题:使用scikit-umfpack https://github.com/scikit-umfpack/scikit-umfpack让 scipy 再次使用 umfpack!

如果你的矩阵是PSD,cholmod https://developer.nvidia.com/cholmod,可在scikit 稀疏 https://github.com/scikit-sparse/scikit-sparse(目前未维护!)可能是要使用的库(再次:许可证)!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scipy Sparse:SciPy/NumPy 更新后出现奇异矩阵警告 的相关文章