Witam. Mamy do wykonania następujące zadanie:
Funkcja
double trapez(double p, double q, double h)
{
Return h * (p + q)/2;
}
Oblicza pole trapezu o bokach p, q i wysokości h. Zastosować tą funkcję do obliczenia
pola powierzchni figury ograniczonej parabolą y = ax2
- bx +c oraz prostymi y = 0,
x = xp x = xk z zadaną dokładnością ε.
Dane: a, b, c – współczynniki paraboli
xp, xk ograniczenia przedziału wartości x
ε – dokładność obliczeń
Uwaga: Do obliczenia pola zastosować tzw. metodę trapezów (całkowania
numerycznego). Polega ona na obliczaniu sum trapezów powstających w wyniku
kolejnych podziałów przedziału <xp, xk> na 2, 4, 8, 16, … części. Procedurę kolejnych
podziałów zakończyć jeżeli sumy pól trapezów częściowych po n-tym kroku podziału
Fn i po kolejnym n+1 kroku Fn+1 spełniają zależność:
|Fn+1 – Fn|/|Fn| ≤ ε
Za wynik przyjąć wartość Fn+1\
Czy mógłby ktoś zweryfikować moją implementację (na zadanych powyżej warunkach) tej metody? Będę wdzięczny za pomoc.
#include <iostream>
#include <cmath> // abs
using namespace std;
float a, b, c;
double trapez(double p, double q, double h)
{
return h * (p + q)/2;
}
double func (float x)
{
return a*x*x + b*x + c;
}
int main()
{
int n = 2;
float xp, xk, e, dx;
double S = 0, S1 = 1;
cout << "Wprowadz wspolczynnik a: "; cin >> a;
cout << "Wprowadz wspolczynnik b: "; cin >> b;
cout << "Wprowadz wspolczynnik c: "; cin >> c;
cout << "Podaj xp: "; cin >> xp;
cout << "Podaj xk: "; cin >> xk;
cout << "Podaj dokladnosc e: "; cin >> e;
S1 = trapez (func(xp), func(xk), (xk - xp));
do
{
dx = (xk - xp)/n; // wysokość pojedynczego trapezu
S = S1;
S1 = 0;
for (int i = 0; i < n; i++) S1 += trapez (func(xp + i*dx), func(xp + (i + 1)*dx), dx); // sumowanie n - trapezów
n*=2;
} while ((abs(S1) - abs(S))/abs(S) > e); // warunek "dokladności"
cout << "\n\nPole S wynosi w przyblizeniu: " << abs(S1);
cin.ignore();
cin.get();
}