簡體   English   中英

LU分解的必要性(以numpy為例)

[英]The necessity of LU decomposition (using numpy as an example)

我試圖了解使用numpy和scipy庫進行LU分解的必要性。 據我了解,我們要求解Ax = b,首先將A分解為兩個三角矩陣L和U,然后通過求解Ly = b然后Ux = y求解LUx = b。 通過求解三角矩陣,與高斯消除相比,我們可以減少時間。

所以,我在python中使用numpy和scipy厭倦了這個想法。

我首先使用玩具示例構造A和b:

A = np.array([[2, 1, 0, 5], [1, 2, 1, 2], [0, 1, 2, 4], [1, 3, 6, 4.5]])
b = np.array([9, 10, -2, 3])

然后首先在np.solve中解決這個玩具示例

%timeit np.linalg.solve(A, b )

現在的時間是

每個循環9.76 µs±782 ns(平均±標准偏差,共運行7次,每個循環100000個)

然后我使用分解來解決這個系統:

lu, piv = linalg.lu_factor(A)
%timeit linalg.lu_solve((lu, piv), b)

我看到的輸出是

每個循環18.8 µs±213 ns(平均±標准偏差,共運行7次,每個循環100000個)

,與np.solve相比,它是安靜的。

所以,我的問題是,為什么np.solve比linalg.lu_factor更快? 我的猜測是numpy.solve不使用高斯消除法來求解方程式嗎? 這里的結果有點混亂。

編輯

現在,我使用更大的矩陣進行實驗(10000 x 10000)。

結果是這樣的:對於np.linalg.solve

8.64 s ± 180 ms per loop (mean ± std. dev. of 7 runs, 1 loop each);

對於scipy.linalg.lu_solve

121 ms ± 3.79 ms per loop (mean ± std. dev. of 7 runs, 10 loops each).

對於lu_solve,我只計算求解時間,不計算分解部分。 現在更快了!

這是部分答案,因為我對您的房屋有異議。

您寫道:“ LU解應該比高斯消除更快。” 您似乎誤解了LU分解的目的。 如果只解決一個這樣的問題( Ax=b ,其中給出矩陣A和向量b ),LU反壓縮的速度不會比高斯消除快。 確實,分解的算法與消除算法非常相似,而且速度並不快。

當給定矩陣A並要為多個不同的給定向量b求解方程Ax=b時,LU分解的優點就來了。 高斯消除需要從頭開始,並且每個解決方案將花費相同的時間。 在LU分解中,您可以存儲第一次計算所得的矩陣LU ,這大大加快了使用不同矢量b的后續方程的求解。

您可以在C的數字食譜中有關LU分解及其應用的部分中了解有關此內容的更多信息。

查看numpy.linalg.solve 它在“注釋”部分中表示“使用LAPACK例程_gesv計算解決方案”。 (下划線是對應於數據類型的字符的占位符。例如, dgesv使用雙精度。)

dgesv文檔說明它使用LU分解。 因此,您或多或少地復制了計算,但是您在Python中執行了更多步驟,因此您的代碼速度較慢。

暫無
暫無

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

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