回 帖 发 新 帖 刷新版面

主题: jstzhurj老师,在啊?选择特定特征向量

还有个问题,自己修改了下,麻烦给帮忙看下吧![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,再跟后面的比较,再把最小的给它吧?

回复列表 (共26个回复)

沙发

我算了下,好像这样表示不好。
应该先对特征向量求转置,然后再判断某个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的满足条件的特征向量。

板凳

不知道是否需要加个循环条件,控制找的次数的循环,在这个循环内,只要找到了满足条件的特征向量,就退出找下一个ii的特征向量;如果没找到就一直找下去直到找到为止

3 楼


首先,判断一个数a是否等于1,需要这样做:
  eps=1.0e-8
  if (abs(a-1.)<eps) then
  !...
  else
  !...
  endif

4 楼

[quote]不知道是否需要加个循环条件,控制找的次数的循环,在这个循环内,只要找到了满足条件的特征向量,就退出找下一个ii的特征向量;如果没找到就一直找下去直到找到为止[/quote]


一重循环,还搞这么复杂?服了你,找到退出就行了啊!估计你是被循环嵌套搞晕了[em14][em20][em65]

5 楼


估计你要做的不是找出哪个特征向量与它的转置的乘积等于1的问题,可能一个都找不到,你需要做的或许是如何将特征向量归一化的问题。[em18]

6 楼

[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 楼


[em1][em1][em1][em1][em1][em1][em4][em4][em4][em4][em4]
conj可以吧?

8 楼

conjg

9 楼

[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 楼


是寻找与其本身转置共轭乘积为1的向量吗?

我来回复

您尚未登录,请登录后再回复。点此登录或注册