Thread: A programme for computing Legendre polynomials...

1. A programme for computing Legendre polynomials...

Greetings to all

I'm pretty much new to programming in C, so please excuse my mistakes. Since I'm a physics student, I mostly do applications of mathematical formulas and such. I've written a short code which should compute any Legendre polynomial for any l>0, using the formula P_l= ((2l+1)/l)*x*P_1- ((l-1)/l)*P_0.

I've developed the code in Dev-C++, and I can compile and run it. But whenever I type in the numbers needed, the program just closes abruptly! I honestly don't know what's the problem here, and that's why I'm posting this. If anyone could give me a hint, I would be most grateful. Thanks in advance!

Code:
```#include <stdio.h>

int main(void){

int l, i;
float x, P[l];

P[0]==1;
P[1]==x;

printf("Type in l i x\n");
scanf("%n %f", &l, &x);

if(l=0)
printf("P = 1\n");
else if(l=1)
printf("P = x\n");
else if(l>1)
{for(i=1; i<l; i++)
{P[l]=((2*l+1)/l)*x*P[1]-((l-1)/l)*P[0];
P[0]==P[1];
P[1]==P[l];}

printf("The polynomial is: %f", P[l]);}

getchar();
getchar();
return 0;}```

2. Does that even compile? If it does, it must at least give you warnings or something. What output does your compiler give you? If nothing, turn warnings on.

Code:
```    int l, i;
float x, P[l];

P[0]==1;
P[1]==x;```
use = for assignment. == is for comparison, which in this case does nothing.

you have not initilized l before you declare an array of length l - this is a problem, as the array could have any length, whatever happens to be in memory at the time. Most likely this will be 0, but not always.

Also note that saying P[1]=x is not going to assign the character x to that array position, it is going to assign whatever value happens to be in x to that array position. Since x is not initialized at that point either, your array is just going to contain garbage.

Code:
` if(l=0)`
Here is where you want ==. You are trying to compare two values for equality. What you are actually doing is setting l to be 0.

If you really do want to use an array to store the legendre polynomials, I suggest you make an array of the coefficients of each power of x. So make a 2D array, of size M by M, where M-1 is the highest legendre polynomial you will need. Then store in position P[i][j] the coefficient of x^j of the ith lengedre polynomial.

For example, if you wanted the polynomials up to P2, the declare P[3][3], and then the array would be

{{1,0,0},{0,1,0},{-0.5,0,1.5}}

Then you can just read off the array to get your polynomial, ie, P_2(x) = P[2][0]+P[2][1]*x+P[2][2]*x^2 = -(1/2)+(3/2)x^2

What you need is a way to extract the coefficients from the formula you have. I'll leave that to you.

3. First of all, I just want to say how bad your code is. lol. To be completely honest, you are lucky that your code even compiles, let alone just disappears when you try and run it!

Here are a few problems:

1) You declare an array with a variable you haven't assigned so the size of the array could be anything.

2) You declare:
Code:
`float x;`
and then say:
Code:
`P[1] = x;`
even though you have absolutely no idea what value the variable x is. You get the user to input the value of x, but only after you have assign an unknown variable to P[1] (assuming ofcourse that P[1] even exists because of problem (1) ).

3) You use ' %n ' in your scanf statement when ' %d ' would be far more appropriate.

4) Your method of working out the Legendre Polynomial of degree 'l' is wrong. For one, the formula you are using is wrong (assuming you mean these Legendre Polynomials). If you try working out the l = 2 case using your formula you get: 2.5*x^2 - 0.5 when you should get 1.5*x^2 - 0.5. Since the problem is with the formula you are using this error would then be present in higher polynomials too. Combine that with problem 2, your function has more in common with a random number generator than a Legendre Polynomial Calculator.

5) Not so much an error, but an observation. The way you have indented your code and placed your curly brace pairs makes it difficult to see the flow of your program. In particular I am refering to your 'else if' statement and 'for' loop.

6) At the beginning of the program you ask the user for the value of x at which you want to evaluate the Legendre Polynomial, which would imply that you are not interested in saving all the polynomials to degree 'l', but rather are just interested in a single number. Oddly, you then calculate the polynomial evaluated at point 'x' and save it in array P at position 'l'. If you are only interested in the value of the polynomial why not store it as a float or alternative in P[ 2 ]? (i.e. you only need an array of three floats, not an array storing l floats).