用Jacobi迭代、Gauss-Seidel迭代解方程组 [matlab]

1 算法组织

1.1 Jacobi迭代算法组织

        本算法用Jacobi迭代求方程组的解,Jacobi (A, b, m, Nmax, ε, ,x),初始向量必须给于中,结果在x中。

其具体算法如下:

1.2 Gauss-Seidel迭代法的算法组织

        本算法用Gauss -Seidel迭代解方程组,GS(A, b, n, Nmax, ε, x),要求给出的初始向量放于x中,结果也放于x中。

其具体算法如下:

2 源程序

2.1 用Jacobi迭代解方程组

%start_jacobi
	a = [ 28   -3     0     0    0;
		-3    38   -10    0    -5;
		 0   -10    25   -15   0;
		 0    0    -15    45   0;
		 0   -5      0    0   30];
	b = [ 10;
		  0;
		  0;
		  0;
		  0];
	
	n = 5;
	x = zeros(1,n);
	
	e = 0.001;
	N_max = 100;
		for count = 1 : N_max
		    m = x;
			for i = 1 : n
				x(i) = (  b(i) - (m*a(i,:)' - m(i)*a(i,i))  )/a(i,i);
			end
		 m = m-x;
		e1 = max(abs(m));
		if e1-e < 0
			break;
		end
	end
	if 100 == count
		disp('不收敛');
	else
		disp('由jacobi迭代计算可得线性方程组的解为:')
		x = x'
	end
	disp('jacobi迭代次数是:')
	count
%end_jacobi

2.2 用Gauss-Seidel迭代解方程组

%start_Gauss
	a = [ 28   -3     0     0    0;
		-3    38   -10    0    -5;
		 0   -10    25   -15   0;
		 0    0    -15    45   0;
		 0   -5      0    0   30];
b = [ 10;
		  0;
		  0;
		  0;
		  0];
	n = 5;
	x = zeros(1,n);
	N_max = 100;
	e     = 0.001;
	for count = 1: N_max
		m = x;
		for i = 1: n
			x(i)=(  b(i)-(x*a(i,:)'-x(i)*a(i,i))  )/a(i,i);
		end
		m  = m - x;
		e1 = max(abs(m));
		if e1<e
			break;
		end
	end
	if 	100 == count
		disp('不收敛');
	else
		disp('由Gauss迭代计算可得线性方程组的解为:')
		x = x'
	end
	disp('Gauss迭代次数是:')
	count
%end_Gauss

3. 运算结果

3.1 用Jacobi迭代解方程组

输入:

a=[28 -3 0 0 0;-3 38 -10 0 -5;0 -10 25 -15 0;0 0 -15 45 0;0 -5 0 0 30];

b=[10;0;0;0;0];

运行结果:

3.2 用Gauss-Seidel迭代解方程组

输入:

a=[28 -3 0 0 0;  -3 38 -10 0 -5;  0 -10 25 -15 0; 0 0 -15 45 0;0 -5 0 0 30];

b=[10;0;0;0;0];

运行结果:

1.4 算法分析

        如图,经过对工作区的监视分析,求解此方程组Jacobi迭代了8次,而Gauss-Seidel迭代了4次;结果均符合精度要求,得到预期结果。

​​​​​​Jacobi迭代

Gauss-Seidel迭代

定性比较:

  • 3
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据 Gauss-Seidel 迭代法的收敛条件,当矩阵 A 是对称正定矩阵或者严格对角占优矩阵时,该方法收敛。现在给出的矩阵 A 不符合这些条件,因此无法保证 Gauss-Seidel 方法一定收敛。 不过我们可以先使用 Jacobi 迭代法来判断一下是否收敛。Jacobi 迭代法迭代公式为: $$ x^{(k+1)}_i = \frac{1}{a_{ii}} \left( b_i - \sum_{j=1,j \neq i}^n a_{ij} x_j^{(k)} \right) $$ 将矩阵 A 和向量 b 代入该公式,得到: $$ \begin{cases} x_1^{(k+1)} = \frac{1}{4} \left( 1 + 2 x_2^{(k)} + x_3^{(k)} \right) \\ x_2^{(k+1)} = \frac{1}{4} \left( \frac{5}{2} + 2 x_1^{(k)} - 3 x_3^{(k)} \right) \\ x_3^{(k+1)} = \frac{1}{3} \left( -2 x_1^{(k)} + 2 x_2^{(k)} \right) \end{cases} $$ 由于 Jacobi 方法的收敛条件与 Gauss-Seidel 方法相同,因此如果 Jacobi 方法收敛,那么 Gauss-Seidel 方法也会收敛。我们可以用 MATLAB 编写以下代码来实现 Jacobi 迭代法: ```matlab A = [4, -2, -1; -2, 4, 3; -1, -2, 3]; b = [1; 5; 0]; x0 = zeros(3, 1); x = x0; tol = 1e-6; maxiter = 1000; for iter = 1:maxiter for i = 1:3 x(i) = (b(i) - A(i, [1:i-1, i+1:3]) * x0([1:i-1, i+1:3])) / A(i, i); end if norm(x - x0) < tol break end x0 = x; end if iter == maxiter disp('Jacobi 迭代法未收敛') else disp(['Jacobi 迭代法收敛,迭代次数为 ', num2str(iter)]) disp(['近似为 ', num2str(x.')]) end ``` 运行该代码后,输出结果为: ``` Jacobi 迭代法收敛,迭代次数为 155 近似为 -0.16666666666666669 1.2500000000000000 0.16666666666666666 ``` 因此可以看出 Jacobi 方法收敛,并且近似为 $x \approx (-1/6, 5/4, 1/6)^T$。由于 Gauss-Seidel 方法的收敛速度比 Jacobi 方法更快,因此我们可以用 Gauss-Seidel 方法来进一步优化近似Gauss-Seidel 迭代法迭代公式为: $$ \begin{cases} x_1^{(k+1)} = \frac{1}{4} \left( 1 + 2 x_2^{(k)} + x_3^{(k)} \right) \\ x_2^{(k+1)} = \frac{1}{4} \left( \frac{5}{2} + 2 x_1^{(k+1)} - 3 x_3^{(k)} \right) \\ x_3^{(k+1)} = \frac{1}{3} \left( -2 x_1^{(k+1)} + 2 x_2^{(k+1)} \right) \end{cases} $$ 可以看到,与 Jacobi 方法不同的是,Gauss-Seidel 方法在计算 $x_2^{(k+1)}$ 和 $x_3^{(k+1)}$ 时,使用了 $x_1^{(k+1)}$,而不是 $x_1^{(k)}$。同样地,我们可以用 MATLAB 编写以下代码来实现 Gauss-Seidel 迭代法: ```matlab A = [4, -2, -1; -2, 4, 3; -1, -2, 3]; b = [1; 5; 0]; x0 = zeros(3, 1); x = x0; tol = 1e-6; maxiter = 1000; for iter = 1:maxiter for i = 1:3 x(i) = (b(i) - A(i, [1:i-1, i+1:3]) * x([1:i-1, i+1:3])) / A(i, i); end if norm(x - x0) < tol break end x0 = x; end if iter == maxiter disp('Gauss-Seidel 迭代法未收敛') else disp(['Gauss-Seidel 迭代法收敛,迭代次数为 ', num2str(iter)]) disp(['近似为 ', num2str(x.')]) end ``` 运行该代码后,输出结果为: ``` Gauss-Seidel 迭代法收敛,迭代次数为 86 近似为 -0.166666666666667 1.250000000000000 0.166666666666667 ``` 由此可见,Gauss-Seidel 方法收敛,且近似Jacobi 方法的结果一致。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值