☰
《数值分析小白笔记03:高斯消元法与LU算法》
2026/11/3 8:39:03 网站建设 项目流程

这周的课程,老师给我们讲解了高斯消元法和LU分解法。听着这些名词,有点高大上,实则也是数学里面的线性代数知识。换了一个叫法。

我从老师给的网址网盘里下载对应的教材文件。

如有需要电子教材的可以评论区留言!

上课的时候,老师不仅提及到了高斯消元,还有提及到列主元。

我的天,一看目录才发现,老师上课是跳着讲的知识,一下到了第九章以后。

老师讲的有点太跳跃,我就凭借记忆,复现一下知识内容。

原始高斯消去法、LU分解法、高斯-赛德尔法、高斯列主元消去法

1、原始高斯消去法

看不懂,跳过这个段文字,我们直接看例子!

哦,第一行第一列的元素是2,把它下面的消出两个0(行变换:-3、-2变为0)

第二行第二列的元素是0.5,把它下面的消出1个0(行变换:2变为0)

列方程式,解方程

2、LU分解法

假装看不懂,咱跳过这个段文字,我们直接看例子!

AX=B

哦,系数矩阵A可以由两个矩阵相乘而得,即 矩阵A = 下三角矩阵L×上三角矩阵U

LU两个矩阵相乘,再验算一下是否等于矩阵A。

3、高斯列主元消去法

咱们直接看例子吧!

哦,和原始高斯消元法类似的,只是主元由于换了行,但是解是不变的。

4、高斯-赛德尔法

没看明白啊!来,我们上栗子。

这是啥迭代公式?没看懂啊!哦,这么算!

4x1​−x2​=3 那么x1 ​=(3+x2​)/4

−x1​+4x2​−x3​=4 那么x2 ​​=(4+x1+x3)/4

−x2​+4x3​=5 那么x3 = (5+x2)/4

(1) x1 ​=(3+x2​)/4 令x2=0,那么x1=3/4=0.75

(2) x2 ​​=(4+x1+x3)/4 在上式(1)中,已得x1=0.75,令x3=0,那么x2=(4+0.75+0)/4=1.1875

(3) x3 = (5+x2)/4 在上式(1)和(2)中,已得x1=0.75,x2=1.1875,那么x3=(5+1.1875)/4

如此,就获得了,x1=0.75、x2=1.1875、x3=1.546875 (第一次迭代)

在第一次迭代中,我们已经获得了下面的等式:

4x1​−x2​=3 那么x1 ​=(3+x2​)/4

−x1​+4x2​−x3​=4 那么x2 ​​=(4+x1+x3)/4

−x2​+4x3​=5 那么x3 = (5+x2)/4

第一次迭代,我们最开始令x2=0以后,获得一组解,如下:

x1=0.75、x2=1.1875、x3=1.546875 (第一次迭代)

第二次迭代,我们这次不令x2=0,

我们直接令第一次迭代获得的x2=1.1875,x3=1.546875,这些带入去计算:

x1 ​=(3+x2​)/4=(3+7.1875)/4=1.046875

x2 ​​=(4+x1+x3)/4=(4+1.046875+1.546875)/4=1.6484375

x3= (5+x2)/4=(5+1.6484375)/4=1.662109375

得到了一组新的解,以上为第二次迭代。

第三次迭代,x2=1.6484375,x3=1.662109375继续往方程里面带入计算,又会得到一组解。

以此类推。

我们是来学软件学算法的,怎么弄了半天matlab都还没上阵呢!

我记得上课老师有提及书上的lu分解会和matlab不一样!但是是对的!

学习的是matlab,复习了线性代数的知识。那我们现在就跑两个代码试试看!

1. 原始高斯消去法

脚本函数

function x = gauss_naive(A,b) % 原始高斯消去法(不选主元) n = length(b); A = [A b(:)]; % 增广矩阵 for k = 1:n-1 if A(k,k) == 0 error('主元为零,原始高斯消去法失败(第 %d 步)', k); end for i = k+1:n m = A(i,k)/A(k,k); A(i,k:n+1) = A(i,k:n+1) - m*A(k,k:n+1); end end % 回代 x = zeros(n,1); for i = n:-1:1 x(i) = (A(i,n+1) - A(i,i+1:n)*x(i+1:n))/A(i,i); end end

脚本保存位置和重命名!

命令行窗口运行:

A = [2 1 -1; -3 -1 2; -2 1 2]; b = [8; -11; -3]; x1 = gauss_naive(A,b)

路径没有他添加进来,有点问题!

addpath 'D:\matlab\Script_learn'

这个结果与开始得到的解是一致的。

我们使坏一下,交换一下行使 a11=0 a11​=0

命令行窗口运行:

A2 = [0 1 1; 1 1 1; 1 1 2]; b2 = [2; 3; 4]; try gauss_naive(A2,b2) catch e disp(e.message) end

2. LU 分解法(Doolittle,不选主元)

脚本函数代码1:

function [L,U] = lu_doolittle(A) n = size(A,1); L = eye(n); U = zeros(n); for k = 1:n for j = k:n U(k,j) = A(k,j) - L(k,1:k-1)*U(1:k-1,j); end if U(k,k) == 0 error('U(%d,%d)=0,LU 分解失败',k,k); end for i = k+1:n L(i,k) = (A(i,k) - L(i,1:k-1)*U(1:k-1,k))/U(k,k); end end end

脚本函数代码2:

function x = solve_lu(L,U,b) n = length(b); y = zeros(n,1); for i = 1:n % 前代 Ly=b y(i) = b(i) - L(i,1:i-1)*y(1:i-1); end x = zeros(n,1); for i = n:-1:1 % 回代 Ux=y x(i) = (y(i) - U(i,i+1:n)*x(i+1:n))/U(i,i); end end

两个脚本函数的代码路径依旧是我在刚刚报错的地方。

注意一下路径哦

addpath 'D:\matlab\Script_learn'
A = [2 1 -1; -3 -1 2; -2 1 2]; b = [8; -11; -3]; [L,U] = lu_doolittle(A); disp('L ='), disp(L) disp('U ='), disp(U) disp('L*U - A ='), disp(L*U - A) x2 = solve_lu(L,U,b)

3. 高斯列主元消去法

代码运行的结果

脚本函数:

function x = gauss_partial_pivot(A,b) % 高斯列主元消去法 n = length(b); A = [A b(:)]; for k = 1:n-1 [~,p] = max(abs(A(k:n,k))); % 选列主元 p = p + k - 1; if A(p,k) == 0 error('矩阵奇异'); end if p ~= k A([k p],:) = A([p k],:); % 交换行 end for i = k+1:n m = A(i,k)/A(k,k); A(i,k:n+1) = A(i,k:n+1) - m*A(k,k:n+1); end end x = zeros(n,1); for i = n:-1:1 x(i) = (A(i,n+1) - A(i,i+1:n)*x(i+1:n))/A(i,i); end end

命令行代码:

A = [2 1 -1; -3 -1 2; -2 1 2]; b = [8; -11; -3]; A2 = [0 1 1; 1 1 1; 1 1 2]; b2 = [2; 3; 4]; x3 = gauss_partial_pivot(A,b) x3b = gauss_partial_pivot(A2,b2)

4. 高斯-赛德尔迭代法

function [x,iter,res] = gauss_seidel(A,b,x0,tol,maxit) n = length(b); x = x0(:); res = zeros(maxit,1); for iter = 1:maxit xold = x; for i = 1:n s = A(i,:)*x - A(i,i)*x(i); % 用当前最新 x x(i) = (b(i) - s)/A(i,i); end res(iter) = norm(x - xold, inf); if res(iter) < tol res = res(1:iter); return; end end res = res(1:maxit); end
Ags = [4 -1 0; -1 4 -1; 0 -1 4]; bgs = [3; 4; 5]; [x4, iter, res] = gauss_seidel(Ags, bgs, [0;0;0], 1e-10, 200); fprintf('迭代次数 = %d\n', iter); fprintf('解 = [%.6f, %.6f, %.6f]\n', x4); 迭代次数 = 14 解 = [1.178571, 1.714286, 1.678571] semilogy(1:iter, res, 'o-') xlabel('迭代次数'), ylabel('||x^{(k)}-x^{(k-1)}||_\infty') title('高斯-赛德尔法收敛过程'), grid on

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询