2017-08-11 230 views
0

我的问题是由大型电阻系统的节点分析引起的。我基本上是建立一个大型稀疏矩阵一个,我解向量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%。我没有改变算法和一些测试,我已经使用了相同的代码。下面是我如何设置我的计算:

  1. 我产生电阻随机三维网络(我知道我可能会不小心创建无法解决的网络,但百分比以上应该不是彻底改变)。这里使用的唯一SciPy/NumPy函数是np.random
  2. 我创建了一个稀疏的lil矩阵,我填充了从我的电阻网络中提取的电导值。我也创建了一个不稀疏的解决方案向量。
  3. 我将电导矩阵转换为csr格式并使用spsolve方法。这是我的代码最近失败的地方。

难道这是改变了的方法吗?

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

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

Here is how my matrices look like in 'spy'-representation

回答

0

你以前SciPy的版本是很老,它使用umfpack这项任务。

由于许可-问题(GPL是不兼容SciPy的,我认为umfpack切换许可在某些时候),这LIB取出,现在使用superlu。许多人观察到速度减慢(和健壮性问题),但评估性能可能并不那么容易(超级可能也是快速和健壮的)。

也请阅读this

你可能有两个选择:

  • 调superlu的参数(阅读官方superlu文件和SciPy的关于如何通过这些选项的文档)
    • 旋转和排序是非常重要的!
    • 还有一个对称模式(不是一个真正的高度调整的对称矩阵解算器,但可能更好地旋转规则)
    • 也许迭代细化也可以帮助你(不确定!)
  • 如果许可证的东西不是你的问题:使用scikit-umfpack使scipy再次使用umfpack! (!当前代码未维护)

如果你的矩阵是PSD,cholmod,可用内scikit-sparse可能的lib使用(再次:许可)!

+0

太好了,谢谢你的回答,这听起来很合理。我将在星期一与我的系统管理员讨论。 作为直接求解器,你对'minres'有什么看法?由于我的矩阵是对称的,我认为它是一个可行的选择。我知道,在文档中说功能是实验性的,可以随时更改,但它对我的代码正常工作。对于大型系统来说,它比速度更快,结果在99.9%以内一致。另外,它绝对会产生一个结果。 – lmr