Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2014
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.11 KB | None | 0 0
  1. #include "/home/labs/komputerowe_symulacje_numeryczne/numerical_recipes.c/nrutil.h"
  2. #include "/home/labs/komputerowe_symulacje_numeryczne/numerical_recipes.c/nrutil.c"
  3. #include "/home/labs/komputerowe_symulacje_numeryczne/numerical_recipes.c/gaussj.c"
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <math.h>
  7.  
  8. double delta = 0.01;
  9. float xmax=5;
  10. float xmin=-5;
  11. float dx;
  12.  
  13. double pow2(double x) {
  14. return x*x;
  15. }
  16.  
  17. double pow3(double x) {
  18. return x*x*x;
  19. }
  20.  
  21. double f1(double x){
  22. return (1/(1+x*x));
  23. }
  24.  
  25. double f2(double x){
  26. return cos(2*x);
  27. }
  28.  
  29. double fp1(double x){
  30. return (f1(x+delta) - f1(x-delta)) / (2*delta);
  31. }
  32.  
  33. double fp2(double x){
  34. return (f2(x+delta) - f2(x-delta)) / ( 2*delta );
  35. }
  36.  
  37. double FI(float* x, float X, int i){
  38. double h = dx;
  39. double fi = 0;
  40.  
  41. if (x[i-2] <= X && X < x[i-1])
  42. fi = pow3(X - x[i-2]) / pow3(h);
  43.  
  44. if (x[i-1] <= X && X < x[i])
  45. fi = ( pow3(h) + 3.0*pow2(h) * (X-x[i-1]) + 3.0*h * pow2(X-x[i-1]) - 3.0 * pow3(X-x[i-1])) / pow3(h);
  46.  
  47. if (x[i] <= X && X < x[i+1])
  48. fi = ( pow3(h) + 3.0*pow2(h) * (x[i+1]-X) + 3.0*h * pow2(x[i+1]-X) - 3.0 * pow3(x[i+1]-X)) / pow3(h);
  49.  
  50. if (x[i+1] <= X && X < x[i+2])
  51. fi = pow3(x[i+2] - X) / pow3(h);
  52.  
  53. return fi;
  54. }
  55.  
  56. float s(float X, float* c, int n, float*x){
  57.  
  58. double s = 0;
  59. int i;
  60.  
  61. for (i=0; i<=(n+1); i++)
  62. s += c[i] * FI(x, X, i);
  63. return s;
  64. }
  65.  
  66. void fillMatrix(float** m, int n){
  67. int i,j;
  68. for (i=1; i<=n; ++i)
  69. for (j=1; j<=n; ++j)
  70. {
  71. m[i][j] = 0;
  72. if (i==j)
  73. m[i][j] = 4;
  74. if (j==(i+1))
  75. m[i][j] = 1;
  76. if (j==(i-1))
  77. m[i][j] = 1;
  78. }
  79. m[1][2] = 2;
  80. m[n][n-1] = 2;
  81. }
  82.  
  83. void interpolacja(const char* filename, int n, int mode)
  84. {
  85. dx = 2*xmax/(n-1);
  86. float** M = matrix(1,n, 1, n);
  87. fillMatrix(M, n);
  88.  
  89.  
  90. float* xw = vector(-3,n+3);
  91. float* yw = vector(1,n);
  92.  
  93. FILE* fp = fopen(filename, "w");
  94.  
  95.  
  96. int i,j ;
  97. for(i=-3;i<=(n+3);i++)
  98. xw[i]=-xmax+dx*(i-1);
  99.  
  100.  
  101. for(i=1;i<=n;i++) {
  102. if(mode == 0)
  103. yw[i]=f1(xw[i]);
  104. else
  105. yw[i]=f2(xw[i]);
  106. }
  107.  
  108.  
  109. double alfa, beta;
  110. if(mode == 0) {
  111. alfa = fp1(xmin);
  112. beta = fp1(xmax);
  113. } else {
  114. alfa = fp2(xmin);
  115. beta = fp2(xmax);
  116. }
  117.  
  118. float** W = matrix(1,n,1,1);
  119. for (i = 1; i<=n; ++i)
  120. W[i][1] = yw[i];
  121.  
  122. W[1][1] = yw[1] + dx*alfa/3;
  123. W[n][1] = yw[n] - dx*beta/3;
  124.  
  125. gaussj(M,n,W,1);
  126. float* C = vector(0, n+1);
  127. for (i=1; i<=n; ++i)
  128. C[i] = W[i][1];
  129.  
  130. C[0] = W[2][1] - (dx/3)*alfa;
  131. C[n+1] = (dx/3)*beta + C[n-1];
  132.  
  133. double k;
  134. for (k=xmin; k<=xmax; k+=delta){
  135. if(mode == 0)
  136. fprintf(fp, "%f %f %f\n", k, f1(k), s(k, C, n, xw));
  137. else
  138. fprintf(fp, "%f %f %f\n", k, f2(k), s(k, C, n, xw));
  139. }
  140.  
  141. }
  142.  
  143. int main(){
  144. interpolacja("f1_5.txt",5,0);
  145. interpolacja("f1_6.txt",6,0);
  146. interpolacja("f1_10.txt",10,0);
  147. interpolacja("f1_20.txt",20,0);
  148.  
  149. interpolacja("f2_6.txt",6,1);
  150. interpolacja("f2_7.txt",7,1);
  151. interpolacja("f2_14.txt",14,1);
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement