#include
#include
using namespace std;
double metoda_prostokatow(double x)
{
return 1.8 * x * x * x + 3.1 * x * x - 8.5 * x + 4;
}
double metoda_trapezow(double x)
{
return 1.8 * x * x * x + 3.1 * x * x - 8.5 * x + 4;
}
double metoda_Simpsona(double x)
{
return 1.8 * x * x * x + 3.1 * x * x - 8.5 * x + 4;
}
int main()
{
const int N = 1000; //liczba punktów/prostokątów podziałowych
double xp,xk,s,dx,sT,sS,x;
int i,j,k;
cout << setprecision(3) // 3 cyfry po przecinku
<< fixed; // format stałoprzecinkowy
cout << "------------------------------------------------------\n";
cout << "Obliczanie calki oznaczonej za pomoca wybranych metod\n"
"------------------------------------------------------\n"
"1.8 * x * x * x + 3.1 * x * x - 8.5 * x + 4\n\n"
"Podaj poczatek przedzialu calkowania\n\n"
"xp = ";
cin >> xp;
cout << "\nPodaj koniec przedzialu calkowania\n\n"
"xk = ";
cin >> xk;
cout << endl;
sT = 0;
dx = (xk - xp) / N;
for(j = 1; j < N; j++) sT += metoda_prostokatow(xp + j * dx);
sT = (sT + (metoda_prostokatow(xp) + metoda_prostokatow(xk)) / 2) * dx;
cout << "Wartosc dokladna calki wynosi: " << setw(7) << sT
<< endl << endl;
cout << "Metoda prostokatow z niedomiarem: \n";
cout << "Metoda prostokatow z nadmiarem: \n";
s = 0;
dx = (xk - xp) / (const int)N;
for(i = 1; i < N; i++)
s += metoda_trapezow(xp + i * dx);
s *= dx;
cout << "\nMetoda trapezow: \n"; // Jest tu jakiś mały błąd, bo źle liczy
cout << "Wartosc dokladna calki wynosi: " << setw(7) << s
<< endl << endl;
s = 0; sS = 0;
dx = (xk - xp) / N;
for(k = 1; k <= N; k++)
{
x = xp + k * dx;
sS += metoda_Simpsona(x - dx / 2);
if(k < N)
s += metoda_Simpsona(x);
}
s = dx / 6 * (metoda_Simpsona(xp) + metoda_Simpsona(xk) + 2 * s + 4 * sS);
cout << "Metoda Simpsona: \n";
cout << "Wartosc calki wynosi: " << setw(7) << s
<< endl << endl;
system("pause");
return 0;
}