[英]Sparse diagonal matrix solver
我想在MatLab中求解一個線性系統(對應於以有限差分方案編寫的兩個方程的PDE系統)。 系統矩陣的動作(對應於PDE系統的擴散項之一)以符號方式讀取( u
是未知字段之一, n
是時間步長, j
是網格點):
並充分:
上面的矩陣必須是A
,其中A * U ^ n + 1 = B是系統。 U
交替包含“ u”和“ v”(PDE系統的第二個未知字段):U = [u_1,v_1,u_2,v_2,...,u_J,v_J]。 到目前為止,我一直以下列昂貴的方式使用spdiags
和diag
填充此矩陣:
E=zeros(2*J,1);
E(1:2:2*J) = 1;
E(2:2:2*J) = 0;
Dvec=zeros(2*J,1);
for i=3:2:2*J-3
Dvec(i)=D_11((i+1)/2);
end
for i=4:2:2*J-2
Dvec(i)=D_21(i/2);
end
A = diag(Dvec)*spdiags([-E,-E,2*E,2*E,-E,-E],[-3,-2,-1,0,1,2],2*J,2*J)/(dx^2);`
和解決方案
[L,U]=lu(A);
y = L\B;
U(:) =U\y;
其中B
是右側向量。
這顯然是不合理的昂貴,因為它需要構建JxJ矩陣,進行JxJ矩陣乘法等。
接下來是我的問題:是否有一種方法可以解決該系統而無需將MatLab傳遞給矩陣,例如通過傳遞矢量Dvec
或直接D_11
和D_22
? 這將節省我很多內存和處理時間!
Matlab不會將稀疏矩陣存儲為JxJ數組,而是存儲為大小為O(J)的列表。 參見http://au.mathworks.com/help/matlab/math/constructing-sparse-matrices.html由於您使用spdiags函數構造A,因此Matlab應該已經將A識別為稀疏,因此您確實應該看到這樣的列表如果在控制台視圖中顯示A。
對於像您這樣的三對角矩陣,L和U矩陣應該已經稀疏。
因此,您只需要確保\\運算符即可根據http://au.mathworks.com/help/matlab/ref/mldivide.html中的規則使用適當的稀疏算法。 尚不清楚向量B是否已被視為稀疏,但您可以將其重鑄為對角矩陣,當然應該將其視為稀疏。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.