矩阵对角化和基变化与 geev
matrix diagonalization and basis change with geev
我想将矩阵对角化,然后能够进行基础更改。最后的目的是做矩阵求幂,exp(A) = P.exp(D).P^{-1}
.
我用sgeev
对角化A
。如果我没记错(我可能记错了,因为它不起作用),sgeev
在 vr
矩阵中给我 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
给出的归一化是将每个特征向量(vl
或vr
的每一列)单独归一化。这意味着 dot_product(vl(:,i), vr(:,j))
如果 i/=j
则为零,但如果 i==j
.
通常为 <1
如果你想得到P^{-1}
,你需要在转置之前将vl
的每一列缩放1/dot_product(vl(:,i),vr(:,i)
倍。
我想将矩阵对角化,然后能够进行基础更改。最后的目的是做矩阵求幂,exp(A) = P.exp(D).P^{-1}
.
我用sgeev
对角化A
。如果我没记错(我可能记错了,因为它不起作用),sgeev
在 vr
矩阵中给我 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
给出的归一化是将每个特征向量(vl
或vr
的每一列)单独归一化。这意味着 dot_product(vl(:,i), vr(:,j))
如果 i/=j
则为零,但如果 i==j
.
<1
如果你想得到P^{-1}
,你需要在转置之前将vl
的每一列缩放1/dot_product(vl(:,i),vr(:,i)
倍。