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