37 lines
595 B
C
37 lines
595 B
C
|
|
#include <math.h>
|
|
|
|
float plgndr(int l, int m, float x)
|
|
{
|
|
void nrerror(char error_text[]);
|
|
float fact,pll,pmm,pmmp1,somx2;
|
|
int i,ll;
|
|
|
|
if (m < 0 || m > l || fabs(x) > 1.0)
|
|
nrerror("Bad arguments in routine plgndr");
|
|
pmm=1.0;
|
|
if (m > 0) {
|
|
somx2=sqrt((1.0-x)*(1.0+x));
|
|
fact=1.0;
|
|
for (i=1;i<=m;i++) {
|
|
pmm *= -fact*somx2;
|
|
fact += 2.0;
|
|
}
|
|
}
|
|
if (l == m)
|
|
return pmm;
|
|
else {
|
|
pmmp1=x*(2*m+1)*pmm;
|
|
if (l == (m+1))
|
|
return pmmp1;
|
|
else {
|
|
for (ll=m+2;ll<=l;ll++) {
|
|
pll=(x*(2*ll-1)*pmmp1-(ll+m-1)*pmm)/(ll-m);
|
|
pmm=pmmp1;
|
|
pmmp1=pll;
|
|
}
|
|
return pll;
|
|
}
|
|
}
|
|
}
|