# integreer.py - vier regels voor een bepaalde integraal, getest op de integraal van e^x van 0 tot 1
import math


def links(f, a, b, n):
    h = (b - a) / n
    return h * sum(f(a + i * h) for i in range(n))


def midden(f, a, b, n):
    h = (b - a) / n
    return h * sum(f(a + (i + 0.5) * h) for i in range(n))


def trapezium(f, a, b, n):
    h = (b - a) / n
    return h * (f(a) / 2 + sum(f(a + i * h) for i in range(1, n)) + f(b) / 2)


def simpson(f, a, b, n):                    # n moet even zijn
    h = (b - a) / n
    binnen = sum((4 if i % 2 else 2) * f(a + i * h) for i in range(1, n))
    return h / 3 * (f(a) + binnen + f(b))


exact = math.e - 1
print("  n     links      midden     trapezium  Simpson")
for n in (2, 4, 8, 16, 32):
    fouten = [abs(r(math.exp, 0, 1, n) - exact) for r in (links, midden, trapezium, simpson)]
    print("%3d   " % n + "  ".join("%9.2e" % x for x in fouten))
