我是靠谱客的博主 洁净老师,最近开发中收集的这篇文章主要介绍数值分析·学习|J,G-S,T,SOR迭代法及其matlab实现目录一、前言:二、算法详细:三、实现代码:四、总结:,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

一、前言:

二、算法详细:

1.Jacobi 迭代法:

2.Gauss-Seidel 迭代法:

3.Thomas算法:

4.松弛法:

三、实现代码:

1、Jacobi 迭代法:

2、Gauss-Seidel 迭代法:

3、Thomas算法:

4、松弛法:

四、总结:


一、前言:

个人学习内容分享


二、算法详细:

1.Jacobi 迭代法

设方程组ax=b,a=d-l-u

       其中d=diag(a_{11},a_{22},...,a_{nn})

-l=begin{bmatrix} 0 & 0 & cdots & 0\ a_{21} & 0 & cdots & 0\ vdots & vdots &ddots & vdots\ a_{n1} & a_{n2} & cdots & 0 end{bmatrix} -l=begin{bmatrix} 0 & a_{21}& cdots & a_{n1}\ 0 & 0 & cdots & a_{n2}\ vdots & vdots &ddots & vdots\ 0 &0 & cdots & 0 end{bmatrix}

如果a_{ii}neq 0(i=1,2,...,n)

则原方程组可化为x=mx+g

其中迭代矩阵m=d^{-1}(l+u)=i-d^{-1}a;g=d^{-1}b

Jacobi迭代格式x^{(k+1)}=mx^{(k)}+g;k=0,1,2,...

可得解Ax=b的雅可比迭代法的计算公式为:

left{begin{matrix} x^{(0)}=(x_{1}^{(0)},x_{2}^{(0)},x_{3}^{(0)},...,x_{n}^{(0)})^{t}\ x_{i}^{(k+1)}=frac{(b_i-sum_{j=1,jneq i}^{n}a_{ij} x_{j}^{(k)})}{a_{ii}}\ i=1,2,...,n,k=0,1,... end{matrix}right.

2.Gauss-Seidel 迭代法:

在Jacobi迭代公式中,计算x_{i}^{(k+1)}时,利用已经算出来的新的x_{1}^{(k+1)},x_{2}^{(k+1)},...,x_{i-1}^{(k+1)}值,从而得到G-S迭代法。(G-S迭代法是J迭代法的一种改进)

G- S迭代法的迭代矩阵:A=D-L-U.

但是由迭代公式

x^{(k+1)}=d^{-1}lx^{(k+1)}+d^{-1}ux^{(k)}+g\ x^{(k+1)}=(i-d^{-1}l)^{-1}d^{-1}ux^{(k)}+(i-d^{-1}l)^{-1}g

所以可得迭代矩阵m=(i-d^{-1}l)^{-1}d^{-1}u=(d-l)^{-1}u

可得解Ax=b的高斯-塞德尔迭代法的计算公式为:

left{begin{matrix} x^{(0)}=(x_{1}^{(0)},x_{2}^{(0)},x_{3}^{(0)},...,x_{n}^{(0)})^{t}\ x_{i}^{(k+1)}=frac{(b_{i}-sum_{j=1}^{i-1}a_{ij}x_{j}^{k+1}-sum_{j=1}^{i-1}a_{ij}x_{j}^{k})}{a_{ii}}\ i=1,2,...,n,k=0,1,... end{matrix}right.

3.Thomas算法:

对于A为三对角矩阵时,可分解成以下形式

a=begin{pmatrix} b_1 & c_1 & cdots & cdots & 0 & 0\ a_2 & b_2 & cdots & cdots & 0 & 0\ vdots & vdots & ddots & ddots & vdots & vdots\ vdots & vdots & ddots & ddots & vdots & vdots\ 0 & 0 & cdots & cdots & b_{n-1} & c_{n-1}\ 0 & 0 & cdots & cdots & a_n & b_{n} end{pmatrix}=begin{pmatrix} a_1 & cdots & cdots & 0\ r_2 & ddots & cdots & 0\ vdots & ddots & ddots & vdots\ 0 & cdots & r_n & a_n end{pmatrix}begin{pmatrix} 1 & b_1 & cdots & 0\ 0 & 1 & cdots & 0\ vdots & vdots & ddots & vdots\ 0 & 0 & cdots & b_{n-1}\ 0 & 0 & cdots & 1 end{pmatrix}

即可得到

left{begin{matrix} b_1=a_1,c_1=a_1b_1\ a_1=r_1,b_i=r_ib_{i-1}+a_i,i=2,3,...,n\ c_i=a_ib_i,i=2,3,...,n-1 end{matrix}right.

从而求解Ax=f等价于解两个三角形方程组:

①Ly=f,求y,②Ux=y,求x.

进而追赶法公式为:

(1)计算{Bi}的递推公式

b_1=frac{c_1}{b_1};\ b_i=frac{c_i}{b_i-a_ib_{i-1}},i=2,3,...,n-1;

(2)解Ly=f

y_1=frac{f_1}{b_1}\ y_i=frac{f_{i}-a_{i}y_{i-1}}{b_{i}-a_{i}b_{i-1}},i=2,3,...,n;

(3)解Ux=y

x_n=y_n;\ x_i=y_i-b_ix_{i+1},i=n-1,n-2,...,2,1.

4.松弛法:

它是G-S迭代法的一种改进,利用第k次迭代值和第k+1次迭代值的G-S迭代值做加权平均。

可得解Ax=b的SOR方法的计算公式:

left{begin{matrix} x^{(0)}=(x_{1}^{(0)},x_{2}^{(0)},x_{3}^{(0)},...,x_{n}^{(0)})^{t}\ x_{i}^{(k+1)}=x_{i}^{(k)}+w frac{b_i-sum_{j=1}^{i-1}a_{ij}x_{j}^{k+1}-sum_{j=1}^{n}a_{ii}x_{j}^{(k)}}{a_ii}\ i=1,2,...,n;k=0,1,... end{matrix}right.

w是松弛因子。为1时,相当于不用松弛因子;大于1时,为超松弛因子,加快收敛速度;小于1时,欠松弛因子,改善收敛的条件。一般来讲,是在收敛不好的时候,采用一个较小的欠松弛因子。主要防止两次迭代值相差太大引起发散。松弛因子的值在0~1之间,越小表示两次迭代值之间变化越小,也就越稳定,但收敛也就越慢。


三、实现代码:

1、Jacobi 迭代法

function [x,k]=Jacobi(A,b,error)
%功能:雅克比迭代法
%error为误差限
n=length(A);
x0=zeros(n,1);
x=x0;
k=0;
for i=1:n
x(i)=(b(i)-A(i,1:i-1)*x0(1:i-1)-A(i,i+1:n)*x0(i+1:n))/A(i,i);
end
while norm(abs(x-x0),1)>error
k=k+1;
x0=x;
for i=1:n
x(i)=(b(i)-A(i,1:i-1)*x0(1:i-1)-A(i,i+1:n)*x0(i+1:n))/A(i,i);
end
end
end

2、Gauss-Seidel 迭代法:

function [x,k]=GaussSeidel(A,b,error)
%功能:高斯-塞德尔迭代法
%error为误差限
n=length(A);
x0=zeros(n,1);
x=x0;
k=0;
for i=1:n
x(i)=(b(i)-A(i,1:i-1)*x(1:i-1)-A(i,i+1:n)*x0(i+1:n))/A(i,i);
end
while norm(abs(x-x0),1)>error
k=k+1;
x0=x;
for i=1:n
x(i)=(b(i)-A(i,1:i-1)*x(1:i-1)-A(i,i+1:n)*x0(i+1:n))/A(i,i);
end
end
end

3、Thomas算法:

function X=Thomas(a,b,c,f)
%功能:追赶法
%a,b,c分别为三对角阵的下,中,上对角元素向量集,f为Ax=b的b.
n=length(b);
B=f;
B(1)=c(1)/b(1);
for k=2:n-1
B(k)=c(k)/(b(k)-a(k)*B(k-1));
end
y(1)=f(1)/b(1);
for k=2:n
y(k)=(f(k)-a(k-1)*y(k-1))/(b(k)-a(k-1)*B(k-1));
end
X(n)=y(n);
for k=n-1:-1:1
X(k)=y(k)-B(k)*X(k+1);
end
end 

4、松弛法:

function [x,k]=SOR(A,b,w,error)
%功能:松弛因子迭代法
%error为误差限
n=length(A);
x0=zeros(n,1);
x=x0;
k=0;
for i=1:n
x(i)=(1-w)*x0(i)+w*((b(i)-A(i,1:i-1)*x(1:i-1)-A(i,i+1:n)*x0(i+1:n))/A(i,i));
end
while norm(abs(x-x0),1)>error
k=k+1;
x0=x;
for i=1:n
x(i)=(1-w)*x0(i)+w*((b(i)-A(i,1:i-1)*x(1:i-1)-A(i,i+1:n)*x0(i+1:n))/A(i,i));
end
end
end

四、总结:

迭代结果的差异主要是由于迭代表达式形式有关,不同的迭代形式直接会影响结果的收敛速度,一般来说,就像相同次数的乘除法运算的幅度会比加减法大很多,对于向精确值的逼近亦或者远离速度也会更快,也就是收敛或发散速度。

最后

以上就是洁净老师为你收集整理的数值分析·学习|J,G-S,T,SOR迭代法及其matlab实现目录一、前言:二、算法详细:三、实现代码:四、总结:的全部内容,希望文章能够帮你解决数值分析·学习|J,G-S,T,SOR迭代法及其matlab实现目录一、前言:二、算法详细:三、实现代码:四、总结:所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部