大家好,欢迎来到IT知识分享网。
文章对应视频讲解:(Jacobi)雅克比迭代法
一、Jacobi迭代法
n = 3 n=3 n=3 , 阶数为 3 时
A = ( a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ) , b = ( b 1 b 2 b 3 ) , A=\begin{pmatrix} a_{11} & a_{12} &a_{13}\\ a_{21} & a_{22} &a_{23}\\ a_{31} & a_{32} &a_{33}\\ \end{pmatrix} ,\quad b=\begin{pmatrix} b_1\\b_2\\ b_3 \end{pmatrix}, A=
a11a21a31a12a22a32a13a23a33
,b=
b1b2b3
,
或等价的,将 A A A 分解为 A = D − L − U A=D-L-U A=D−L−U,其中
D = d i a g ( a 11 , a 22 , a 33 ) , D=diag(a_{11},a_{22},a_{33}), D=diag(a11,a22,a33), L = − [ 0 0 0 a 21 0 0 a 31 a 32 0 ] , U = − [ 0 a 12 a 13 0 0 a 23 0 0 0 ] . L=-\begin{bmatrix} 0 & 0 &0\\ a_{21} & 0&0\\ a_{31} & a_{32} &0\\ \end{bmatrix},\quad U=-\begin{bmatrix} 0 & a_{12} &a_{13}\\ 0 & 0&a_{23}\\ 0 & 0 &0\\ \end{bmatrix}. L=−
0a21a3100a32000
,U=−
000a1200a13a230
. ( D − L − U ) x = b D x = b + ( L + U ) x x = D − 1 ( b + ( L + U ) x ) \begin{gathered} (D-L-U)x = b\\ Dx = b+(L+U)x\\ x=D^{-1}(b+(L+U)x)\\ \end{gathered} (D−L−U)x=bDx=b+(L+U)xx=D−1(b+(L+U)x)
得Jacobi公式 x ( k + 1 ) = D − 1 ( b + ( L + U ) x ( k ) ) x^{(k+1)}=D^{-1}(b+(L+U)x^{(k)}) x(k+1)=D−1(b+(L+U)x(k))
写成矩阵的形式
[ x 1 ( k + 1 ) x 2 ( k + 1 ) x 3 ( k + 1 ) ] = [ 1 a 11 1 a 22 1 a 33 ] ( [ b 1 b 2 b 3 ] − [ a 12 a 13 a 21 a 23 a 31 a 32 ] [ x 1 ( k ) x 2 ( k ) x 3 ( k ) ] ) \begin{bmatrix} x_1^{(k+1)}\\x_2^{(k+1)}\\ x_3^{(k+1)} \end{bmatrix} = \begin{bmatrix} \frac{1}{a_{11}} & &\\ & \frac{1}{a_{22}} &\\ & &\frac{1}{a_{33}}\\ \end{bmatrix}\left( \begin{bmatrix} b_1\\b_2\\ b_3 \end{bmatrix}-\begin{bmatrix} & a_{12} &a_{13}\\ a_{21} & &a_{23}\\ a_{31} & a_{32} &\\ \end{bmatrix}\begin{bmatrix} x_1^{(k)}\\x_2^{(k)}\\ x_3^{(k)} \end{bmatrix}\right)
x1(k+1)x2(k+1)x3(k+1)
=
a111a221a331
b1b2b3
−
a21a31a12a32a13a23
x1(k)x2(k)x3(k)
下面是其一般形式下的算法
二、算法
💖 Jacobi迭代法
主要思路
输入: A , b , x ( 0 ) A,b,x^{(0)} A,b,x(0),输出 x x x
x ( 0 ) = initial vector x ( k + 1 ) = D − 1 ( b + ( L + U ) x ( k ) ) \begin{aligned} x^{(0)} &= \text{ initial vector } \\ x^{(k+1)} &= D^{-1}(b+(L+U)x^{(k)}) \end{aligned} x(0)x(k+1)= initial vector =D−1(b+(L+U)x(k))
添加一些限制
- 容许误差 e_tol
- 最大迭代步 N N N
当 残差 < e_tol 或 迭代步数 ≥ N \geq N ≥N 时,停止迭代,输出结果
实现步骤
- 步骤 1: k = 0 k=0 k=0, x = x ( 0 ) x=x^{(0)} x=x(0);
- 步骤 2: 计算残差 r = ∥ b − A x ∥ r=\|b-Ax\| r=∥b−Ax∥,
- 如果残差 r r r > e_tol 且 k < N k<N k<N,转步骤 3;
- 否则,转步骤 5;
- 步骤 3: 更新解向量
x = D − 1 ( b + ( L + U ) x ( 0 ) ) x=D^{-1}(b+(L+U)x^{(0)}) x=D−1(b+(L+U)x(0)) - 步骤 4: x 0 = x x0=x x0=x, k = k + 1 k=k+1 k=k+1,转步骤 2;
- 步骤 5: 输出 x x x。
三、北太天元 or matlab 实现
Jacobi迭代
function [x,k,r] = myJacobi(A,b,x0,e_tol,N) % Jacobi迭代法解线性方程组 % Input: A, b(列向量), x0(初始值) % e_tol: error tolerant % N: 限制迭代次数小于 N 次 % Output: x , k(迭代次数),r:残差 % Version: 1.0 % last modified: 01/27/2024 n = length(b); k = 0; x=zeros(n,N); % 记录每一次迭代的结果,方便后续作误差分析 x(:,1)=x0; L = -tril(A,-1); U = -triu(A,1); D = diag(diag(A)); r = norm(b - A*x,2); while r > e_tol && k < N x(:,k+2) = inv(D)*(b+(L+U)*x(:,k+1)); r = norm(b - A*x(:,k+2),2); % 残差 k = k+1; end x = x(:,2:k+1); % x取迭代时的结果 if k>N fprintf('迭代超出最大迭代次数'); else fprintf('迭代次数=%i\n',k); end end
保存为 myJacobi.m
文件
四、数值算例
例1
A x = b Ax=b Ax=b,求 x x x
A = ( 10 − 1 2 0 − 1 11 − 1 3 2 − 1 10 − 1 0 3 − 1 8 ) b = ( 6 25 − 11 15 ) A = \begin{pmatrix} 10 & -1 & 2 & 0 \\ -1 & 11 & -1 & 3 \\ 2 & -1 & 10 & -1 \\ 0 & 3 & -1 & 8 \\ \end{pmatrix}\quad b = \begin{pmatrix} 6 \\ 25 \\ -11 \\ 15 \\ \end{pmatrix} A=
10−120−111−132−110−103−18
b=
625−1115
用Gauss列主元消去法,得
x = 1.000000000000000 2.000000000000000 -1.000000000000000 1.000000000000000
下面我们用Jacobi迭代法进行求解
设 N = 100 , e_tol = 1e-8, x0=[0; 0; 0; 0]
clc;clear all,format long; N = 100; e_tol = 1e-8; A=[10 -1 2 0; -1 11 -1 3; 2 -1 10 -1; 0 3 -1 8]; b=[6; 25; -11; 15]; x0=[0; 0; 0; 0]; t1 =tic; [x11,k1] = myJacobi(A,b,x0,e_tol,N) toc(t1); t2 = tic; [x12] = gsem_column(A,b) toc(t2); % 作图查看误差变化 x_exact=[1;2;-1;1]; %真解 n = length(b); error=zeros(n,k1);% 每个分量的误差 error = abs(x_exact - x11) res =zeros(1,k1); % 残差 for i=1:1:k1 res(i) = norm(b-A*x11(:,i),2); end % 数值解 figure(1); plot(1:k1,x11(1,:),'-*r',1:k1,x11(2,:),'-og', 1:k1,x11(3,:),'-+b',1:k1,x11(4,:),'-dk'); legend('x_1','x_2','x_3','x_4'); title('每个数值解的变化') % 残差变化 figure(2); plot(1:k1,res,'-*r'); legend('残差'); title('残差变化') % 误差 figure(3); plot(1:k1,error(1,:),'-*r',1:k1,error(2,:),'-og', 1:k1,error(3,:),'-+b',1:k1,error(4,:),'-dk'); legend('x_1','x_2','x_3','x_4'); title('误差变化')
得
迭代次数=26
例2
[ 3 − 1 0 0 0 1 2 − 1 3 − 1 0 1 2 0 0 − 1 3 − 1 0 0 0 0 − 1 3 − 1 0 0 1 2 0 − 1 3 − 1 1 2 0 0 0 − 1 3 ] [ x 1 x 2 x 3 x 4 x 4 x 5 x 6 ] = [ 5 2 3 2 1 1 3 2 5 2 ] . \begin{bmatrix}3&-1&0&0&0&\frac{1}{2}\\-1&3&-1&0&\frac{1}{2}&0\\0&-1&3&-1&0&0\\0&0&-1&3&-1&0\\0&\dfrac{1}{2}&0&-1&3&-1\\\frac{1}{2}&0&0&0&-1&3\end{bmatrix}\begin{bmatrix}x_1\\x_2\\x_3\\x_4\\x_4\\x_5\\x_6\end{bmatrix}=\begin{bmatrix}\frac{5}{2}\\ \frac{3}{2}\\1\\1\\\frac{3}{2}\\\frac{5}{2}\end{bmatrix}.
3−100021−13−102100−13−10000−13−100210−13−121000−13
x1x2x3x4x4x5x6
=
2523112325
.
使用Gauss消去法与Jacobi迭代法分别对其进行求解,并观察有何差异。
试着得到在更高阶数下的结果。
x x x的真解为 [ 1 , 1 , 1 , 1 , 1 , 1 ] T [1,1,1,1,1,1]^T [1,1,1,1,1,1]T
稀疏矩阵的构造:
function [A,b,x_sp] = setup_Sparse1(n) % 定义一个 n 阶的稀疏矩阵, 真解全为1 % Input: n % Output: A,b % % Version: 1.0 % last modified: 09/28/2023 A = zeros(n,n);b = ones(n,1) * 1.5; b([1,n],1) = 2.5; b([n/2,n/2 + 1],1) = 1; x_sp = ones(n,1); % 真解 for i = 1:1:n A(i,n+1-i) = 1/2; A(i,i) = 3; end for i =1:1:n-1 A(i,i+1)= -1;A(i+1,i)= -1; end end
保存为 setup_Sparse1.m
文件
实现代码
%% 测试 消去法 与 迭代法 在处理稀疏矩阵问题上的差距 clc;clear all,format long; N = 100; e_tol = 1e-8; n = 6; % n 为 6 50 100 500 1000 [A,b,x]=setup_Sparse1(n); x0 = zeros(n,1); t1 =tic; [x11,k1,r1] = myJacobi(A,b,x0,e_tol,N); toc(t1); t2 = tic; [x12] = gsem_column(A,b); toc(t2); r2 = norm(b-A*x12);
- Jacobi迭代次数为33次,耗时 0. 秒。 r = 8.5770 e − 09 r= 8.5770e-09 r=8.5770e−09
- Gauss列主元耗时 0. 秒。 r = 0 r=0 r=0
n=50时
- Jacobi迭代次数为84次,耗时 0. 秒。 r = 8.6777 e − 09 r= 8.6777e-09 r=8.6777e−09
- Gauss列主元耗时 0. 秒。 r = 5.3577 e − 15 r=5.3577e-15 r=5.3577e−15
n=100时
- Jacobi迭代次数为84次,耗时 1.017717 秒。 r = 9.0032 e − 09 r= 9.0032e-09 r=9.0032e−09
- Gauss列主元耗时 1. 秒。 r = 7.0848 e − 15 r=7.0848e-15 r=7.0848e−15
n=500时
- Jacobi迭代次数为84次,耗时 20. 秒。 r = 9.3455 e − 09 r= 9.3455e-09 r=9.3455e−09
- Gauss列主元耗时 21. 秒。 r = 8.5065 e − 15 r=8.5065e-15 r=8.5065e−15
n=1000时
- Jacobi迭代次数为84次,耗时 34. 秒。 r = 9.4769 e − 09 r= 9.4769e-09 r=9.4769e−09
- Gauss列主元耗时 89. 秒。 r = 1.0300 e − 14 r=1.0300e-14 r=1.0300e−14
而Jacobi迭代法,只需把精度控制在所需范围内即算完成任务,能够节约很多时间。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/139951.html