首页 > 解决方案 > 程序仅在某些初始条件下才能正常工作

问题描述

如果方阵的项为非负且每行之和为 1,则方矩阵称为随机矩阵。例如,以下矩阵是随机矩阵:

[0.3, 0.7]

[0.9, 0.1]

众所周知,随机矩阵的任何幂仍然是随机的。我编写了一个程序来验证这一事实,但我遇到了一个问题:该程序适用于某些随机矩阵,但不适用于其他随机矩阵。这是我的代码:

import numpy as np

def main(p):
    # Stochastic matrix A
    A = np.array([[0.3, 0.7], 
                  [0.2, 0.8]])
    
    # Identity matrix
    B = np.array([[1, 0], 
                  [0, 1]])
    
    # Check if powers of A are stochastic
    for i in range(p):
        B = B @ A
        print(B)
        if (sum(B[0,]) == 1) and (sum(B[1,]) == 1):
            print("Good")
        else:
            print("Bad")
    
    return(0)
    
main(5)    

对于这个特定的 A,程序运行良好;它每次都打印出“Good”,我可以手动检查 A 的所有幂都是随机的。

但是,如果我们改为使用

A = np.array([[0.3, 0.7], 
              [0.5, 0.5]])

然后有些东西坏了;当我手动检查时,A 的权力仍然是随机的。但是程序会打印出一个“好”和四个“坏”。你能帮我弄清楚问题是什么吗?

标签: pythonnumpylinear-algebra

解决方案


我相信它是浮点精度。经验教训:避免将两个浮点数与==.

Numpy 有allclose这个方法:

    if np.allclose(B.sum(axis=1),1):
        print("Good")
    else:
        print("Bad")

推荐阅读