Je weet dat je \(\int_a^b f(x) \, dx\) kunt benaderen door een riemannsom te berekenen. Concreet verdeel je het interval \([a, b]\) in \(n\) gelijke deelintervalletjes met breedte \(\Delta x\). Je benadert \(f(x)\) in elk deelintervalletje door een functie van de nulde graad. De bepaalde integraal wordt dan benaderd door de som van oppervlaktes van rechthoeken.
De trapeziumregel is een verfijning ten opzichte van deze riemannsom. Ook hier verdeel je het interval \([a, b]\) in \(n\) gelijke deelintervalletjes met breedte \(\Delta x\), maar we benaderen \(f(x)\) in elk deelinterval door een functie van de eerste graad. De bepaalde integraal wordt dan benaderd door de som van oppervlaktes van trapeziums.
Een verdere verfijning ligt voor de hand. Door drie niet-collineaire punten gaat immers één unieke parabool. We zouden \(f(x)\) dus kunnen benaderen door een functie van de tweede graad. We vinden drie opeenvolgende punten door telkens twee opeenvolgende deelintervalletjes samen te beschouwen. Deze methode vereist dus dat \(n\), het aantal deelintervalletjes, een even getal moet zijn.

In de 18de eeuw bewees de Britse wiskundige Thomas Simpson dat
\[\int_a^b f(x) \, dx \approx \frac{\Delta x}{3} \cdot \left( f(x_0) + 4f(x_1) + 2f(x_2) + 4f(x_3) + 2f(x_4) + \ldots + 4f(x_{n-1}) + f(x_n)\right).\]We noemen deze methode dan ook de regel van Simpson. Hierbij zijn \(x_0 = a\) en \(x_n=b\).
Delta_x(a, b, n) die de breedte \(\Delta x\) van elk deelinterval berekent wanneer je \([a, b]\) verdeelt in \(n\) gelijke deelintervallen.x_i(a, i, Delta_x) die de ondergrens van het \(i\)-de deelinterval \([x_i, x_{i+1}]\) teruggeeft.controleer_n(n) die True teruggeeft als \(n\) een strikt positief even getal is, en anders False.Schrijf een functie simpsonregel(f, a, b, n). Hierbij is f een wiskundige functie. a en b zijn respectievelijk de onder- en bovengrenzen van de bepaalde integraal. n is het aantal deelintervalletjes waarin we \([a, b]\) onderverdelen. Je functie geeft bovenstaande benadering voor \(\int_a^b f(x) \, dx\) terug als n strikt positief en even is, en Geef een geldige waarde van n. als dat niet het geval is.
Uiteraard steun je in deze definitie zo veel mogelijk op de functies die je in 1, 2 en 3 al gedefinieerd hebt.
Zoals steeds in dit soort opgaves mag er in de code die je door Dodona laat evalueren geen hoofdprogramma staan. Je code bestaat dus uit vier functiedefinities, en niet meer dan dat. Een eventueel hoofdprogramma dat je gebruikt hebt om je code te testen, moet je bij de evaluatie dus in commentaar zetten, of zelfs gewoon verwijderen.
Invoer:
> Delta_x(0, 1, 1000)
Uitvoer:
0.001
Invoer:
> x_i(0, 50, 0.001)
Uitvoer:
0.05
Invoer:
> controleer_n(1)
Uitvoer:
False
Invoer:
> simpsonregel(lambda x: x**2, 0, 3, 100)
Uitvoer:
9.0
Invoer:
> simpsonregel(lambda x, math=__import__('math'): math.exp(x), 0, 1, 10)
Uitvoer:
1.7182827819248236
Invoer:
> simpsonregel(lambda x: x**2, 0, 3, 101)
Uitvoer:
Geef een geldige waarde van n.