unvisibleman

Monte-Carlo integral calculator

Feb 28th, 2015
361
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.25 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #define EXPERIMENTS 100
  5. #define TEST 1000
  6.  
  7. /*
  8.  * Вычисление интеграла методом монте-карло
  9.  * Вариант №7. f(x) = abs(cos(6*x+4)/x) from 6 to 11
  10.  */
  11. float M = 0.162923; // максимальное значение функции на отрезке, при x = 6.13559
  12. float function(float x){return fabsf(cos(6*x+4)/x);}
  13.  
  14. void stage(float a, float b, float p, float(*f)(float) ){
  15.     int i, j;
  16.     float x, y;
  17.     float mn[EXPERIMENTS];
  18.     int k[EXPERIMENTS];
  19.     float integral=0;
  20.    
  21.     for(i=1; i<=EXPERIMENTS; i++){ // серии экспериментов
  22.         k[i]=0;
  23.         mn[i]=0;
  24.         for (j = 1; j<TEST; j++){ // испытания
  25.             float r1 = (rand()%100) / 100.0;
  26.             float r2 = (rand()%100) / 100.0;
  27.             x = a + (b-a)*r1;
  28.             y = M*r2;
  29.             if(y <= f(x))
  30.                 k[i]++;
  31.         }
  32.     }
  33.    
  34.     for(i=1; i<=EXPERIMENTS; i++){
  35.         mn[i]= k[i]/(float)TEST;
  36.         integral+=mn[i];
  37.     }
  38.     // среднее значчение за все эксперименты -- искомый интеграл
  39.     integral*=(b-a)*M/EXPERIMENTS;
  40.    
  41.     printf("Calculated int. %f\nReal int. %f\n", integral, p);
  42. }
  43.  
  44. int main(){
  45.     srand(time(NULL)); //let's be random
  46.     stage(6, 11, 0.394894, (*function));
  47.     return 0;
  48. }
Advertisement
Add Comment
Please, Sign In to add comment