鱼C论坛

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

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

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

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

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

x
代码是关于幂法的计算
def mifa(A):
    import numpy as np
  
    v0=u0=np.ones((3,1))
    m0=np.max(v0)
    v=A*u0
    m=np.max(v)
    u=v/m
    i=1
    
    while abs(m-m0)>=0.00001:
        u0=u
        
        m0=m
        print(m0)
        v=A*u0
        m=np.max(v)
        u=v/m
        i+=1
        
    print("在第"+str(i)+"次迭代后获得最大特征值:"+str(m))
       
        
        
    
import numpy as np
A=np.matrix([[12,6,-6],[6,16,2],[-6,2,16]])

mifa(A)
            
可以看出让它在进行循环 达到一定的误差才可以跳出,但是计算结果总是在16次迭代停止并跳出,
24.0
20.0
19.4
19.381443298969074
19.495744680851065
19.643784786641927
19.800728905086782
19.95880194789526
20.114273458980524
20.26453383864906
20.407507789000007
20.541581011888532
20.66560913148607
21.24014861493221
21.544003739648907
在第16次迭代后获得最大特征值:21.544003744145076
此时明显未达到精度,但是它的前面的计算都是正确的,为什么到这一步就算不下去了呢
最佳答案
2021-11-14 19:26:02
达到精度了,打印出来就知道了
import numpy as np


def mifa(A):
    v0 = u0 = np.ones((3, 1))
    m0 = np.max(v0)
    v = A * u0
    m = np.max(v)
    u = v / m
    i = 1

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

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

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


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

mifa(A)
F:\Python\Test>python test.py
24.0000000000  20.0000000000
20.0000000000  19.4000000000
19.4000000000  19.3814432990
19.3814432990  19.4957446809
19.4957446809  19.6437847866
19.6437847866  19.8007289051
19.8007289051  19.9588019479
19.9588019479  20.1142734590
20.1142734590  20.2645338386
20.2645338386  20.4075077890
20.4075077890  20.5415810119
20.5415810119  20.6656091315
20.6656091315  21.2401486149
21.2401486149  21.5440037396
21.5440037396  21.5440037441
在第16次迭代后获得最大特征值:21.544003744145076

F:\Python\Test>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


def mifa(A):
    v0 = u0 = np.ones((3, 1))
    m0 = np.max(v0)
    v = A * u0
    m = np.max(v)
    u = v / m
    i = 1

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

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

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


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

mifa(A)
F:\Python\Test>python test.py
24.0000000000  20.0000000000
20.0000000000  19.4000000000
19.4000000000  19.3814432990
19.3814432990  19.4957446809
19.4957446809  19.6437847866
19.6437847866  19.8007289051
19.8007289051  19.9588019479
19.9588019479  20.1142734590
20.1142734590  20.2645338386
20.2645338386  20.4075077890
20.4075077890  20.5415810119
20.5415810119  20.6656091315
20.6656091315  21.2401486149
21.2401486149  21.5440037396
21.5440037396  21.5440037441
在第16次迭代后获得最大特征值:21.544003744145076

F:\Python\Test>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

还是这样子的 十分感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 19:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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