回 帖 发 新 帖 刷新版面

主题: 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个回复)

21 楼


[em6][em6][em6][em6][em6][em6][em6][em6][em6][em6][em6][em6][em6][em6][em6]

这个程序为什么在我电脑上出错那,build时候出错
program trans
 implicit none
 !定义变量
 integer lda,ldevec,n
 parameter(n=3,lda=n,ldevec=n)
 integer nout
 real epihf,eval(n),pi
 complex a(lda,n),evec(ldevec,n)

 external epihf,evchf,umach,wrcrn,wrrrn
 !定义参数a
 data a/(1.0,0.0),(1.0,7.0),(0.0,0.0),(0.0,1.0),(1.0,-7.0),(5.0,0.0),(10.0,3.0),(0.0,-1.0),(-2.0,0.0)/
 !找到矩阵A的特征值和特征向量
 call evchf(n,a,lda,eval,evec,ldevec)
 !计算performance index
 pi=epihf(n,n,a,lda,eval,evec,ldevec)
 !输出结果
 call umach(2,nout)
 call wrrrn('eval',1,n,eval,1,0) 
 call wrcrn('evec',n,n,evec,ldevec,0)
 write(nout,'(/a,f6.3)') 'Performance index=',PI
 end

这是给出的例题程序啊

22 楼


修改了一下,算出结果来啦,目前还不明白那些外部程序干嘛用的。

program trans
 use imsl
 implicit none
 !定义变量
 integer lda,ldevec,n
 parameter(n=3,lda=n,ldevec=n)
 integer nout,i
 real  eval(n),pi
 complex a(lda,n),evec(ldevec,n),tran(ldevec,n)

! external epihf,evchf,umach,wrcrn,wrrrn
 !定义参数a
 data a/(1.0,0.0),(1.0,7.0),(0.0,1.0),(1.0,-7.0),(5.0,0.0),(10.0,3.0),(0.0,-1.0),(10.0,-3.0),(-2.0,0.0)/
 !找到矩阵A的特征值和特征向量
 
 call evchf(n,a,lda,eval,evec,ldevec)
 open(1,file='rr.txt')
 do i=1,3
 write(1,*) eval(i),evec(:,i)
 end do
 close(1)
 
 tran=transpose(conjg(evec))
 write(*,*) dot_product(tran(1,:),evec(:,3))
 end

这里存在一个问题,得到的特征向量和特征值如下:
  15.37663     (6.3084818E-02,-0.4075384) (0.7703238,0.0000000E+00)
 (0.4667635,0.1366235)
  -10.63025     (-5.9765931E-02,-0.3117051) (-0.5938700,0.1841376)
 (0.7160167,0.0000000E+00)
 -0.7463712     (0.8539324,0.0000000E+00) (-3.1258099E-02,-0.1379724)
 (8.0834307E-02,-0.4942183)

下面我还求了特征向量与它自身转置共轭矩阵的乘积,发现存在问题啊,为什么求出来的结果不为0呢?但是把这些数据用matlab算下,结果却为0。很奇怪

23 楼

这些特征向量在matlab下都是满足正交归一的,为什么在fortran下不行呢?
难道是dot_proguct出问题了?

24 楼

转置,共轭,不就是逆矩阵嘛,哎

25 楼

群里成你们俩的私聊地方了~~

26 楼

[quote]转置,共轭,不就是逆矩阵嘛,哎[/quote]
"转置,共轭" 是矩阵A的厄米矩阵, 逆矩阵那么好求就不需要弄个库了.

我来回复

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