2016-04-22 123 views
-1

我正在尝试使用LAPACK库来解决一个简单的三角形系统的方程组。下面的代码解释了这一切。dgtsv - LAPACK不返回答案

我得到一个数组满了零(初始化的),而不是正确的答案。

我检查了输入,试图用两个编译器进行编译,看起来一切正常。哪里不对?

编译行是:

ifort -L/usr/local/lib/ -llapack -lblas tLapack.f90 -o tlapack 
gfortran -L/usr/local/lib/ -llapack -lblas tLapack.f90 -o tlapack 

代码:

program lapackT 

    implicit none 

    ! dgtsv(integer(4) :: N, 
    !  integer(4) :: NRHS, 
    !  real(8) :: DL[], 
    !  real(8) :: D [], 
    !  real(8) :: DU[], 
    !  real(8) :: B [], 
    !  integer(4) :: LDB , 
    !  integer(4) :: info) 

    ! [A][x] = [b] 
    ! N - The order of matrix [A] 
    ! NRHS - Number of coluns in [b] 
    ! DL - Array with the subdiag. 
    ! D - Main diagonal. 
    ! DU - Upper Diagonal. 
    ! B - Answer !! 
    ! LDB - length of array [B]. 
    ! INFO - If = 0 .. Uhul !!. 

    real(8), dimension(3) :: mainDiag 
    real(8), dimension(2) :: lowerDiag 
    real(8), dimension(2) :: upperDiag 
    real(8), dimension(3) :: unknow 
    real(8), dimension(3) :: equalty 

    integer(4) :: info = 0 
    integer(4) :: i = 0 

    integer(4) :: N = 3 
    integer(4) :: NRHS = 1 
    integer(4) :: LDB = 3 

    mainDiag(1) = 2.0d0 
    mainDiag(2) = 2.0d0 
    mainDiag(3) = 2.0d0 

    upperDiag(1) = 3.0d0 
    upperDiag(2) = 3.0d0 

    lowerDiag(1) = 1.0d0 
    lowerDiag(2) = 1.0d0 

    equalty(1) = 1.0d0 
    equalty(2) = 1.0d0 
    equalty(3) = 1.0d0 

    unknow = 0.0d0 ! answer 

    call dgtsv(N,NRHS,lowerDiag,mainDiag,upperDiag,equalty,LDB,info) 



    write(*,*) info 

    do i = 1,size(unknow) 
    write(*,*) unknow(i) 
    end do 

    ! Correct answer: unknow = (/-1,1,0/) ! real(8) values 
    ! Answer Im getting: unknow = (/0,0,0/) ! real(8) values 


end program lapackT 

回答

2

除非dgtsv通过副作用操作,这一系列语句(你的代码,不空行):

unknow = 0.0d0 ! answer 
    call dgtsv(N,NRHS,lowerDiag,mainDiag,upperDiag,equalty,LDB,info) 
    write(*,*) info 
    do i = 1,size(unknow) 
    write(*,*) unknow(i) 
    end do 

不更新unknow。怎么可能不是全部0.0

在致电dgtsv时是否通过equalty返回结果?

3

如果你看看文档,你会看到答案是在你的参数中返回的(即它覆盖了RHS) - 因为未知未被传递,它如何受到调用的影响?我同意,我相信,这是有史以来最伟大的设计...

虽然我在这里请了解种类,你正在做的一些事情是在一个世纪前。请看Fortran 90 kind parameter。无论如何,这里是我将如何写你的程序(有人会说它现在也略显过时),并给出它的答案:

[email protected] ~/test/stack $ cat dt.f90 
program lapackT 

    implicit none 

    Integer, Parameter :: wp = Selected_real_kind(13, 70) 

    real(wp), dimension(3) :: mainDiag 
    real(wp), dimension(2) :: lowerDiag 
    real(wp), dimension(2) :: upperDiag 
    real(wp), dimension(3) :: unknow 
    real(wp), dimension(3) :: equalty 

    integer :: info = 0 
    integer :: i = 0 

    integer :: N = 3 
    integer :: NRHS = 1 
    integer :: LDB = 3 

    mainDiag(1) = 2.0_wp 
    mainDiag(2) = 2.0_wp 
    mainDiag(3) = 2.0_wp 

    upperDiag(1) = 3.0_wp 
    upperDiag(2) = 3.0_wp 

    lowerDiag(1) = 1.0_wp 
    lowerDiag(2) = 1.0_wp 

    equalty(1) = 1.0_wp 
    equalty(2) = 1.0_wp 
    equalty(3) = 1.0_wp 

    unknow = 0.0_wp ! answer 

    call dgtsv(N,NRHS,lowerDiag,mainDiag,upperDiag,equalty,LDB,info) 



    write(*,*) info 

    do i = 1,size(unknow) 
    write(*,*) equalty(i) 
    end do 

    ! Correct answer: unknow = (/-1,1,0/) ! real(8) values 
    ! Answer Im getting: unknow = (/0,0,0/) ! real(8) values 


end program lapackT 
[email protected] ~/test/stack $ gfortran -Wall -Wextra -fcheck=all -O -std=f95 dt.f90 -llapack 
[email protected] ~/test/stack $ ./a.out 
      0 
    -1.0000000000000000  
    1.0000000000000000  
    0.0000000000000000E+000 
[email protected] ~/test/stack $ 
+0

非常感谢。 –