Eigenvalues of a tridiagonal matrix

Click For Summary

Discussion Overview

The discussion revolves around the subroutine tqli(d,e,z) from Numerical Recipes in Fortran, specifically its application to finding eigenvalues of a tridiagonal matrix. Participants seek clarification on the logic and implementation of this subroutine, including its use of the Jacobi rotation technique and the handling of eigenvectors.

Discussion Character

  • Technical explanation
  • Exploratory
  • Homework-related

Main Points Raised

  • One participant requests an explanation of the tqli subroutine, expressing confusion about its modules and the Jacobi rotation technique.
  • Another participant suggests looking at the Fortran 77 version of the subroutine for additional explanations.
  • A request is made for a specific link to the explanation being referenced.
  • One participant offers to help based on their previous experience with a similar problem in C.
  • A participant describes their specific case involving a tridiagonal matrix with a diagonal term defined by a formula and constant super/sub-diagonal terms, seeking a detailed explanation in Fortran 90 or 77.
  • The subroutine code is provided, with comments indicating that the eigenvector portion is not of interest for the current discussion.

Areas of Agreement / Disagreement

Participants do not appear to reach a consensus on the best way to explain the subroutine or its application, as multiple requests for clarification and different approaches are presented.

Contextual Notes

Participants express varying levels of familiarity with Fortran 77 and 90, which may affect their understanding of the subroutine. The discussion includes specific references to the handling of eigenvalues and the structure of the tridiagonal matrix, but lacks resolution on the best explanation or implementation strategy.

petr1243
Messages
12
Reaction score
0
Could some one please explain the logic behind the subroutine tqli(d,e,z) found on pg.1228 of numerical recipes in fortran. For this subroutine, d and e are one dimensional arrays and z is an optional multi-dimensional array(only used if also seeking for eigenvectors of matrix). The 3 modules, and the whole jacobi rotation technique has me confused. Thank you very much.
 
Technology news on Phys.org
It looks like you're looking at the F90 version...
Have you looked at the online F77 version that provides some explanation?
 
Are you referring to the explanation from indiana university? If it isn't, then could you please send me the link.
 
Can you post the contents of the subroutine?

I've actually worked on this problem before - in C, however - but maybe I can help provide some input.
 
I'm actually working on a tridiagonal matrix in which the diagonal term is some formula in terms of integer n, and the super and sub diagonal terms are equivalent to one another(constant, independent of n). I would like to implement this subroutine into my program. I would prefer an explanation in f90, but if you can explain it in f77 then that's fine. Here is the f77 program: http://www.physics.louisville.edu/help/nr/bookfpdf/f11-3.pdf (on pg.474)

I am not too skilled in f77, so could you please be explicit in your explanation. Thank you for your time.
Here is the subroutine in f90, where the 3 modules are easily accessible on the net:

SUBROUTINE tqli(d,e,z)

USE nrtype; USE nrutil, ONLY : assert_eq, nrerror
USE nr, ONLY : pythag

IMPLICIT NONE

REAL(sp), DIMENSION(:), INTENT(inout) :: d, e
!REAL(sp), DIMENSION(:,:), OPTIONAL, INTENT(inout) :: z

INTEGER(i4b) :: i, iter, l, m, n, ndum
REAL(sp) :: b, c, dd, f, g, p, r, s
REAL(sp), DIMENSION(SIZE(e)) :: ff

n = assert_eq(SIZE(d), SIZE(e), 'tqli: n')
!IF(PRESENT(z)) ndum=assert_eq(n, SIZE(z, 1), SIZE(z, 2), 'tqli: ndum')
e(:)=EOSHIFT(e(:),1)
DO l=1, n
iter=0
iterate: DO
DO m=l, n-1
dd=ABS(d(m)) + ABS(d(m+1))
IF(ABS(e(m))+dd == dd) EXIT
END DO
IF (m==l) EXIT iterate
IF(iter == 30) CALL nrerror('too many iterations in tqli')
iter = iter+1
g=(d(l+1)-d(l))/(2.0_sp*e(l))
r = pythag(g, 1.0_sp)
g = d(m) - d(l) + e(l) / (g + SIGN(r, g))
s = 1.0
c = 1.0
p = 0.0
DO i = m-1, l, -1
f = s*e(i)
b = c*e(i)
r = pythag(f, g)
e(i+1) = r
IF(r == 0.0) THEN
d(i+1) = d(i+1) - p
e(m) = 0.0
CYCLE iterate
END IF
s = f/r
c = g/r
g = d(i + 1) - p
r = (d(i) - g) * s + 2.0_sp * c * b
p = s * r
d(i + 1) = g + p
g = c * r - b
!IF(PRESENT(z)) THEN
!ff(1:n) = z(1:n,i+1)
!z(1:n, i+1) = s*z(1:n,i) + c*ff(1:n)
!z(1:n,i) = c*z(1:n, i) - s*ff(1:n)
!END IF
END DO
d(l) = d(l) - p
e(l) = g
e(m) = 0.0
END DO iterate
END DO
END SUBROUTINE tqli

!I have commented z out, since I'm only interested in the eigenvalues of this matrix.
 
Last edited by a moderator:

Similar threads

  • · Replies 18 ·
Replies
18
Views
7K
  • · Replies 12 ·
Replies
12
Views
4K
  • · Replies 33 ·
2
Replies
33
Views
3K
  • · Replies 18 ·
Replies
18
Views
4K
  • · Replies 21 ·
Replies
21
Views
3K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 7 ·
Replies
7
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 2 ·
Replies
2
Views
4K
  • · Replies 2 ·
Replies
2
Views
3K