Python 线性方程组求解之:Jacobi迭代算法

匿名 (未验证) 提交于 2019-12-02 22:51:08
  1. import numpy as np
  2. Delta=0.0001#精度要求
  3. #数据读取
  4. data = []
  5. f = open("H:/Notepad/数学实验/jacobi_data.txt")
  6. for line in f:
  7. line = line.replace("\n","")
  8. data.append(list(map(eval, line.split(","))))
  9. f.close()
  10. data=np.array(data)
  11. #对data行初等变换,主元变为每列最大值
  12. row,column=data.shape
  13. for i in range(row):
  14. max_value_index=np.argmax(np.fabs(data[i:row,i]))
  15. temp=np.copy(data[i,:])
  16. data[i,:]=data[max_value_index+i,:]
  17. data[max_value_index+i,:]=temp
  18. #LU: -(L+U)
  19. #D:系数矩阵的对角线元素
  20. #b:Ax=b中的b
  21. LU=np.negative(data[:,0:column-1])
  22. D=np.zeros(row)
  23. b=data[:,column-1]
  24. for i in range(row):
  25. D[i]=data[i,i]
  26. LU[i,i]=0
  27. #迭代求解
  28. x=np.ones(row)#用于存储迭代过程中x的值
  29. y=np.ones(row)#用于存储中间结果
  30. for iteration in range(100):
  31. print('x:',x)
  32. #迭代计算
  33. for i in range(row):
  34. y[i]=np.vdot(LU[i,:],x)+b[i]
  35. y[i]=y[i]/D[i]
  36. #判断是否达到精度要求
  37. if np.max(np.fabs(x-y))<Delta:
  38. print('iteration:',iteration)
  39. break
  40. #将y幅值到x,开始下一轮迭代
  41. x=np.copy(y)

原理:

注:

实例数据:jacobi_data.txt 。组织方式:[A,b]

2,-1,-1,-5
1,1,10,11
1,5,-1,8

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!