簡體   English   中英

Scipy稀疏:SciPy / NumPy更新后出現奇異矩陣警告

[英]Scipy Sparse: Singular Matrix Warning after SciPy/NumPy Update

我的問題來自對大型電阻器系統的節點分析。 我基本上是在建立一個大的稀疏矩陣A ,即我的解向量b ,並且試圖解決線性方程A * x = b 為此,我使用了scipy.sparse.linalg.spsolve方法。

直到最近,一切都運轉良好,直到我將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線性方程更有效的方法?

各種幫助將不勝感激! 謝謝閱讀。

這是我的矩陣在“間諜”表示中的樣子

您以前的scipy-version很老,它使用umfpack來完成此任務。

由於許可問題 (GPL與scipy不兼容,我認為umfpack在某個時候切換了許可), 因此刪除了該庫 ,現在使用了superlu 許多人觀察到速度變慢(以及健壯性問題),但是評估性能可能並不那么容易(superlu也可以既快速又健壯)。

也請閱讀此內容

您可能有兩種選擇:

  • 調整superlu的參數(閱讀有關如何傳遞這些選項的正式superlu文檔和scipy的文檔)
    • 透視和排序非常重要!
    • 還有一個對稱模式 (並不是真正經過高度調整的對稱矩陣求解器,但可能有更好的樞軸規則)
    • 也許迭代優化也有幫助(不確定!)
  • 如果不是許可證問題,請使用scikit- umfpack再次使scipy使用umfpack!

如果您的矩陣是PSD, scikit-sparse中可用的cholmod (當前未維護!)可能是要使用的庫(再次:許可證)!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM