防灾数学分享 http://blog.sciencenet.cn/u/fzmath 防灾科技学院数学教研室

博文

Gauss-Seidel 迭代法解线性方程组 A x = b 及其MATLAB编程实现

已有 20643 次阅读 2016-10-23 19:38 |系统分类:教学心得| 线性方程组, 迭代法

Guass-Seidel(高斯--赛德尔) 迭代法(简称 $G-S$ 迭代)是对 Jacobi 迭代的一种改进.

考查 在方程组(6.42) 式, 计算次序是$x_1{(k+1)}\rightarrow x_2^{(k+1)}\rightarrow x_3^{(k+1)}$, 但在计算 $ x_2^{(k+1)}$ 时并没有利用已经计算出的$x_1^{(k+1)}$,而仍利用$x_1^{(k)}$; 同样, 在计算$x_3^{(k+1)}$ 时, 也没有利用最新计算出的 $x_1^{(k+1)}$,$x_2^{(k+1)}$. 为此, 将$(6.42)$ 改进为

      $\begin{cases} x_1^{(k+1)} = \frac{1}{8}(20 + 3x_2^{(k)} - 2x_3^{(k)})\\ x_2^{(k+1)} = \frac{1}{11}(33-4x_1^{(k+1)} + x_3^{(k)})\\ x_3^{(k+1)} = \frac{1}{12}(36-6x_1^{(k+1)} - 3x_2^{(k+1)})\\ \end{cases} ,(k=0,1,2,\cdots.)$

这就是G-S迭代.


考虑一般情形, G-S迭代也就是将 J 迭代公式 $(6.40)$ 改进为

      $x_i^{(k+1)} = \frac{1}{a_{i{}i}}\left(b_i-\sum\limits_1^{i-1} a_{i{}j}{}x_j^{(k+1)} -\sum\limits_{j = i +1}^n a_{i{}j}{}x_j^{(k)} \right),(i=1,2,\cdots,n.,k = 1,2,\cdots.) (6.43)$

这是G-S迭代的分量形式.

G-S迭代的矩阵形式即是将 $(6.39)$ 式改为

    $\textbfsymbol{D} \textbfsymbol{x}^{(k+1)} = \textbfsymbol{L} \textbfsymbol{x}^{(k+1)}+\textbfsymbol{U} \textbfsymbol{x}^{(k)} + \textbfsymbol{b},(k=0,1,2,\cdots.)$

于是得

                    $\textbfsymbol{x}^{(k+1)} = (\textbfsymbol{D} - \textbfsymbol{L})^{-1} \textbfsymbol{U} \textbfsymbol{x}^{(k)} + (\textbfsymbol{D} - \textbfsymbol{L})^{-1}\textbfsymbol{b},(k=0,1,2,\cdots.) (6.44)$

              $\textbfsymbol{x}^{(k+1)} = \textbfsymbol{B}_{GS}\textbfsymbol{x}^{(k)} + \textbfsymbol{f},(k=0,1,2,\cdots.) (6.45)$

其中, 迭代矩阵 $\textbfsymbol{B}_{GS}=(\textbfsymbol{D} - \textbfsymbol{L})^{-1} \textbfsymbol{U}, \textbfsymbol{f}= (\textbfsymbol{D} - \textbfsymbol{L})^{-1}\textbfsymbol{b}$ .

Gauss-Seidel 迭代法的MATLAB程序:

function [x, k] = LinGauSeid(A,b,eps,it_max)

%  求线性方程组的Gauss-Seidel迭代法,调用格式为

%  [x, k] = LinGauSeid(A,b,ep,it_max)

%  其中

%  A 为线性方程组的系数矩阵,b 为常数项,ep 为精度要求,默认为1e-5,

%  it_max 为最大迭代次数,默认为100

%  x 为线性方程组的解,k迭代次数

if nargin <4 it_max = 100; end;

if nargin <3 eps = 1e-5; end;

if min(diag(A))<1e-10

error('% 对角元素为0,计算失败!');

end

n = length(b); xk = zeros(n,1);  k=1;

B = -tril(A)triu(A,1); f = tril(A)b;

while k<it_max

    xk1 = B*xk + f;

    if max(abs(xk1-xk))<eps

        break;

    end

    xk = xk1; k = k+1;

end

在命令窗口输入

A = [4 3 0; 3 4 -1;0 -1 4];

b = [24;30;-24];

[x, k] = LinGauSeid(A,b)

x =


3.0000

4.0000

-5.0000


k =

25

说G-S迭代是J迭代的改进,其含义是: 当二者均收敛时, G-S迭代比J迭代收敛速度要快. 然而, 也存在J迭代收敛, 而G-S迭代发散的线性方程组.




https://blog.sciencenet.cn/blog-292361-1010436.html

上一篇:Jacobi 迭代法解线性方程组 A x = b 及其MATLAB编程实现
下一篇:Lagrange 插值及其MATLAB实现
收藏 IP: 27.189.55.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-28 02:57

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部