回 帖 发 新 帖 刷新版面

主题:同一个矩阵,为什么matlab和fortran得到的特征向量差距那么大

我分别用fortran和matlab算了一个64*64的矩阵的特征值和特征向量,发现特征值相同,但是特征向量差距太大了。数学上说如果r是一个矩阵的特征向量,那么k*r也是它的特征向量,两种编辑器得到的特征向量不同是有可能的,只要它们满足Hr=Ar,H--矩阵,A--矩阵特征值,就说明r是矩阵H的特征向量。我试了下,在matlab里,两者严格相等;但是在fortran里,在误差允许范围内相等,也就是说不完全相同。有没有办法让二者得到的特征向量相同呢?
   我用的是imsl数据库,难道数据库不能用吗?
 eigenvalue=eig(h,w=eigenvector) 
还要自己编程求矩阵特征向量吗?

回复列表 (共7个回复)

沙发

h, eigenvector的类型是什么?
matlab是用lapack求解矩阵的, IMSL也是用lapack求解矩阵的. 应该没有说一个准一个不准, 在程序上找问题.

板凳

h,eigenvector都是复数矩阵。程序我检查了,在外部变量相同情况下,两个编辑器得到的矩阵h是相同的,对应的数值相同啊。在fortran里,矩阵也是按列 排列的吧?

3 楼

在fortran里,一个矩阵的一行数据,与matlab得到的同一行数据相同,还是与matlab得到的一列数据相同?是不是我在对应的时候出错了啊?
  fortran与matlab都是按列存放吧?那么fortran里得到的一列数据跟matlab得到的一列数据应该相同了。

4 楼

我其实是想问你精度选择是否一致, matlab默认是双精度的.
你又不帖代码, 都是猜

5 楼

老兄说的有道理,可能是 精度的问题,我贴几个代码,看下精度这样设置行不行?
原来的:
implicit none
  real, parameter::pi=3.14159265
  complex, parameter:: fi=(0.0, 1.0)
  real*8 t,f,w,temp,S,Eft,conrtmp
  complex*8 conduc
  integer,dimension(:)::ds(700000)  
  real*8,dimension(:)::Ef(700000),conr(700000)
  complex,allocatable::ea(:),ec(:) 
  complex*8,allocatable::h(:,:),hx(:,:),hy(:,:)
 对于复数,双精度可以这样设置不?
implicit none
  real*8, parameter::pi=3.14159265
  complex*16, parameter:: fi=(0.0, 1.0)
  real*8 t,f,w,temp,S,Eft,conrtmp
  complex*8 conduc
  integer,dimension(:)::ds(700000)  
  real*8,dimension(:)::Ef(700000),conr(700000)
  complex*16,allocatable::ea(:),ec(:) 
  complex*16,allocatable::h(:,:),hx(:,:),hy(:,:)

实型数据用real*8,复型数据用complex*16表示双精度的吧?

6 楼

我想自己编个程序看下,徐士良的程序集给出的是解实型矩阵特征向量的程序,有没有解复型矩阵特征向量的程序?要在原来程序上修改吗?

7 楼


是这么表示双精度.
但是我已经放弃这种77风格很久了, 比较推荐自由格式用real(kind=8)和complex(kind=8)写代码.

我来回复

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