Advertisement
Guest User

Lagrange interpolation

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