首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MATLAB中求解单分量线性方程组

如何在MATLAB中求解单分量线性方程组
EN

Stack Overflow用户
提问于 2018-05-31 06:00:43
回答 2查看 135关注 0票数 3

我需要解线性系统

代码语言:javascript
复制
A x = b

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

代码语言:javascript
复制
x = A \ b

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

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

此外,存储K的倒数并仅将其第一行与b相乘是不可能的,因为K的条件很糟糕。在这种情况下,使用\运算符将使用低密度脂蛋白求解器,当显式使用反向运算符时,精度会降低。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-31 09:45:00

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

代码语言:javascript
复制
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重复计算。因此,代码如下所示:

代码语言:javascript
复制
[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定义为full,将DA定义为sparse,它应该直接使用三角形求解器和三对角线求解器。如果LA转换为稀疏,它也会使用三角形求解器,我不知道转换为稀疏是否会有任何改进。

票数 1
EN

Stack Overflow用户

发布于 2018-05-31 08:12:36

我认为从技术上讲,你不会得到一个非常优化的Matlab例程的加速,但是,如果你理解它是如何求解的,那么你可以只求解x的一部分。例如,在传统的求解器中,你可以使用following.来求解QR。在逻辑单元求解中,你同时使用后部子函数和前部子函数。我可以得到LU。不幸的是,由于它解决问题的方式,它实际上是从最后开始的。对于同时使用这两种方法的低密度脂蛋白也是如此。这并不排除可能有更有效的方法来解决你所拥有的一切。

代码语言:javascript
复制
 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50613928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档