#include <iostream>
#include <cmath>

// Implementiert die Trapezregel mit der Intervallanzahl n
// der unteren Integrationsgrenze a, der oberen Integrationsgrenze b
// und ueber die Funktion f
template <class Function>
double trapezregel(int n, double a, double b, Function f) {
    double h = (b-a)/n; // berechne intervalllaenge
    double accum = 0;
    for (int i = 1; i < n; i++) {
        accum += f(a + i*h); // fuehre die summe aus
    }
    return h/2 * (f(a) + 2*accum + f(b)); // wende formel an
}

// beispiel fuer funktor
class Wurzel {
    public:
        double operator()(double x) {
            return std::sqrt(x);
        }
};

int main() {
    Wurzel f;    
    // fuehre integration fuer verschiedene Intervallanzahlen n aus
    double integ10 = trapezregel(10, 0, 1.5, f);
    double integ100 = trapezregel(100, 0, 1.5, f);
    double integ1000 = trapezregel(1000, 0, 1.5, f);
    std::cout << "Integral ueber sqrt(x) von 0 bis 1.5" << std::endl;
    std::cout << "n = 10: " << integ10 << std::endl;
    std::cout << "n = 100: " << integ100 << std::endl;
    std::cout << "n = 1000: " << integ1000 << std::endl;
}
