2013-08-16 2 views
2

Я новичок в lapack и пытаюсь найти определитель матрицы NxN. Я использовал код из dualm.wordpress.com/2012/01/06/computing-determinant-in-fortran/Ошибка в fortran при использовании команды Lapack «zgetrf»

program lapackdet 

    implicit none 
    integer :: N 
    complex, allocatable, dimension(:,:) :: mat 
    complex :: det 
    integer :: i, info 
    integer, allocatable :: ipiv(:) 
    real :: sgn 

    N=2 

    allocate(ipiv(N)) 
    allocate(mat(N,N)) 

    mat=2 
    mat(1,2)=1 
    mat(2,1)=1 

    ipiv=0 

    call zgetrf(N, N, mat, N, ipiv, info) 

    do i=1, N 
    det = det*mat(i,i) 
    end do 

    do i=1, N 
    if(ipiv(i)/=i)then 
     sgn=-sgn 
    end if 
    end do 
    det=sgn*det 

    write(*,*) det 

end program lapackdet 

При использовании этого кода ошибки: "zgetrf", ссылки из: йе в cc8VZrbU.o л.д.: символ (ы) не найдено collect2: л.д. возвращается статус 1 выхода

Я не уверен, что это значит и как это исправить.

Спасибо

+5

Ошибка сбщ означает, что линкер не находит подпрограмму 'zgetrf', что вы вызываете из исходного кода. Вы включаете библиотеку Lapack в свою ссылку? –

+3

Обратите внимание, что 'det' не инициализируется 1. –

ответ

1

Как указано @ M.S.B. первым шагом для правильного компиляции кода является ссылка lapack. Я использовал gfortran main.f90 -o main -llapack -lm, и он скомпилирован в порядке.

Кроме того, чтобы получить правильный детерминант, det и sgn должны быть инициализированы до 1, как указано в @KileKanos. И подпрограмма zgetrf библиотеки LAPACK нуждается в COMPLEX*16: действительная и мнимая часть каждого комплексного числа являются двойной точностью.

Наконец, здесь приведен рабочий код, который вычисляет определитель комплексной матрицы. Она составлена ​​с gfortran main.f90 -o main -llapack -lm:

program lapackdet 

    implicit none 
    integer :: N 
    COMPLEX*16, allocatable, dimension(:,:) :: mat 
    COMPLEX*16 :: det 
    integer :: i, info 
    integer, allocatable :: ipiv(:) 
    real :: sgn 

    N=2 

    allocate(ipiv(N)) 
    allocate(mat(N,N)) 

    mat(1,2)=1 
    mat(2,1)=1 
    mat(1,1)=0 
    mat(2,2)=0 

    ipiv=0 

    call zgetrf(N, N, mat, N, ipiv, info) 

    det=1 
    do i=1, N 
    det = det*mat(i,i) 
    end do 

    sgn=1 
    do i=1, N 
    if(ipiv(i)/=i)then 
     sgn=-sgn 
    end if 
    end do 
    det=sgn*det 

    write(*,*) det 

end program lapackdet