MATLAB数值分析学习笔记:线性代数方程组的求解和高斯-赛德尔方法

迭代法是前面介绍的消元法的有效替代,线性代数方程组常用的迭代法有高斯-赛德尔方法雅克比迭代法,下面会讲到二者的不同之处,大家会发现两者的实现原理其实类似,只是方法不同,本篇只重点介绍高斯-赛德尔方法。

原理:

看了我之前的笔记的同学应该已经对迭代法不再陌生了,无非就是首先取初始值,然后选取一个方法进行迭代,直到满足终止条件为止,简单概括为:

MATLAB数值分析学习笔记:线性代数方程组的求解和高斯-赛德尔方法_第1张图片

 高斯-赛德尔方法也是如此,首先猜测xi的初始值(i=1,2···n),一种简单的方法是xi=0.

把这些初始值(除了x1)带入第一个方程,就可以解出x1的新值为x_{1}=\frac{b_{1}}{a_{11}}把这个新的x1和其他初始值(除了x2)带入第二个方程,解出新的x2,以此类推,直到第一个迭代过程结束,重复迭代直到下面的终止准则成立(迭代过程收敛)

高斯-赛德尔方法中,一旦计算出某个xi的新值,就会作为已知被代入到下一个方程中,二前文提到的雅克比迭代法则不是如此,该方法一一次迭代为单位进行更新,也就是说,xi的新值不会马上被代入到下一个方程中,而是等到本次迭代之后再带入到下一次迭代,下面引用《工程于科学数值方法的MATLAB实现》(第4版)的一张图说明问题

MATLAB数值分析学习笔记:线性代数方程组的求解和高斯-赛德尔方法_第2张图片

 左边为高斯-赛德尔方法,右边为雅克比迭代法。

 代码实现:

function x = GuessSeidel(A,b,es,maxit)
%%GuessSeidel:高斯-赛德尔方法求解线性方程组
%   高斯-赛德尔方法是一种迭代法,首先猜测各个xi的初始值(一个简单的方法是设各个xi为0)
%将这些初始值带入到第一个方程解出x1,然后更新x1,将xi带入第二个方程x2,更新x2
%依次迭代,直至数值解非常接近真实值为止
%判断条件:对任意的i,有ea(i)=abs((x(i)-xold(i))/x(i))<=es
%即:max(ea)<=es

%%输入
%A=系数矩阵
%b=右侧矩阵
%es=终止准则(default = 0.00001%)
%maxit=最大迭代次数(default = 50)
%输出:
%x=解向量

%%代码实现
%思路:解向量可以简单的表示为x=d-C*x
%其中di=b_i/a_ii,C的对角线元素为0。
if nargin<2,error('至少输入系数矩阵和右侧矩阵'),end
if nargin<4||isempty(maxit),maxit=50;end
if nargin<3||isempty(es),es=0.0000001;end

[m,n]=size(A);
if m~=n,error('系数矩阵必须为方阵'), end

%求解C
C = A;
for i = 1:n
    C(i,i)=0;
    x(i) = 0;%顺便求初始x
end
x=x';
for i = 1:n
    C(i,1:n) = C(i,1:n)/A(i,i);
end
%求解d
for i=1:n
    d(i)=b(i)/A(i,i);
end
%开始迭代
iter=0;
while(1)
    xold=x;%记录上次的x
    for i=1:n
        x(i)=d(i) - C(i,:)*x;%求解并更新xi
        if x(i)~=0
            ea(i)=abs((x(i)-xold(i))/x(i));
        end
    end
    iter = iter+1;
    if max(ea)<=es || iter>=maxit,break, end
end

end

问题求解:

问题:

MATLAB数值分析学习笔记:线性代数方程组的求解和高斯-赛德尔方法_第3张图片

下面分别用了 高斯-赛德尔方法,逆矩阵法和高斯消元法求解该问题。

%%使用高斯赛德尔方法求解一组线性方程组
A=[3 -0.1 -0.2;0.1 7 -0.3;0.3 -0.2 10];
b=[7.85 -19.3 71.4]';
%下分别使用高斯赛德尔,逆矩阵法,选主元高斯法求解问题
x_1=GuessSeidel(A,b,1e-1,20)
x_2=inv(A)*b
x_3=GaussPivot(A,b)
>> GuessSeidel_test
x_1 =
    3.0000
   -2.5000
    7.0000
x_2 =
    3.0000
   -2.5000
    7.0000
x_3 =
    3.0000
   -2.5000
    7.0000

声明:文章来源于笔者学习【美】Steven C. CHapra所著,林赐译 《工程于科学数值方法的MATLAB实现》(第4版)的笔记,如有谬误或想深入了解,请翻阅原书。

你可能感兴趣的:(MATLAB学习笔记,线性代数,matlab,学习)