Advertisement
Guest User

LagrangePolynomial

a guest
Jan 15th, 2021
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.20 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. void viete(int,double*,double*);
  5. double horner(int,double*,double,double*);
  6. void lagrange(int,double*,double*,double*);
  7.  
  8. int main()
  9. {
  10.     FILE* in;
  11.     FILE* out;
  12.     double *x,*y,*l;
  13.     int i,n;
  14.     if((in=fopen("in.txt","r"))==NULL)
  15.     {
  16.         printf("Nie mozna otworzyc pliku do czytania \n");
  17.         exit(1);
  18.     }
  19.     if((out=fopen("out.txt","w"))==NULL)
  20.     {
  21.         printf("Nie mozna otworzyc pliku do pisania \n");
  22.         exit(1);
  23.     }
  24.     while(!feof(in))
  25.     {
  26.         fscanf(in,"%d",&n);
  27.         x=(double*)malloc((n+1)*sizeof(double));
  28.         y=(double*)malloc((n+1)*sizeof(double));
  29.         l=(double*)malloc(n*sizeof(double));
  30.         for(i=1; i<=n; i++)
  31.             fscanf(in,"%lf",&x[i]);
  32.         for(i=1; i<=n; i++)
  33.             fscanf(in,"%lf",&y[i]);
  34.         lagrange(n,x,y,l);
  35.         for(i=0; i<=n-1; i++)
  36.             fprintf(out,"l[%d]=%.15lf\n",i,l[i]);
  37.         fprintf(out,"\n");
  38.         free(x);
  39.         free(y);
  40.         free(l);
  41.     }
  42.     fclose(in);
  43.     fclose(out);
  44.     return 0;
  45. }
  46.  
  47. void viete(int n,double* x,double* a)
  48. {
  49.     int i,j,e;
  50.     double t;
  51.     a[0]=1.0;
  52.     for(i=1; i<=n; i++)
  53.         a[i]=0.0;
  54.     for(i=1; i<=n; i++)
  55.         for(j=i; j>=1; j--)
  56.             a[j]+=a[j-1]*x[i];
  57.     e=n;
  58.     for(i=0; i<(n+1)/2; i++)
  59.     {
  60.         t=a[i];
  61.         a[i]=a[e];
  62.         a[e]=t;
  63.         e--;
  64.     }
  65.     for(i=0; i<=n; i++)
  66.         if((n-i)%2==1)
  67.             a[i]=-a[i];
  68. }
  69.  
  70. double horner(int n,double* a,double c,double* b)
  71. {
  72.     int i;
  73.     double r;
  74.     r=a[n];
  75.     for(i=n-1; i>=0; i--)
  76.     {
  77.         b[i]=r;
  78.         r=r*c+a[i];
  79.     }
  80.     return r;
  81. }
  82.  
  83. void lagrange(int n,double* x,double* y,double* l)
  84. {
  85.     int i,j;
  86.     double* a;
  87.     double* b;
  88.     double d;
  89.     a=(double*)malloc((n+1)*sizeof(double));
  90.     b=(double*)malloc(n*sizeof(double));
  91.     for(i=0; i<=n-1; i++)
  92.         l[i]=0.0;
  93.     viete(n,x,a);
  94.     for(i=1; i<=n; i++)
  95.     {
  96.         horner(n,a,x[i],b);
  97.         d=1.0;
  98.         for(j=1; j<=n; j++)
  99.             if(j!=i)
  100.                 d*=(x[i]-x[j]);
  101.         for(j=0; j<=n-1; j++)
  102.             l[j]+=(double)(y[i]/d)*b[j];
  103.     }
  104.     free(a);
  105.     free(b);
  106. }
  107.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement