我试图实现QR算法来找到矩阵的一些特征值,但我在Python中将循环放在一起时遇到了一些麻烦。
基本上,我有一个带有非对角线条目的正方形可逆矩阵A,每次我通过循环时,我想检查这些非对角线条目是否低于某个设定精度(例如1 ^ -6) )。如果是,我想停下来给出结果矩阵。以下是我到目前为止的情况:
accuracy=1^-6
V=numpy.identity(4)
for x in xrange(100):
while i != j:
if A[i][j]>accuracy:
Q,R=numpy.linalg.qr(A)
A=numpy.dot(R,Q)
numpy.dot(V,Q)
else:
print "Off-diag entries below accuracy value"
print A
但我的代码不起作用。它说我还没有定义,但是我不确定我将它定义为什么,因为它应该是矩阵A的行条目。我想我只是坚持这个环。
修改:
好的,我摆脱了while循环,因为它让事情变得混乱。 现在我拥有的是:
accuracy=1^-8
V=numpy.identity(4)
for i in xrange(0,4):
for j in xrange(0,4):
if A[i,j]>accuracy:
Q,R=numpy.linalg.qr(A)
print "This is Q:",Q
print "This is R: ",R
A=numpy.dot(R,Q)
print "This is the new A where A=RQ:",A
numpy.dot(V,Q)
else:
print "Stopped"
print "This is A now:"
print A
这是我得到的A:
This is A now:
[[ 9.77769257e+00 0.00000000e+00 3.22862690e-08 0.00000000e+00]
[ 0.00000000e+00 1.00578866e+01 0.00000000e+00 1.20385489e-04]
[ 3.22862677e-08 0.00000000e+00 7.22307431e-01 0.00000000e+00]
[ 0.00000000e+00 1.20385489e-04 0.00000000e+00 2.44211345e+00]]
我应该得到的是对角矩阵,对角线上有特征值。在上面编辑的代码中,我省略了对非对角元素的检查,因为我不确定如何去做。但基本上,它应该检查不在对角线上的元素是否小于上面给出的精度常数。如果是,那么循环应该完成。如果没有,它应该继续前进,直到非对角元素真的那么小。这都是近似得到对角矩阵。
答案 0 :(得分:1)
i
和j
,并且它们的值不会更改。
另一方面,外部循环中不使用x
。
我不确定你要做的是什么,以及你是否需要这两个循环。但也许你想要这样的东西:
accuracy=1^-6
V=numpy.identity(4)
for i in xrange(4):
for j in xrange(4):
if i != j:
if A[i][j]>accuracy:
Q,R=numpy.linalg.qr(A)
A=numpy.dot(R,Q)
numpy.dot(V,Q)
else:
print "Off-diag entries below accuracy value"
print A
更新:固定而我!= j如果我!= j