簡體   English   中英

dgtsv-LAPACK不返回答案

[英]dgtsv - LAPACK not returning answer

我正在嘗試使用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

如果您查看文檔,您會看到在等值參數中返回了答案(即,它覆蓋了RHS)-由於未傳遞信息,它將如何受到調用的影響? 而且我同意,我相信機器人是有史以來最偉大的設計...

當我在這里時,請了解種類,但是您正在做的事情距今已有25年。 請查看Fortran 90種類參數 無論如何,這就是我如何編寫您的程序(如今有些人說它也有些過時),並且給出了答案:

ian-admin@agon ~/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
ian-admin@agon ~/test/stack $ gfortran -Wall -Wextra -fcheck=all -O -std=f95 dt.f90  -llapack
ian-admin@agon ~/test/stack $ ./a.out
           0
  -1.0000000000000000     
   1.0000000000000000     
   0.0000000000000000E+000
ian-admin@agon ~/test/stack $ 

除非dgtsv通過副作用運行,否則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 s?

是不是結果通過返回equalty在調用dgtsv

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM