Advertisement
Guest User

Untitled

a guest
Sep 19th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.81 KB | None | 0 0
  1. #include <math.h>
  2. #include <stdio.h>
  3. #define N 20
  4. double f(double x){
  5. return 3*sin(x);
  6. }
  7.  
  8. int main(int argc, char **argv)
  9. {
  10. //Зчитуємо результат табуляції функції
  11. FILE * fp;
  12. double arr[N][2];
  13. fp = fopen("test.txt", "r");
  14. for(int j = 0;j<N;j++){
  15. fscanf(fp,"%lf %lf\n",&arr[j][0],&arr[j][1]);
  16. printf("%lf %lf\n",arr[j][0],arr[j][1]);
  17. }
  18. double a[N], b[N], c[N], d[N], h[N];
  19. double alph[N],beta[N],gama[N],delta[N];
  20. FILE *newx, *fe, *newy;
  21.  
  22.  
  23. for(int i = 1; i < N; i++){
  24. h[i] = arr[i][0] - arr[i-1][0];
  25. a[i] = arr[i-1][1];
  26. }
  27. //Розрахунок коефіцієгтів альфа бета гама дельта
  28. for(int i = 2; i < N - 1 ; i++){
  29. alph[i] = h[i-1];
  30. beta[i-1] = 2*(h[i-1] + h[i]);
  31. gama[i] = h[i];
  32. delta[i-1] = 3 * (((arr[i][1] - arr[i-1][1]) / h[i]) - ((arr[i-1][1] - arr[i-2][1]) / h[i-1]));
  33. }
  34.  
  35. alph[N-2] = h[N-2];
  36. beta[N-2] = 2*(h[N-2] + h[N-1]);
  37. delta[N-2] = 3 * (((arr[N-1][1] - arr[N-2][1]) / h[N-1]) - ((arr[N-2][1] - arr[N-3][1]) / h[N-2]));
  38.  
  39. //Прямий хід методу прогонки
  40. double A[N], B[N];
  41. A[1] = -(gama[1] / beta[1]);
  42. B[1] = delta[1] / beta[1];
  43. for(int i = 2; i < N-1; i++){
  44. A[i] = -(gama[i] / (alph[i] * A[i-1] + beta[i]));
  45. B[i] = (delta[i] - alph[i]*B[i-1]) / (alph[i] * A[i-1] + beta[i]);
  46. }
  47. //Зворотній хід методу прогонки
  48.  
  49. c[N-1] = (delta[N-1] - alph[N-1]*B[N-2]) / (alph[N-1]*A[N-2] + beta[N-1]);
  50. for(int i = N-1; i > 1; i--){
  51. c[i] = A[i-1] * c[i+1] + B[i-1];
  52. }
  53. c[1]=0;
  54.  
  55. //Розрахунок коефіцієнтів b і d сплайнів
  56. for(int i = 1; i < N-1; i++){
  57. d[i] = (c[i+1]-c[i])/(3*h[i]);
  58. b[i] = (arr[i][1] - arr[i-1][1]) / h[i] - h[i] * (c[i+1] + 2*c[i])/3;}
  59. d[N-1] = -c[N-1]/(3*h[N-1]);
  60. b[N-1] = (arr[N-1][1] - arr[N-2][1]) / h[N-1] - 2/3*h[N-1]*c[N-1];
  61.  
  62. newx=fopen("newx.txt","w");
  63. fe=fopen("e.txt","w");
  64. newy=fopen("newy.txt","w");
  65. double yy[20*N];
  66. double xx[20*N];
  67. double H = (arr[N-1][0] - arr[0][0])/(20*N);
  68. xx[0] = arr[0][0];
  69. int L=1;
  70. double z = arr[0][0];
  71.  
  72. for(int i = 0; i < 20*N; i++){
  73. while(z>arr[L][0]) L++;
  74. yy[i] = a[L] + b[L] * (z - arr[L-1][0]) + c[L] * (z - arr[L-1][0]) * (z - arr[L-1][0]) + d[L] * (z - arr[L-1][0]) * (z - arr[L-1][0]) * (z - arr[L-1][0]);
  75. fprintf(newx, "%lf\n", z);
  76. fprintf(fe, "%lf\n",fabs(yy[i]-f(z)));
  77. fprintf(newy, "%lf\n",yy[i]);
  78. xx[i] = z;
  79. z += H;
  80. if(z > arr[N-1][0]) break;
  81. }
  82.  
  83. fclose(newx);
  84. fclose(fe);
  85. fclose(newy);
  86. return 0;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement