2015-11-05 108 views
4

線性方程組的稀疏系統的迭代求解我想解決的稀疏線性方程系統:X = b,其中是一個(M×M)陣列,b是(M×N)陣列,並且×是和(M×N)陣列。用(M,N)的右手大小矩陣

  • scipy.linalg.solve(A.toarray(), b.toarray())
  • scipy.sparse.linalg.spsolve(A, b)
  • scipy.sparse.linalg.splu(A).solve(b.toarray())#返回密集排列

我希望使用迭代來解決這個問題:

我使用的解決這三種方式scipy.sparse.linalg方法:

  • scipy.sparse.linalg.cg
  • scipy.sparse.linalg.bicg
  • ...

然而,metods詢問服務僅右手側b與形狀(M)或(M,1)。有關如何將這些方法擴展到(M×N)數組的任何想法b

+1

儘管** A **和** b **可能很稀疏,一般來說** Ax = b **的解決方案將會變得密集 –

+1

您是否看過這些方法的代碼?底層數學呢?也許第2列的解決方案固有地獨立於1,並且需要不同數量的迭代。 – hpaulj

+0

我還沒有進入代碼。 – blaz

回答

6

迭代求解器和直接求解器之間的一個主要區別是,直接求解器可以通過使用因式分解(通常是Cholesky或LU)更有效地求解多個右手值,而迭代求解器不能。這意味着對於直接解算器來說,同時求解多列是有計算優勢的。

對於迭代求解,在另一方面,有可拿在同時解決多個列中沒有計算增益,這可能是爲什麼矩陣解決方案是不是cgbicg API中的原生支持,等等

因此,像scipy.sparse.linalg.spsolve這樣的直接解決方案可能會適合您的情況。如果由於某種原因,你仍然希望一個迭代的解決方案,我只是創建一個簡單方便的功能是這樣的:

from scipy.sparse.linalg import bicg 

def bicg_solve(M, B): 
    X, info = zip(*(bicg(M, b) for b in B.T)) 
    return np.transpose(X), info 

然後你就可以創建一些數據,並調用它,如下所示:

import numpy as np 
from scipy.sparse import csc_matrix 

# create some matrices 
M = csc_matrix(np.random.rand(5, 5)) 
B = np.random.rand(5, 4) 

X, info = bicg_solve(M, B) 
print(X.shape) 
# (5, 4) 

任何在右側接受矩陣的迭代解算器API基本上就是這樣的一個包裝。

+0

謝謝你的支持和理論背景! – blaz

0

如果您有非常大的系統(數百萬個方程),基於直接方法(LU分解,LDLt因子分解等)的代碼可能無法工作,因爲對可用隨機存取存儲器。迭代算法成爲唯一可能的選擇。但是,多個右側的情況仍然可以被有效地處理,因爲現代CPU包含多個核心,因此允許同一矩陣的右側不同的同時迭代。你需要一個特殊的軟件。這裏是一個程序,允許這樣的計算:

http://members.ozemail.com.au/~comecau/CMA_Sparse.htm

它可以有效地,同時處理多達右手邊爲多核心CPU的有(用於現代計算機中最常見的情況是四個核心)。