我试着求矩阵的平方根。就是找到矩阵
B
所以
B*B=A
. 我找到的方法都没有一个有效的结果。
首先我发现这个公式
Wikipedia
:
套
Y_0 = A
和
Z_0 = I
然后迭代:
Y_{k+1} = .5*(Y_k + Z_k^{-1}),
Z_{k+1} = .5*(Z_k + Y_k^{-1}).
那么
Y
应该收敛到
乙
.
然而,在python中实现算法(对逆矩阵使用numpy)给了我垃圾结果:
>>> def denbev(Y,Z,n):
if n == 0: return Y,Z
return denbev(.5*(Y+Z**-1), .5*(Z+Y**-1), n-1)
>>> denbev(matrix('1,2;3,4'), matrix('1,0;0,1'), 3)[0]**2
matrix([[ 1.31969074, 1.85986159],
[ 2.78979239, 4.10948313]])
>>> denbev(matrix('1,2;3,4'), matrix('1,0;0,1'), 100)[0]**2
matrix([[ 1.44409972, 1.79685675],
[ 2.69528512, 4.13938485]])
如你所见,迭代100次,得到
更糟的
结果比迭代三次,没有一个结果能在40%的误差范围内得到。
然后我尝试了scipy sqrtm方法,但更糟糕的是:
>>> scipy.linalg.sqrtm(matrix('1,2;3,4'))**2
array([[ 0.09090909+0.51425948j, 0.60606061-0.34283965j],
[ 1.36363636-0.77138922j, 3.09090909+0.51425948j]])
>>> scipy.linalg.sqrtm(matrix('1,2;3,4')**2)
array([[ 1.56669890+0.j, 1.74077656+0.j],
[ 2.61116484+0.j, 4.17786374+0.j]])
我对矩阵平方根不太了解,但我想一定有比上面更好的算法?