我的問題是由大型電阻系統的節點分析引起的。我基本上是建立一個大型稀疏矩陣一個,我解向量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