【问题标题】:Sparse diagonal matrix solver稀疏对角矩阵求解器
【发布时间】:2015-02-07 15:21:06
【问题描述】:

我想在 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 matrix linear-algebra sparse-matrix pde


    【解决方案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 是否已经被认为是稀疏的,但您可以将其重铸为对角矩阵,这当然应该被认为是稀疏的。

    【讨论】:

      猜你喜欢
      • 2012-01-10
      • 2016-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多