
Accuracy problem with LaguerreA function

julien
I need to use associated Laguerre polynomials of large n (but small k only) to solve some physics problems. It looks like there might be some numerical issues with LaguerreA Igor function when n gets relatively large (>50). The generated function get very "noisy". To confirm this, I have compared what gives LaguerreA with what gives the direct definition of LaguerreA (i.e. differentiating the Laguerre function). It looks like the "error" can be very large. An example is attached for n=55. It gets worse for larger n. The code I used is below.
Since I need to use fonctions with very large n, it is a problem if I use the LaguerreA Igor function. I can, of course, generate the fonction with the given code but having an accurate LaguerreA fonction would be very convenient.
I am not sure if this is a known behavior of LaguerreA or if I am doing something wrong.
Best,
function generate_laguerre(xrange,xpts,nrange) //this function generate a wave "laguerrewave" that contains Laguerre polynomials of degree up to nrange and x value up to xrange (with xpts points) variable xrange,xpts,nrange variable xpts_int=trunc(xpts) variable n=trunc(nrange) make /o /n=(xpts_int,n+1) laguerrewave=nan setscale /i x,0,xrange,laguerrewave make /o /n=(xpts_int) laguerre_xwave=nan laguerre_xwave[]=p*xrange/(xpts_int-1) laguerrewave[][]=laguerre(q,laguerre_xwave[p]) end function generate_laguerrea_1_2() //generate waves based on the generated "laguerrewave": //"laguerrewave_1" is the associated Laguerre polynomial with k=1 get from differentiating "laguerrewave", //"laguerrewave_2" is the associated Laguerre polynomial with k=2, //"laguerrea_1" is the associated Laguerre polynomial with k=1 get with LaguerreA, //"laguerrea_2" is the associated Laguerre polynomial with k=2, //"laguerrea_1res" is the difference between the associated Laguerre polynomial with k=1 that is given by Laguerrea Igor function and "laguerrewave_1" //"laguerrea_2res" is the difference between the associated Laguerre polynomial with k=2 that is given by Laguerrea Igor function and "laguerrewave_2" wave laguerrewave=root:laguerrewave wave laguerre_xwave=root:laguerre_xwave variable nsize=dimsize(laguerrewave,1) duplicate /o laguerrewave,laguerrewave_1,laguerrewave_1temp,laguerrewave_2,laguerrewave_2temp,laguerrea_1,laguerrea_2,laguerrea_1res,laguerrea_2res redimension /n=(-1,(nsize-1)) laguerrewave_1,laguerrea_1,laguerrea_1res redimension /n=(-1,(nsize-2)) laguerrewave_2,laguerrea_2,laguerrea_2res differentiate /dim=0 laguerrewave /x=laguerre_xwave /D=laguerrewave_1temp //First differrentiate to get Laguerre(n,1,x) laguerrewave_1[][]=(-1)^1*laguerrewave_1temp[p][q+1] //Definition of Laguerrea laguerrea_1[][]=laguerrea(q,1,laguerre_xwave[p]) //Generate directly from Laguerrea Igor function for comparison differentiate /dim=0 laguerrewave_1temp /x=laguerre_xwave /D=laguerrewave_2temp //First differrentiate to get Laguerre(n,2,x) laguerrewave_2[][]=(-1)^2*laguerrewave_2temp[p][q+2] //Definition of Laguerrea laguerrea_2[][]=laguerrea(q,2,laguerre_xwave[p]) //Generate directly from Laguerrea Igor function for comparison laguerrea_1res=laguerrea_1-laguerrewave_1 //wave difference for comparison laguerrea_2res=laguerrea_2-laguerrewave_2 //wave difference for comparison end

August 21, 2017 at 12:14 pm - Permalink