鱼C论坛

 找回密码
 立即注册
查看: 1667|回复: 2

[已解决]while为什么没达到判断条件就结束循环了

[复制链接]
发表于 2021-11-14 17:35:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码是关于幂法的计算
  1. def mifa(A):
  2.     import numpy as np
  3.   
  4.     v0=u0=np.ones((3,1))
  5.     m0=np.max(v0)
  6.     v=A*u0
  7.     m=np.max(v)
  8.     u=v/m
  9.     i=1
  10.    
  11.     while abs(m-m0)>=0.00001:
  12.         u0=u
  13.         
  14.         m0=m
  15.         print(m0)
  16.         v=A*u0
  17.         m=np.max(v)
  18.         u=v/m
  19.         i+=1
  20.         
  21.     print("在第"+str(i)+"次迭代后获得最大特征值:"+str(m))
  22.       
  23.         
  24.         
  25.    
  26. import numpy as np
  27. A=np.matrix([[12,6,-6],[6,16,2],[-6,2,16]])

  28. mifa(A)
  29.             
复制代码

可以看出让它在进行循环 达到一定的误差才可以跳出,但是计算结果总是在16次迭代停止并跳出,
  1. 24.0
  2. 20.0
  3. 19.4
  4. 19.381443298969074
  5. 19.495744680851065
  6. 19.643784786641927
  7. 19.800728905086782
  8. 19.95880194789526
  9. 20.114273458980524
  10. 20.26453383864906
  11. 20.407507789000007
  12. 20.541581011888532
  13. 20.66560913148607
  14. 21.24014861493221
  15. 21.544003739648907
  16. 在第16次迭代后获得最大特征值:21.544003744145076
复制代码

此时明显未达到精度,但是它的前面的计算都是正确的,为什么到这一步就算不下去了呢
最佳答案
2021-11-14 19:26:02
达到精度了,打印出来就知道了
  1. import numpy as np


  2. def mifa(A):
  3.     v0 = u0 = np.ones((3, 1))
  4.     m0 = np.max(v0)
  5.     v = A * u0
  6.     m = np.max(v)
  7.     u = v / m
  8.     i = 1

  9.     while abs(m - m0) >= 0.00001:
  10.         u0 = u

  11.         m0 = m
  12.         # print(m0)
  13.         v = A * u0
  14.         m = np.max(v)
  15.         print("{: >.10f}  {: >.10f}".format(m0, m))
  16.         u = v / m
  17.         i += 1

  18.     print("在第" + str(i) + "次迭代后获得最大特征值:" + str(m))


  19. A = np.matrix([[12, 6, -6], [6, 16, 2], [-6, 2, 16]])

  20. mifa(A)
复制代码

  1. F:\Python\Test>python test.py
  2. 24.0000000000  20.0000000000
  3. 20.0000000000  19.4000000000
  4. 19.4000000000  19.3814432990
  5. 19.3814432990  19.4957446809
  6. 19.4957446809  19.6437847866
  7. 19.6437847866  19.8007289051
  8. 19.8007289051  19.9588019479
  9. 19.9588019479  20.1142734590
  10. 20.1142734590  20.2645338386
  11. 20.2645338386  20.4075077890
  12. 20.4075077890  20.5415810119
  13. 20.5415810119  20.6656091315
  14. 20.6656091315  21.2401486149
  15. 21.2401486149  21.5440037396
  16. 21.5440037396  21.5440037441
  17. 在第16次迭代后获得最大特征值:21.544003744145076

  18. F:\Python\Test>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-14 19:26:02 | 显示全部楼层    本楼为最佳答案   
达到精度了,打印出来就知道了
  1. import numpy as np


  2. def mifa(A):
  3.     v0 = u0 = np.ones((3, 1))
  4.     m0 = np.max(v0)
  5.     v = A * u0
  6.     m = np.max(v)
  7.     u = v / m
  8.     i = 1

  9.     while abs(m - m0) >= 0.00001:
  10.         u0 = u

  11.         m0 = m
  12.         # print(m0)
  13.         v = A * u0
  14.         m = np.max(v)
  15.         print("{: >.10f}  {: >.10f}".format(m0, m))
  16.         u = v / m
  17.         i += 1

  18.     print("在第" + str(i) + "次迭代后获得最大特征值:" + str(m))


  19. A = np.matrix([[12, 6, -6], [6, 16, 2], [-6, 2, 16]])

  20. mifa(A)
复制代码

  1. F:\Python\Test>python test.py
  2. 24.0000000000  20.0000000000
  3. 20.0000000000  19.4000000000
  4. 19.4000000000  19.3814432990
  5. 19.3814432990  19.4957446809
  6. 19.4957446809  19.6437847866
  7. 19.6437847866  19.8007289051
  8. 19.8007289051  19.9588019479
  9. 19.9588019479  20.1142734590
  10. 20.1142734590  20.2645338386
  11. 20.2645338386  20.4075077890
  12. 20.4075077890  20.5415810119
  13. 20.5415810119  20.6656091315
  14. 20.6656091315  21.2401486149
  15. 21.2401486149  21.5440037396
  16. 21.5440037396  21.5440037441
  17. 在第16次迭代后获得最大特征值:21.544003744145076

  18. F:\Python\Test>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-14 23:48:12 | 显示全部楼层
hrpzcf 发表于 2021-11-14 19:26
达到精度了,打印出来就知道了

还是这样子的 十分感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-1 06:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表