当前位置:   article > 正文

MATLAB Jacobi迭代法 求解线性方程组_jacobi迭代法matlab

jacobi迭代法matlab

文章目录



前言

                                       雅克比(Jacobi)迭代法求解线性方程组


Jacobi迭代法是什么? 

简单的讲其实就是我们平时求解的方法(最常用的方法)

以下是Jacobi的迭代过程:

 

 


二、对应的编程思想以及公式推导


1.Jacobi迭代法 公式推导

线性方程组为:                         Ax=b

将A分裂:                          A=D+L+U         

从而得到迭代公式为:     x=-D^{-1}\left( L+U \right) x+D^{-1}b

由于D为对角元素,从而有:          D^{-1}=\frac{1}{D}

即编程语言可以写为:       x=-\left( L+U \right) *x/D+b/D

推到过程为:

                                            Ax=b \\\ \\ A=D+L+U \\\ D=\left( \begin{matrix} a_{11}& & & \\ & a_{22}& & \\ & & \ddots& \\ & & & a_{nn}\\ \end{matrix} \right) \ \\\L=\left( \begin{matrix} 0& & & \\ a_{21}& 0& & \\ \vdots& & \ddots& \\ a_{n1}& \cdots& a_{nn-1}& 0\\ \end{matrix} \right) \ \\\ U=\left( \begin{matrix} 0& a_{12}& \cdots& a_{1n}\\ & 0& & a_{2n}\\ & & \ddots& \vdots\\ & & & 0\\ \end{matrix} \right) \\\ Ax=\left( D+L+U \right) x=b \\\ Dx=-\left( L+U \right) x+b \\\ x=-D^{-1}\left( L+U \right) x+D^{-1}b


2.Jacobi迭代法求解线性方程组 例子

 

 

 

3.Jacobi迭代法 编程实现

完整程序代码为:

  1. function [x,error,iter]=GJJacobi_solve(A,b,epsilon,max_iter)
  2. % x , error , iter 为输出变量 A ,b epsilon,max_iter为输入变量
  3. n=length(b);
  4. x=zeros(n,1);
  5. % 首先编写第一步代码目的 x =-(L+U)*x/D+b/D
  6. %第二部明确符号的意义 D表示对角线的元素 L表示下三角的元素 U表示上三角的元素 b表示列向量的长度
  7. %确定误差error = norm(x-y)
  8. %输入矩阵A 以及 列向量b
  9. %表示L U D
  10. L=tril(A); %tril(A)表示取矩阵A的下三角元素, 包含了对角线元素
  11. U=triu(A); %triu(A) 表示取矩阵A的上三角元素, 包含了对角线元素
  12. D=diag(diag(A)); %表示取矩阵A的主对角元素
  13. %想办法使得L,U对角线元素都为0
  14. % L(logical(eye(size(L))))=0; %由于维度不对,从而只是等号右边为零不对
  15. % U(logical(eye(size(U))))=0;
  16. %改正
  17. %B = zeros(1,n); %[0,0,0]
  18. L(logical(eye(size(L))))=0; %[8;11;12]
  19. U(logical(eye(size(U))))=0;
  20. %需要看看是否输出的是对角线元素为0
  21. disp(L)
  22. disp(U)
  23. % 先写一个循环(发现运用一个变量时需要先初始化error=1)
  24. % 设置最小误差为10e-6
  25. error = 1 ;%初始化误差变量
  26. iter = 0; %初始化迭代步数变量
  27. while error>epsilon && iter<max_iter % 给出循环条件,以及函数输入变量epsilon,max_iter
  28. for i =1:max_iter
  29. y=x;%迭代前的矩阵,用来计算迭代误差
  30. x=-D\(L+U)*x+D\b ; %从这里知道需要把L,U,D,b表示出来 x=-(L+U)*x/D+b/D 这个维度错误
  31. error=norm(x-y); %知道迭代前的数据y,以及迭代后的数据x,设定误差为(x-y)的范数
  32. if error>epsilon %给出判断误差是否减小
  33. iter =iter+1;
  34. break
  35. end %if 需要 end 结束
  36. end %for 需要 end 结束
  37. end %while 需要 end 结束

测试代码为:

  1. A=[8 -3 2
  2. 4 11 -1
  3. 6 3 12];
  4. b=[20;33;36];
  5. epsilon=10e-6;
  6. max_iter=15;
  7. [x,error,iter]=GJJacobi_solve(A,b,epsilon,max_iter);
  8. disp('程序计算的精确解为:');
  9. disp(x);
  10. disp('最大迭代次数下的误差:');
  11. disp(error);
  12. disp('最小迭代次数:');
  13. disp(iter+1);

运行结果为:

  1. 0 0 0
  2. 4 0 0
  3. 6 3 0
  4. 0 -3 2
  5. 0 0 -1
  6. 0 0 0
  7. 程序计算的精确解为:
  8. 3.0000
  9. 2.0000
  10. 1.0000
  11. 最大迭代次数下的误差:
  12. 4.1060e-12
  13. 最小迭代次数:
  14. 14



总结

以上就是今天要讲的内容,本文仅仅简单介绍了雅克比迭代求解线性方程组

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/176841
推荐阅读
相关标签
  

闽ICP备14008679号