Facebook
From KarboN, 3 Years ago, written in Plain Text.
This paste is a reply to całki from KarboN - view diff
Embed
Download Paste or View Raw
Hits: 188
  1. #include <iomanip>
  2. #include <iostream>
  3. #include <cstdlib>
  4.  
  5. using namespace std;
  6.  
  7.  
  8. double metoda_prostokatow(double x)
  9. {
  10.   return 1.8 * x * x * x + 3.1 * x * x - 8.5 * x + 4;
  11. }
  12.  
  13. double metoda_trapezow(double x)
  14. {
  15.   return 1.8 * x * x * x + 3.1 * x * x - 8.5 * x + 4;
  16. }
  17.  
  18. double metoda_Simpsona(double x)
  19. {
  20.   return 1.8 * x * x * x + 3.1 * x * x - 8.5 * x + 4;
  21. }
  22.  
  23.  
  24. int main()
  25. {
  26.   const int N = 1000; //liczba punktów/prostokątów podziałowych
  27.   double xp,xk,s,dx,sT,sS,x;
  28.   int i,j,k;
  29.  
  30.   cout << setprecision(3)      // 3 cyfry po przecinku
  31.        << fixed;               // format stałoprzecinkowy
  32.  
  33.   cout << "------------------------------------------------------\n";
  34.   cout << "Obliczanie calki oznaczonej za pomoca wybranych metod\n"
  35.           "------------------------------------------------------\n"
  36.           "1.8 * x * x * x + 3.1 * x * x - 8.5 * x + 4\n\n"
  37.           "Podaj poczatek przedzialu calkowania\n\n"
  38.           "xp = ";
  39.   cin >> xp;
  40.   cout << "\nPodaj koniec przedzialu calkowania\n\n"
  41.           "xk = ";
  42.   cin >> xk;
  43.   cout << endl;
  44.  
  45.   sT = 0;
  46.   dx = (xk - xp) / N;
  47.   for(j = 1; j < N; j++) sT += metoda_prostokatow(xp + j * dx);
  48.   sT = (sT + (metoda_prostokatow(xp) + metoda_prostokatow(xk)) / 2) * dx;
  49.  
  50.   cout << "Wartosc dokladna calki wynosi: " << setw(7) << sT
  51.        << endl << endl;
  52.  
  53.   cout << "Metoda prostokatow z niedomiarem: \n"; //
  54.  
  55.   cout << "Metoda prostokatow z nadmiarem: \n"; //
  56.  
  57.   s = 0;
  58.   dx = (xk - xp) / (const int)N;
  59.   for(i = 1; i < N; i++)
  60.     s += metoda_trapezow(xp + i * dx);
  61.   s *= dx;
  62.   cout << "\nMetoda trapezow: \n"; // Jest tu jakiś mały błąd, bo źle liczy
  63.   cout << "Wartosc dokladna calki wynosi: " << setw(7) << s
  64.   << endl << endl;
  65.  
  66.   s = 0; sS = 0;
  67.   dx = (xk - xp) / N;
  68.   for(k = 1; k <= N; k++)
  69.   {
  70.     x = xp + k * dx;
  71.     sS += metoda_Simpsona(x - dx / 2);
  72.     if(k < N)
  73.         s += metoda_Simpsona(x);
  74.   }
  75.   s = dx / 6 * (metoda_Simpsona(xp) + metoda_Simpsona(xk) + 2 * s + 4 * sS);
  76.   cout << "Metoda Simpsona: \n";
  77.   cout << "Wartosc calki wynosi: " << setw(7) << s
  78.        << endl << endl;
  79.  
  80.  
  81.   system("pause");
  82.   return 0;
  83. }