0

我的问题源于对大型电阻系统的节点分析。我基本上是在设置一个大的稀疏矩阵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更有效的方法来求解线性方程?

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

这是我的矩阵在“间谍”表示中的样子

4

1 回答 1

1

您以前的 scipy 版本已经很老了,它使用umfpack来完成这项任务。

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

也读这个

你可能有两个选择:

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

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

于 2017-08-12T00:10:12.163 回答