稀疏对角矩阵求解器

时间:2014-12-09 16:28:52

标签: matlab matrix linear-algebra sparse-matrix pde

我想在MatLab中解决一个线性系统(对应于用有限差分格式编写的两个方程的PDE系统)。系统矩阵的动作(对应于PDE系统的扩散术语之一)以符号形式读取(u是未知字段之一,n是时间步,j是网格点):

enter image description here

enter image description here

并完全:

enter image description here

上述矩阵必须是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? 这样可以节省大量的内存和处理时间!

1 个答案:

答案 0 :(得分:1)

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是否已经被认为是稀疏的,但你可以将其重新设计为对角矩阵,这当然应该被认为是稀疏的。