矩阵对角化和基变化与 geev

matrix diagonalization and basis change with geev

我想将矩阵对角化,然后能够进行基础更改。最后的目的是做矩阵求幂,exp(A) = P.exp(D).P^{-1}.

我用sgeev对角化A。如果我没记错(我可能记错了,因为它不起作用),sgeevvr 矩阵中给我 P,而 P^{-1}transpose(vl)。可以从特征值 wr.

重构对角矩阵

问题是,当我尝试通过计算 P * D * P^{-1} 来验证矩阵变换时,它没有返回 A。

这是我的代码:

integer :: i,n, info
real::norm
real, allocatable:: A(:,:), B(:,:), C(:,:),D(:,:)
real, allocatable:: wr(:), wi(:), vl(:, :), vr(:, :), work(:)

n=3
allocate(vr(n,n), vl(n,n), wr(n), wi(n), work(4*n))
allocate(A(n,n),B(n,n), C(n,n),D(n,n))

A(1,:)=(/1,0,1/)
A(2,:)=(/0,2,1/)
A(3,:)=(/0,3,1/)

call sgeev('V','V',n,A,n,wr,wi,vl,n,vr,n,work,size(work,1),info)
print*,'eigenvalues'
do i=1,n
  print*,i,wr(i),wi(i)
enddo

D=0.0
D(1,1)=wr(1)
D(2,2)=wr(2)
D(3,3)=wr(3)

C = matmul(D,transpose(vl))
B = matmul(vr,C)

print*,'A'
do i=1, n
  print*, B(i,:)
enddo

打印结果为:

                    eigenvalues
                    1   1.00000000       0.00000000    
                    2   3.30277562       0.00000000    
                    3 -0.302775621       0.00000000  
 A
  0.688247263      0.160159975      0.764021933    
   0.00000000       1.66581571      0.817408621    
   0.00000000       2.45222616      0.848407149    

A不是原来的A,更不用说最终的因素了。 我想我有点误会了,因为我通过计算 matmul(A,vr) = matmul(vr,D)matmul(transpose(vl),A) = matmul(D, transpose(vl)) 检查了特征向量,它起作用了。

我哪里错了?

问题是 transpose(vl) 不是 vr 的倒数。 sgeev给出的归一化是将每个特征向量(vlvr的每一列)单独归一化。这意味着 dot_product(vl(:,i), vr(:,j)) 如果 i/=j 则为零,但如果 i==j.

通常为 <1

如果你想得到P^{-1},你需要在转置之前将vl的每一列缩放1/dot_product(vl(:,i),vr(:,i)倍。