主题:同一个矩阵,为什么matlab和fortran得到的特征向量差距那么大
tianhy2010
[专家分:60] 发布于 2010-08-29 21:43:00
我分别用fortran和matlab算了一个64*64的矩阵的特征值和特征向量,发现特征值相同,但是特征向量差距太大了。数学上说如果r是一个矩阵的特征向量,那么k*r也是它的特征向量,两种编辑器得到的特征向量不同是有可能的,只要它们满足Hr=Ar,H--矩阵,A--矩阵特征值,就说明r是矩阵H的特征向量。我试了下,在matlab里,两者严格相等;但是在fortran里,在误差允许范围内相等,也就是说不完全相同。有没有办法让二者得到的特征向量相同呢?
我用的是imsl数据库,难道数据库不能用吗?
eigenvalue=eig(h,w=eigenvector)
还要自己编程求矩阵特征向量吗?
回复列表 (共7个回复)
沙发
yeg001 [专家分:14390] 发布于 2010-08-30 01:05:00
h, eigenvector的类型是什么?
matlab是用lapack求解矩阵的, IMSL也是用lapack求解矩阵的. 应该没有说一个准一个不准, 在程序上找问题.
板凳
tianhy2010 [专家分:60] 发布于 2010-08-30 08:54:00
h,eigenvector都是复数矩阵。程序我检查了,在外部变量相同情况下,两个编辑器得到的矩阵h是相同的,对应的数值相同啊。在fortran里,矩阵也是按列 排列的吧?
3 楼
tianhy2010 [专家分:60] 发布于 2010-08-30 09:07:00
在fortran里,一个矩阵的一行数据,与matlab得到的同一行数据相同,还是与matlab得到的一列数据相同?是不是我在对应的时候出错了啊?
fortran与matlab都是按列存放吧?那么fortran里得到的一列数据跟matlab得到的一列数据应该相同了。
4 楼
yeg001 [专家分:14390] 发布于 2010-08-30 09:50:00
我其实是想问你精度选择是否一致, matlab默认是双精度的.
你又不帖代码, 都是猜
5 楼
tianhy2010 [专家分:60] 发布于 2010-08-30 10:11:00
老兄说的有道理,可能是 精度的问题,我贴几个代码,看下精度这样设置行不行?
原来的:
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 楼
tianhy2010 [专家分:60] 发布于 2010-08-30 10:22:00
我想自己编个程序看下,徐士良的程序集给出的是解实型矩阵特征向量的程序,有没有解复型矩阵特征向量的程序?要在原来程序上修改吗?
7 楼
yeg001 [专家分:14390] 发布于 2010-08-30 11:37:00
是这么表示双精度.
但是我已经放弃这种77风格很久了, 比较推荐自由格式用real(kind=8)和complex(kind=8)写代码.
我来回复