簡體   English   中英

稀疏對角矩陣求解器

[英]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]。 到目前為止,我一直以下列昂貴的方式使用spdiagsdiag填充此矩陣:

    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_11D_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.

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