我的问题源于对大型电阻系统的节点分析。我基本上是在设置一个大的稀疏矩阵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%。我没有更改算法,并且在一些测试中,我使用了与以前相同的代码。这是我设置计算的方式:
- 我生成了一个随机的 3D 电阻网络(我意识到我可能会不小心创建无法解决的网络,但上面的百分比不应该有太大的变化)。这里使用的唯一 SciPy/NumPy 函数是 np.random
- 我创建了一个稀疏的 lil 矩阵,填充了从电阻网络中提取的电导值。我还创建了一个不稀疏的解向量。
- 我将电导矩阵转换为 csr 格式并使用spsolve方法。这是我的代码最近失败的地方。
难道是方法变了?
spsolve甚至可能不合适吗?我创建的矩阵通常是对称的,并且是块三对角形式。有没有比spsolve更有效的方法来求解线性方程?
非常感谢各种帮助!谢谢阅读。