48 lines
1.0 KiB
C
48 lines
1.0 KiB
C
|
|
/* Driver for routine gaulag */
|
|
|
|
#include <stdio.h>
|
|
#include <math.h>
|
|
#define NRANSI
|
|
#include "nr.h"
|
|
#include "nrutil.h"
|
|
|
|
#define NP 64
|
|
|
|
float func(float x)
|
|
{
|
|
return bessj0(x);
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
int i,n;
|
|
float alf=1.0,checkw,checkx,xx,*x,*w;
|
|
|
|
x=vector(1,NP);
|
|
w=vector(1,NP);
|
|
for (;;) {
|
|
printf("Enter N\n");
|
|
if (scanf("%d",&n) == EOF) break;
|
|
gaulag(x,w,n,alf);
|
|
printf("%3s %10s %14s\n","#","x(i)","w(i)");
|
|
for (i=1;i<=n;i++) printf("%3d %14.6e %14.6e\n",i,x[i],w[i]);
|
|
checkx=checkw=0.0;
|
|
for (i=1;i<=n;i++) {
|
|
checkx += x[i];
|
|
checkw += w[i];
|
|
}
|
|
printf("\nCheck value: %15.7e should be: %15.7e\n",checkx,n*(n+alf));
|
|
printf("\nCheck value: %15.7e should be: %15.7e\n",checkw,
|
|
exp(gammln(1.0+alf)));
|
|
/* demonstrate the use of GAULAG for an integral */
|
|
for (xx=0.0,i=1;i<=n;i++) xx += w[i]*func(x[i]);
|
|
printf("\nIntegral from gaulag: %12.6f\n",xx);
|
|
printf("Actual value: %12.6f\n",1.0/(2.0*sqrt(2.0)));
|
|
}
|
|
free_vector(w,1,NP);
|
|
free_vector(x,1,NP);
|
|
return 0;
|
|
}
|
|
#undef NRANSI
|