Implementing Generalized Laguerre Polynomials in Fortran

Click For Summary
SUMMARY

The discussion focuses on implementing Generalized Laguerre Polynomials in Fortran, specifically through a subroutine named LAGUERRE. The implementation uses the equation L^l_n(x)=∑_{k=0}^n((n+l)!(-x^2)^k)/((n-k)!k!). Users raised concerns about the accuracy of results compared to Mathematica and inquired about potential numerical errors and the use of recursive relations for calculations. Key points include the need for clarity on the gamma function's role and the indexing of input and output arrays.

PREREQUISITES
  • Understanding of Fortran programming language
  • Familiarity with Generalized Laguerre Polynomials
  • Knowledge of the gamma function and its properties
  • Basic concepts of numerical methods and error analysis
NEXT STEPS
  • Research the implementation of recursive relations for Laguerre Polynomials
  • Learn about numerical stability and error analysis in polynomial calculations
  • Investigate the properties and applications of the gamma function in numerical computations
  • Explore optimization techniques for Fortran subroutines to enhance performance
USEFUL FOR

Researchers and developers in computational physics, particularly those working with quantum mechanics calculations, as well as Fortran programmers seeking to implement mathematical functions accurately.

d4n1el
Messages
2
Reaction score
1
Hi!
Im trying to do some rather easy QM-calculations in Fortran.
To do that i need a routine that calculates the generalized Laguerre polynomials.

I just did the simplest implementation of the equation:
[tex]L^l_n(x)=\sum_{k=0}^n\frac{(n+l)!(-x^2)^k}{(n-k)!k!}[/tex]

I implemented this in the following way:
Code:
      SUBROUTINE LAGUERRE(n,l,r,u,arraylength)
      Implicit none
      INTEGER, INTENT(IN) :: arraylength,n
      real(kind=kind(0.d0)), INTENT(IN) :: l
      REAL(kind=kind(0.d0)), INTENT(IN),DIMENSION(arraylength) :: r
      REAL(kind=kind(0.d0)), INTENT(OUT),DIMENSION(arraylength) :: u
      REAL(kind=kind(0.d0)), DIMENSION(arraylength) :: temp
      Integer :: m
   
      temp=0.d0
      do m=0,n
         temp=temp+gamma(real(n)+l+1.0)*(-r)**m/
     +        (gamma(real(n)-real(m)+1.0)*gamma(l+real(m)+1.0)
     +        *gamma(real(m)+1.0))
      end do
      u=temp
      END SUBROUTINE LAGUERRE

The code is running and i do get results, but when i compare them with the results given in for example Mathematica, they seems quite strange.
So my questions are: Do you see some obvious mistakes? Do you think there are possibilities for numerical errors? (In such a case, do you have any advices on improvments?)

When i have been googling around, it looks like a lot of the numerical implementations are using recursive relations. What are the pro's and con's for doing this kind of calculation in such a manner?
 
Technology news on Phys.org
What is gamma? Is it an array, a function, a subroutine?
 
SteamKing said:
What is gamma? Is it an array, a function, a subroutine?
It looks like he's using it for factorial so it must the special function gamma (which reduces to factorial for integer values of the argument : gamma(n+1) = n! ).I just did the simplest implementation of the equation:
[tex]L^l_n(x)=\sum_{k=0}^n\frac{(n+l)!(-x^2)^k}{(n-k)!k!}[/tex]

I implemented this in the following way:
Code:
      SUBROUTINE LAGUERRE(n,l,r,u,arraylength)
      Implicit none
      INTEGER, INTENT(IN) :: arraylength,n
      real(kind=kind(0.d0)), INTENT(IN) :: l
      REAL(kind=kind(0.d0)), INTENT(IN),DIMENSION(arraylength) :: r
      REAL(kind=kind(0.d0)), INTENT(OUT),DIMENSION(arraylength) :: u
      REAL(kind=kind(0.d0)), DIMENSION(arraylength) :: temp
      Integer :: m
   
      temp=0.d0
      do m=0,n
         temp=temp+gamma(real(n)+l+1.0)*(-r)**m/
     +        (gamma(real(n)-real(m)+1.0)*gamma(l+real(m)+1.0)
     +        *gamma(real(m)+1.0))
      end do
      u=temp
      END SUBROUTINE LAGUERRE

Do you see some obvious mistakes?

Why are "r" and "u" declared as arrays yet you don't index them like arrays?

Where did the (l+k)! term come from?
Why isn't "r" squared.
 
Last edited:

Similar threads

  • · Replies 4 ·
Replies
4
Views
3K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 20 ·
Replies
20
Views
2K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 4 ·
Replies
4
Views
3K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 4 ·
Replies
4
Views
3K
  • · Replies 54 ·
2
Replies
54
Views
5K