主题: jstzhurj老师,在啊?选择特定特征向量
tianhy2010
[专家分:60] 发布于 2010-09-01 20:11:00
还有个问题,自己修改了下,麻烦给帮忙看下吧![em8][em8][em8][em9][em9][em9][em9][em10][em10][em10][em11][em11][em11][em12][em12][em12][em13][em13][em13]
我发现程序中有个地方不完善。由于矩阵h有很多特征向量,我选择能满足条件的特征向量,要求就是特征向量与它的转置的乘积为1。你看我这样修改好不好:
!求矩阵特征值和特征向量
eigenvalue=eig(c,w=eigenvector)
traneigv=transpose(eigenvector) !求特征向量的转置矩阵
eps=1.0e-8
do ii=1,4*m*n
tai=dot_product(traneigv(ii,:),eigenvector(:,ii))
if(tai<=1.0-eps) then
kk=1
else
kk=0
if(kk==1) then
exit
end if
end if
end do
!特征值特征向量同时排序
do i=1,4
do j=i+1,4
if(eigenvalue(i)>eigenvalue(j)) then
temp=eigenvalue(j)
eigenvalue(j)=eigenvalue(i)
eigenvalue(i)=temp
eigenvectortmp(:,j)=eigenvector(:,j)
eigenvector(:,j)=eigenvector(:,i)
eigenvector(:,i)=eigenvectortmp(:,j)
endif
end do
end do
先找满足条件的特征向量,找到之后再对 特征值和特征向量排序。
另外这种排序方式好像不行啊。比如,先判断eigenvalue(1)>eigenvalue(2)是否成立,如果成立,交换二者,结束;如果不成立,就不向下进行比较了,就退出了。是否让eigenvalue(1)跟后面的比较一遍,把最小的给它,然后i=2,再跟后面的比较,再把最小的给它吧?
最后更新于:2010-09-01 20:48:00
回复列表 (共26个回复)
沙发
tianhy2010 [专家分:60] 发布于 2010-09-01 20:28:00
我算了下,好像这样表示不好。
应该先对特征向量求转置,然后再判断某个ii的特征向量的转置与该特征向量的乘积为1的条件。
traneigv=transpose(eigenvector) !求特征向量的转置矩阵
eps=1.0e-8
do ii=1,4*m*n
tai=dot_product(traneigv(ii,:),eigenvector(:,ii))
if(tai<=1.0-eps) then
kk=1
else
kk=0
if(kk==1) then
这地方还有个小问题,对每个ii,我一定得找到一个满足条件的特征向量,如果找不到满足条件的特征向量,就要一直找下去,直到找到合适的为止。再没找到这个满足ii的的特征向量之前不能找下一个ii的满足条件的特征向量。
板凳
tianhy2010 [专家分:60] 发布于 2010-09-01 20:31:00
不知道是否需要加个循环条件,控制找的次数的循环,在这个循环内,只要找到了满足条件的特征向量,就退出找下一个ii的特征向量;如果没找到就一直找下去直到找到为止
3 楼
jstzhurj [专家分:4680] 发布于 2010-09-01 21:28:00
首先,判断一个数a是否等于1,需要这样做:
eps=1.0e-8
if (abs(a-1.)<eps) then
!...
else
!...
endif
4 楼
jstzhurj [专家分:4680] 发布于 2010-09-01 21:52:00
[quote]不知道是否需要加个循环条件,控制找的次数的循环,在这个循环内,只要找到了满足条件的特征向量,就退出找下一个ii的特征向量;如果没找到就一直找下去直到找到为止[/quote]
一重循环,还搞这么复杂?服了你,找到退出就行了啊!估计你是被循环嵌套搞晕了[em14][em20][em65]
5 楼
jstzhurj [专家分:4680] 发布于 2010-09-02 09:14:00
估计你要做的不是找出哪个特征向量与它的转置的乘积等于1的问题,可能一个都找不到,你需要做的或许是如何将特征向量归一化的问题。[em18]
6 楼
tianhy2010 [专家分:60] 发布于 2010-09-02 10:13:00
[quote]
估计你要做的不是找出哪个特征向量与它的转置的乘积等于1的问题,可能一个都找不到,你需要做的或许是如何将特征向量归一化的问题。[em18][/quote]
刚才跟同学问了下才知道,不仅要归一化,还要正交。同一个向量与它的转置共轭归一,与其他向量的转置共轭正交。
还要满足一个条件。a是矩阵本征态,b是它的共轭转置,a*b构成的矩阵是单位矩阵。比如,a(1,n),b(n,1),将所有的a*b相加,得到单位矩阵。
还有一个地方用错了,transpose()只能转置,不能求共轭。我做了一个小程序试了下,data a/(1.2,3.4),(2.1,4.3),(5.9,6.0),(7.3,4.2)/
b=transpose(a)
b=/(1.2,3.4),(5.9,6.0),(2.1,4.3),(7.3,4.2)/
b的虚部并没有改变符号,所以这个地方错了。
有没有求共轭的子程序?或者函数什么的?要自己编吗?
[em15][em15][em15][em14][em14][em14][em52][em52][em52][em52][em52][em52][em52][em52][em52][em52][em52][em58][em58][em58][em58][em58][em58][em58][em58][em58][em58][em58][em53][em53][em53][em53][em53][em53][em53]
7 楼
tianhy2010 [专家分:60] 发布于 2010-09-02 10:15:00
[em1][em1][em1][em1][em1][em1][em4][em4][em4][em4][em4]
conj可以吧?
8 楼
tianhy2010 [专家分:60] 发布于 2010-09-02 10:16:00
conjg
9 楼
tianhy2010 [专家分:60] 发布于 2010-09-02 11:12:00
[quote]
首先,判断一个数a是否等于1,需要这样做:
eps=1.0e-8
if (abs(a-1.)<eps) then
!...
else
!...
endif[/quote]
这样能实现正交归一的要求吗?
eigenvalue=eig(h,w=eigenvector)
traneigv=transpose(conjg(eigenvector)) !求特征向量的转置,共轭矩阵
eps=1.0e-8
do i=1,4*m*n
do j=1,4*m*n
tai=dot_product(traneigv(i,:),eigenvector(:,j))
if(i==j) then
if(abs(tai-1)<eps) kk=1
else
if(abs(tai)<eps) kk=1
if(kk==1) exit
end if
end do
end do
这个循环能一直找下去,直到找到满足要求的特征向量吗?
10 楼
jstzhurj [专家分:4680] 发布于 2010-09-02 11:49:00
是寻找与其本身转置共轭乘积为1的向量吗?
我来回复