简单起见,先将n和m的大小分别设为2和5以利于打印,将n和m修改为200和500即满足题目要求。
使用到的库函数有:
numpy.matrix:生成矩阵A
numpy.random.normal:生成随机高斯数组,转化为矩阵A
scipy.linalg.toeplitz:生成托普利兹矩阵B
numpy.random.randn:用随机高斯数填充矩阵B(所以题目没有指明用什么数填充托普利兹矩阵,所以选择了randn尽量随机化)
使用到的库函数有:
numpy.eye:生成单位矩阵
np.dot:矩阵点积计算
A.T:使用A的转置属性
使用到的库函数有:
numpy.random.randn:用随机高斯数生成一个向量b
numpy.linalg.solve:计算Bx = b的线性解
np.allclose:检验结果是否正确
使用到的库函数有:
numpy.linalg.norm:使用参数'fro',计算矩阵A的Frobenius范数
numpy.linalg.norm:使用参数numpy.inf,计算矩阵B的无穷范数
numpy.linalg.svd:计算矩阵B的奇异值
numpy.max:计算最大值
numpy.min:计算最小值
先使用一个测试样例检验算法是否正确:
测试样例为[[2,3,2],[10,3,4],[3,6,1]],最大特征值是11,对应的特征向量是[0.5,1,0.75]
可以看到结果在10e-6的精度范围内是正确的。
分别对n=20,50,100,200,500进行测试,发现迭代次数和迭代时间并不稳定,而且程序有时候会卡死,这是因为幂迭代算法需要
保证矩阵有n个线性无关的特征向量,而用随机高斯数填充矩阵并不满足这一条件。
使用到的库函数有:
numpy.random.rand:生成0到1的均匀分布矩阵,然后将小于1-p的置为0,将大于1-p的置为1,从而产生概率为p的0-1矩阵
numpy.linalg.svd:计算矩阵的奇异值
测试最大奇异值和矩阵阶数n、概率p的关系
可以看到它们之间似乎没有严格的代数相等关系,不过总的来说n越大p越大,最大奇异值也就越大。
使用到的库函数有:
numpy.random.uniform:生成一个均匀分布的矩阵A用于测试(因为题目没有指明A的性质,所以随便选择了一个均匀分布)
numpy.argmin:计算矩阵中最小的数字的下标,通过abs(A - float(z))可以将矩阵A中与z最接近的数字变为最小的数字,取到这
个数字的下标后再从A中取到这个数字即可。