Need help with a fortran-routine that calculates the associated Laguerre function

by d4n1el
Tags: fortran, numerical analysis, qm calculation
 P: 3 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: $$L^l_n(x)=\sum_{k=0}^n\frac{(n+l)!(-x^2)^k}{(n-k)!k!}$$ I implemented this in the following way:  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 alot 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?
 HW Helper Thanks P: 5,175 What is gamma? Is it an array, a function, a subroutine?
P: 2,751
 Quote by SteamKing 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:
$$L^l_n(x)=\sum_{k=0}^n\frac{(n+l)!(-x^2)^k}{(n-k)!k!}$$

I implemented this in the following way:
      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.

 Related Discussions Programming & Computer Science 2 Calculus & Beyond Homework 3 General Math 14 Advanced Physics Homework 0 General Math 1