当前位置:   article > 正文

数值分析——雅可比(Jacobi)迭代法(Python及MATLAB实现)_雅可比迭代法matlab

雅可比迭代法matlab

一、Python实现

  1. import numpy as np
  2. import math
  3. import sys
  4. #分解矩阵
  5. def DLU(A):
  6. D=np.zeros(np.shape(A))
  7. L=np.zeros(np.shape(A))
  8. U=np.zeros(np.shape(A))
  9. for i in range(A.shape[0]):
  10. D[i,i]=A[i,i]
  11. for j in range(i):
  12. L[i,j]=-A[i,j]
  13. for k in list(range(i+1,A.shape[1])):
  14. U[i,k]=-A[i,k]
  15. L=np.mat(L)
  16. D=np.mat(D)
  17. U=np.mat(U)
  18. return D,L,U
  19. #迭代
  20. def Jacobi_iterative(A,b,x0,maxN,p): #x0为初始值,maxN为最大迭代次数,p为允许误差
  21. D,L,U=DLU(A)
  22. if len(A)==len(b):
  23. D_inv=np.linalg.inv(D)
  24. D_inv=np.mat(D_inv)
  25. B=D_inv * (L+U)
  26. B=np.mat(B)
  27. f=D_inv*b
  28. f=np.mat(f)
  29. else:
  30. print('维数不一致')
  31. sys.exit(0) # 强制退出
  32. a,b=np.linalg.eig(B) #a为特征值集合,b为特征值向量
  33. c=np.max(np.abs(a)) #返回谱半径
  34. if c<1:
  35. print('迭代收敛')
  36. else:
  37. print('迭代不收敛')
  38. sys.exit(0) # 强制退出
  39. #以上都是判断迭代能否进行的过程,下面正式迭代
  40. k=0
  41. while k<maxN:
  42. x=B*x0+f
  43. k=k+1
  44. eps=np.linalg.norm(x-x0,ord=2)
  45. if eps<p:
  46. break
  47. else:
  48. x0=x
  49. return k,x
  50. # A = np.array([[8,-3,2],[4,11,-1],[5,3,12]])
  51. # b = np.array([[20],[33],[36]])
  52. A = np.mat([[10,3,1],[2,-10,3],[1,3,10]])
  53. b = np.mat([[14],[-5],[14]])
  54. x0=np.mat([[0],[0],[0]])
  55. maxN=100
  56. p=0.00000001
  57. print("原系数矩阵a:")
  58. print(A, "\n")
  59. print("原值矩阵b:")
  60. print(b, "\n")
  61. k,x=Jacobi_iterative(A,b,x0,maxN,p)
  62. print("迭代次数")
  63. print(k, "\n")
  64. print("数值解")
  65. print(x, "\n")

运行结果

  1. 原系数矩阵a:
  2. [[ 10 3 1]
  3. [ 2 -10 3]
  4. [ 1 3 10]]
  5. 原值矩阵b:
  6. [[14]
  7. [-5]
  8. [14]]
  9. 迭代收敛
  10. 迭代次数
  11. 22

二、MATLAB实现

  1. function [x,h,k] = Jacobiiter(A,b,x0,N,p) %N代表最大迭代次数
  2. n=length(A);
  3. n1=length(b);
  4. D=zeros(n);L=zeros(n);U=zeros(n);
  5. x=zeros(n,1);
  6. x0=transpose(x0);
  7. b=transpose(b);
  8. if n~=n1
  9. disp('维数不一致')
  10. return
  11. end
  12. D(n,n)=A(n,n);
  13. for i=1:n-1
  14. D(i,i)=A(i,i);
  15. for j=1:i-1
  16. L(i,j)=-A(i,j);
  17. end
  18. for r=i+1:n-1
  19. U(i,r)=-A(i,r);
  20. end
  21. end
  22. k=0;
  23. while k<=N
  24. x=(eye(n)-inv(D)*A)*x0+inv(D)*b;
  25. k=k+1;
  26. h=norm((x-x0),inf);
  27. if h<=p
  28. break
  29. end
  30. x0=x;
  31. end
  32. if k>N
  33. disp(['迭代次数= ',num2str(k),',算法超过最大迭代次数。']);
  34. else
  35. disp(['迭代次数= ',num2str(k)]);
  36. end
  37. x=x0
  38. end

输入

  1. A=[10,3,1;2,-10,3;1,3,10];
  2. b=[14,-5,14];
  3. x0=[0,0,0];
  4. N=100;
  5. p=0.00000001;
  6. [x,h,k] = Jacobiiter(A,b,x0,N,p);

输出

  1. A=[10,3,1;2,-10,3;1,3,10];
  2. b=[14,-5,14];
  3. x0=[0,0,0];
  4. N=100;
  5. p=0.00000001;
  6. [x,h,k] = Jacobiiter(A,b,x0,N,p);

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

闽ICP备14008679号