2017-08-11 295 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