Advertisement
andrzejcioska

Całkowanie numeryczne

Oct 21st, 2017
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.22 KB | None | 0 0
  1. #include <iostream>
  2. #include <ctime>
  3. #include <cmath>
  4. #include <cstdlib>
  5.  
  6. using namespace std;
  7. double z;
  8. double f1(double), f2(double), f3(double), f4(double);
  9. typedef double(*funct)(double);
  10. void prostokat(funct, double, double);
  11. void trapez(funct, double, double);
  12. void monte(funct, double, double);
  13. int main(int argc, char** argv) {
  14.  
  15.     double pi=M_PI;
  16.  
  17.     cout<<"1) f(x)=sinx dla x=<0, pi>: \n\na) Metoda prostokatow (usredniona): ";
  18.     prostokat(f1, 0, pi);
  19.     cout<<"\nb) Metoda trapezow: ";
  20.     trapez(f1, 0, pi);
  21.     cout<<"\nc) Metoda Monte Carlo: ";
  22.     monte(f1, 0, pi);
  23.  
  24.     cout<<"\n\n\n2) f(x)=1/(x^2+1)  dla x=<0, 1>: \n\na) Metoda prostokatow (usredniona): ";
  25.     prostokat(f2, 0, 1);
  26.     cout<<"\nb) Metoda trapezow: ";
  27.     trapez(f2, 0, 1);
  28.     cout<<"\nc) Metoda Monte Carlo: ";
  29.     monte(f2, 0, 1);
  30.  
  31.     cout<<"\n\n\n3) f(x)=sqrt(2x)   dla x=<0, 8>: \n\na) Metoda prostokatow (usredniona): ";
  32.     prostokat(f3, 0, 8);
  33.     cout<<"\nb) Metoda trapezow: ";
  34.     trapez(f3, 0, 8);
  35.     cout<<"\nc) Metoda Monte Carlo: ";
  36.     monte(f3, 0, 8);
  37.  
  38.     cout<<"\n\n\n4) f(x)=x*sin4x    dla x=<0, pi/4>: \n\na) Metoda prostokatow (usredniona): ";
  39.     prostokat(f4, 0, pi/4);
  40.     cout<<"\nb) Metoda trapezow: ";
  41.     trapez(f4, 0, pi/4);
  42.     cout<<"\nc) Metoda Monte Carlo: ";
  43.     monte(f4, 0, pi/4);
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.     return 0;
  57. }
  58. double f1(double x) {
  59.     return sin(x);
  60. }
  61. double f2(double x) {
  62.     double a=pow(x,2);
  63.     return 1.0/(a+1);
  64. }
  65. double f3(double x) {
  66.     return sqrt(2*x);
  67. }
  68. double f4(double x) {
  69.     return x*sin(4*x);
  70. }
  71. void prostokat(funct f, double prze, double dzial) {
  72.     double x=(dzial-prze)*1.0/1000000;
  73.     double a=prze;
  74.     double b=a+x;
  75.     double p1, p2, wynik;
  76.     while(b<=dzial) {
  77.         p1+=fabs(f(b))*x;
  78.         p2+=fabs(f(a))*x;
  79.         wynik+=((p1+p2)*1.0/2);
  80.         a+=x;
  81.         b+=x;
  82.     }
  83.     cout<<wynik;
  84. }
  85. void trapez(funct f, double prze, double dzial) {
  86.     double x=(dzial-prze)/1000000;
  87.     double a=prze, b=a+x, p, c;
  88.     while(b<=dzial) {
  89.         c=(fabs(f(a))+fabs(f(b)));
  90.         p+=c*x*(1.0/2);
  91.         a+=x;
  92.         b+=x;
  93.     }
  94.     cout<<p;
  95. }
  96. void monte(funct f, double prze, double dzial) {
  97.     void (srand(time(NULL)));
  98.     double a, x, wart;
  99.     for(int i=0; i<10000000; i++) {
  100.         a=(rand()*1.0)/RAND_MAX;
  101.         x=a*(dzial-prze)+prze;
  102.         wart+=fabs(f(x));
  103.     }
  104.     cout<<((wart*1.0)/10000000)*(dzial-prze);
  105.  
  106.  
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement