回 帖 发 新 帖 刷新版面

主题:fortran与matlab得到不同结果

我做了一个程序,求矩阵特征值,但是发现矩阵的值跟matlab得到的矩阵值不同,不知道哪个地方出问题了,各位大侠帮我看下吧:


program main
  use IMSL
!  use linear_operators
  implicit none
  real, parameter::pi = 3.14159265
  complex, parameter:: fi = (0.0, 1.0)
  real t,f,w

  complex, allocatable:: h0(:, :)
  real, allocatable:: eigenvalue(:)  !特征值的矩阵
  integer :: i, n 
  
  n = 5 
  allocate(h0(4 * n, 4 * n))
  allocate(eigenvalue(4 * n)) 
  w = 0.0
  t = 1.0
  f = 0.25
  call hmatr(h0, n)  
  eigenvalue=eig(h0) 
  do i=1,4*n
   write(*,"('eigenvalue=',f10.7)")eigenvalue(i)  
  !   write(*,"('eigenvector=['3(f5.2'')']')")eigenvector(:,i)
  end do 
  stop

 contains
   subroutine hmatr(h0,n) 
   integer n
   complex h0(:, :)
   
   integer:: j, n0
   complex:: c(4,4),a(4,4),b(4,4)
   real:: w
   h0 = 0.0
   a = 0.0
   a(1, 4) = t
   b = transpose(a)
   c = 0.0
   do n0=1,2*n-1,2
   
      c(2, 1) = t*exp(-fi*(-pi+2*pi/3*f*(1.5*n0+1/4))) 
      c(1, 2) = conjg( c(2, 1) ) !t*exp(fi*(-pi+2*pi/3*f*(1.5*n0+1/4)))
      
      c(2, 2) = w
      c(2, 3) = t
      c(3, 2) = t
      c(3, 3) = w
      c(3, 4) = t*exp(fi*(-pi+2*pi/3*f*(1.5*(n0+1)+1/4)))
      c(4, 3) = conjg( c(3, 4) ) !t*exp(-fi*(-pi+2*pi/3*f*(1.5*(n0+1)+1/4)))
      c(4, 4) = w
       j=2*n0-1
        do j=1,4*n-3,4
         h0(j:j+3,j:j+3)=c
           if(j==1) then
            h0(j:j+3,j+4:j+7)=b;
            h0(j:j+3,4*n-3:4*n)=a;
          else if(j>=5.and.j<4*n-3) then
            h0(j:j+3,j+4:j+7)=b;
            h0(j:j+3,j-4:j-1)=a;
          else
            h0(4*n-3:4*n,1:4)=b;
            h0(j:j+3,j-4:j-1)=a;
          end if
        end do
   end do
   end subroutine hmatr
 end program main


矩阵h0虽然得到了特征值,但是这个矩阵可能违背了我的本意了,我没找到哪地方出问题了。从程序看到,每变化一个n0,都会有不同的c矩阵,但是如果把h0矩阵以文件的形式写下来发现在h0矩阵里出现好几个这个数:

(-0.7071066,0.7071069)

怎么会出现很多呢?我想可能n0就取了一个值,其他值没取到吧?因为

c(3, 4) = t*exp(fi*(-pi+2*pi/3*f*(1.5*(n0+1)+1/4)))

随着n0值不同,会变化的。百思不得其解啊。不会调试程序,埃

回复列表 (共4个回复)

沙发

您不觉得 子程序 hmatr 中变量 w 有些问题吗?

板凳


不是w的问题,昨晚我又修改了下程序,发现不能用分数。把分数改成小数,又出现问题,矩阵给出的某个位置的值与实际值正好颠倒,实部跟虚部颠倒了,很奇怪啊。

program main
  use IMSL
!  use linear_operators
  implicit none
  real, parameter::pi=3.14159265
  complex, parameter:: fi=(0.0, 1.0)
  real t,f,w

  complex, allocatable:: h0(:, :)
  real, allocatable:: eigenvalue(:)  !特征值的矩阵
  integer :: i, n ,j
  
  n = 4 
  allocate(h0(4*n,4*n))
  allocate(eigenvalue(4*n)) 
  w = 0.2
  t = 1.0
  f = 0.25
  call hmatr(h0, n)  
  open(1,file='h0.txt')
  do i=1,4*n
    do j=1,4*n

  write(1,*) h0(j,i)

    end do
  end do
  eigenvalue=eig(h0) 
  do i=1,4*n
   write(*,"('eigenvalue=',f10.7)")eigenvalue(i)  
  !   write(*,"('eigenvector=['3(f5.2'')']')")eigenvector(:,i)
  end do 
!  stop
  close(1)
 contains
   subroutine hmatr(h0,n) 
   integer n
   complex h0(:,:)
   
   integer:: j,n0
   complex:: c(4,4),a(4,4),b(4,4)
 
   h0=0.0
   a=0.0
   b=0.0
   a(1, 4)=t
   b(4,1)=t
   c=0.0
   do n0=1,2*n-1,2
      c(1,1)=w
      c(2, 1) = t*exp(fi*(-pi+2.0*pi/3.0*f*(1.5*n0+0.25))) 
      c(1, 2) = t*exp(-fi*(-pi+2.0*pi/3.0*f*(1.5*n0+0.25)))
      
      c(2, 2) = w
      c(2, 3) = t
      c(3, 2) = t
      c(3, 3) = w
      c(3, 4) = t*exp(fi*(-pi+2.0*pi/3.0*f*(1.5*(n0+1)+0.25)))
      c(4, 3) = t*exp(-fi*(-pi+2.0*pi/3.0*f*(1.5*(n0+1)+0.25)))
      c(4, 4) = w
       j=2*n0-1
       i=2*n0-1
        do j=1,4*n-3,4
           
         h0(j:j+3,j:j+3)=c
           if(j==1) then
            h0(j:j+3,j+4:j+7)=b
            h0(j:j+3,4*n-3:4*n)=a
          else if(j>=5.and.j<4*n-3) then
            h0(j:j+3,j+4:j+7)=b
            h0(j:j+3,j-4:j-1)=a
          else
            h0(4*n-3:4*n,1:4)=b
            h0(j:j+3,j-4:j-1)=a
          end if
        end do
   end do
   end subroutine hmatr
 end program main


在h0.txt文件里,c(2,1)=(-0.7933533,0.6087614),实部是-0.7933533,虚部为0.6087614,但是如果我单独把c(2,1)取出来做个小程序算下 它的值,当然前提保证其他参数比如,f,n0不变。程序如下:
program ex1
implicit none
real,parameter::pi=3.1415926
complex:: fi=(0.0,1.0)
integer n0
real::f=0.25
complex:: u=0.0
n0=1.0

u=exp(fi*(-pi+2.0*pi/3.0*f*(1.5*n0+0.25)))! exp(fi*(-pi+2.0*pi/3.0*f*(1.5*n0+0.25))) 
write(*,*) u
end
得到的结果为:(-0.608761429008721, - 0.793353340291235)
显然这才是正确结果啊,这是为什么呢?为什么单独写跟放在程序里会给出不同结果呢?

3 楼

我看了楼主在本论坛的发帖经历,恕我直言,您的编程水平似乎没有什么进步,这个程序就算您暂时正确,另外再改改又可能出错,您如何说服你自己,你的程序是正确的。当然,你也和 MatLab 验证,这个当然很好,但是不是所有的地方都经另外一种不同的方法验证呢?

前面我说的问题,你不以为意,正所谓“不知者无罪”,。。。。;
另外,你需要知道, 在 Fortran 程序中 1/4 = 0

4 楼

呵呵,我已经调出来了,一夜啊。现在好了,遇到程序先自己思考再发帖求助啦。

我来回复

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