我的问题是由大型电阻系统的节点分析引起的。我基本上是建立一个大型稀疏矩阵一个,我解向量b,而我试图解决的线性方程一个 * X = b。 为了做到这一点,我使用了scipy.sparse.linalg.spsolve方法。Scipy稀疏:SciPy/NumPy更新后的奇异矩阵警告
直到最近,一切正常,直到我将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%。我没有改变算法和一些测试,我已经使用了相同的代码。下面是我如何设置我的计算:
- 我产生电阻随机三维网络(我知道我可能会不小心创建无法解决的网络,但百分比以上应该不是彻底改变)。这里使用的唯一SciPy/NumPy函数是np.random
- 我创建了一个稀疏的lil矩阵,我填充了从我的电阻网络中提取的电导值。我也创建了一个不稀疏的解决方案向量。
- 我将电导矩阵转换为csr格式并使用spsolve方法。这是我的代码最近失败的地方。
难道这是改变了的方法吗?
是spsolve可能更不合适?我创建的矩阵通常是对称的,并且以块三对角形式。有没有比spsolve更有效的解决线性方程式的方法?
各种帮助非常感谢!谢谢阅读。
Here is how my matrices look like in 'spy'-representation
太好了,谢谢你的回答,这听起来很合理。我将在星期一与我的系统管理员讨论。 作为直接求解器,你对'minres'有什么看法?由于我的矩阵是对称的,我认为它是一个可行的选择。我知道,在文档中说功能是实验性的,可以随时更改,但它对我的代码正常工作。对于大型系统来说,它比速度更快,结果在99.9%以内一致。另外,它绝对会产生一个结果。 – lmr