【问题标题】:How can I choose Gaussian Elimination to solve Ax=b in MATLAB?如何在 MATLAB 中选择高斯消元法求解 Ax=b?
【发布时间】:2016-03-18 04:22:47
【问题描述】:

我有一个关于求解线性方程Ax=b的问题,其中x未知,A是方阵NxN和非奇异矩阵。

向量x可以解出

x=inv(A)*b 

x=A\b 

在 Matlab 中,“\”命令调用的算法取决于矩阵 A 的结构,并包括对 A 属性的检查(小开销)。因此,它高度依赖于 A 结构。但是,A 结构是未知的(即随机矩阵)。我想测量上述方程的复杂性。因此,为了公平比较,我需要修复我使用的方法。在这种情况下,我选择具有复杂性的高斯消除 (GE) O(N^3) 我的问题是如何选择/修复解决上述方程的方法(即 GE)?

【问题讨论】:

  • 没有 MATLAB 内置函数可以用高斯消元法求解线性系统。但是自写函数总是会比高度优化的 '\' 运算符慢。

标签: matlab linear-algebra


【解决方案1】:

一种方法是计算 LU 分解(假设 A 不是对称的)

[L,U] = lu(A)

其中 L 是具有单位对角线的下三角矩阵的置换,U 是上三角矩阵。这相当于高斯消元法。 然后,当您求解 Ax = b 时,实际上您首先执行的是 Ly = b,然后是 Ux = y。 重要的是求解这些线性系统本质上是 O(n^2),而计算因式分解是 O(n^3)。因此,如果 n 很大,您可以只测量计算 LU 分解所花费的时间。


对于随机矩阵,你可以看到像这样的 LU 分解的复杂性

nn = round(logspace(2, 4, 20)) ;
time = zeros(size(nn)) ;
for i = 1:numel(nn)
    A = rand(nn(i),nn(i)) ;
    tic() ; [L,U] = lu(A) ;
    time(i) = toc() ;
end
loglog(nn,time) ;

(将“4”更改为更大或更小,具体取决于您的电脑)。 在我的笔记本电脑上,我有这个结果

其中 3 的斜率(因此,O(n^3) 复杂度)相当清楚。

【讨论】:

  • 那么,如果我使用 LU,x 的解决方案是什么
  • 你将拥有 x = U \ ( L \ b )。
  • 如果我的矩阵 A 是对称矩阵。所以,你的方法行不通,对吗?如何检查 A 是对称的还是非对称的?谢谢
  • 如果A是对称的,那么A的转置等于它自己。也许像Ap = A(:); App = reshape(A.',[],1); issymmetric = all(abs(A - Ap) <= 1e-10); 这样的东西可能会起作用。但是,LU 分解对于A 是否对称并不重要。 LU 分解适用于方阵,无论其内容如何...您将从 LU 中实际得到的是另一回事,但您仍然可以将其分解为 LU。
  • 永远不要使用inv。它是不稳定的。 MATLAB 中故意不提供高斯消元法,因为它是一种效率低下的算法。如上所示,您可以实现的最接近的是使用 LU。
猜你喜欢
  • 1970-01-01
  • 2019-05-22
  • 2014-04-05
  • 2018-08-06
  • 1970-01-01
  • 2012-10-01
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
相关资源
最近更新 更多