【问题标题】:How to solve a linear system for only one component in MATLAB如何在 MATLAB 中仅求解一个分量的线性系统
【发布时间】:2018-06-01 19:06:50
【问题描述】:

我需要求解线性系统

A x = b

这可以通过以下方式有效地完成

x = A \ b

但是现在A 非常大,我实际上只需要一个组件,比如x(1)。有没有办法比计算x 的所有分量更有效地解决这个问题?

A 不是稀疏的。在这里,效率实际上是一个问题,因为许多b 都这样做了。

此外,存储K 的倒数并仅将其第一行乘以b 是不可能的,因为K 的条件很差。在这种情况下,使用\ 运算符会使用 LDL 求解器,并且在显式使用逆运算时会丢失准确性。

【问题讨论】:

    标签: matlab linear-algebra equation-solving


    【解决方案1】:

    我认为从技术上讲,您不会在非常优化的 Matlab 例程上获得加速,但是如果您了解它是如何解决的,那么您可以只解决 x 的一部分。例如,在传统求解器中,following. 使用 backsub 进行 QR 求解。在 LU 解决方案中,您同时使用后子和前子。我可以得到卢。不幸的是,由于它如何解决它,它实际上从最后开始。对于将同时使用两者的 LDL 也是如此。这并不排除这样一个事实,即可能有更有效的方法来解决你所拥有的任何问题。

     function [Q,R] = qrcgs(A)
    %Classical Gram Schmidt for an m x n matrix 
    
    [m,n] = size(A); 
    % Generates the Q, R matrices
    Q = zeros(m,n); 
    R = zeros(n,n);
        for k = 1:n
            % Assign the vector for normalization
            w = A(:,k);
            for j=1:k-1
                % Gets R entries
                R(j,k) = Q(:,j)'*w;
            end
    
            for j = 1:k-1
               % Subtracts off orthogonal projections 
               w = w-R(j,k)*Q(:,j);
            end
            % Normalize 
            R(k,k) = norm(w);
            Q(:,k) = w./R(k,k);
        end
    
    end
    
    function x = backsub(R,b)
    % Backsub for upper triangular matrix.
    [m,n] = size(R);
    p = min(m,n);
    x  = zeros(n,1);
    
        for i=p:-1:1
            % Look from bottom, assign to vector
            r = b(i);
            for j=(i+1):p
                % Subtract off the difference
                r = r-R(i,j)*x(j);
            end
            x(i) = r/R(i,i);
        end
    
    end
    

    【讨论】:

    • 这是一个很好的基本答案。但是我不会尝试,因为正如你所说,它很可能仍然比内置方法慢。
    【解决方案2】:

    方法mldivide,通常表示为\,接受一次求解具有相同A 的多个系统。

    x = A\[b1 b2 b3 b4] # where bi are vectors with n rows
    

    求解每个b 的系统,并将返回一个nx4 矩阵,其中每一列是每个b 的解。像这样调用 mldivide 应该会提高效率,因为分解只进行一次。

    在许多分解中,如 LU od LDL'(以及您特别感兴趣的分解)中,矩阵乘以 x 是上对角线,要求解的第一个值是 x(n)。但是,必须进行 LDL' 分解,简单的反向替换算法不会成为代码的瓶颈。因此,可以保存分解以避免对每个bi 重复计算。因此,代码看起来类似于:

    [LA,DA] = ldl(A);
    DA = sparse(DA);
    % LA = sparse(LA); %LA can also be converted to sparse matrix
    % loop over bi
      xi = LA'\(DA\(LA\bi));
    % end loop
    

    正如您在 mldivide (Algorithms section) 的文档中所见,它对输入矩阵执行一些检查,并将 LA 定义为完整矩阵并将 DA 定义为稀疏矩阵,它应该直接使用三角求解器和一个三对角求解器。如果将LA 转换为sparse,它也会使用三角求解器,我不知道转换为sparse 是否会带来任何改进。

    【讨论】:

    • 存储分解很有意义。实际上,我以前在另一种情况下做过,但现在想不起来。谢谢提醒。
    • 很高兴为您提供帮助,关键是 `` 根据输入矩阵使用许多不同的求解器,如算法部分所述,因此将 mldivide 应用于已经分解的矩阵应该比在原系统。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 2019-10-05
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    相关资源
    最近更新 更多