Riemann-sum og numerisk integrasjon

Hvis man skal finne arealet under en kurve, kan man dele arealet under kurven opp i mange små rektangler, og regne ut summen av arealet til rektanglene for å approksimere arealet under kurven. En slik approksimasjon, der man summerer arealet til mange små rektangler, kalles en Riemann-sum.

Partisjon og delintervall

Før vi starter med Riemann-summer må vi introdusere begrepene partisjon og delintervall. Det å partisjonere et intervall \([a, b]\), vil si at vi velger ut en rekke verdier \( P = \{x_0, x_1, …, x_n\}\) slik at \(a = x_0 < x_1 < … < x_n = b \).

Partisjonen \(P\) deler opp intervallet \([a,b]\) i \(n\) delintervaller

\([x_0, x_1], [x_1, x_2], …, [x_{n-1}, x_n] \)

Der lengden på delintervall nummer \(i\) er

\(\Delta x_i = x_i – x_{i-1} \)

Dersom det er like stort mellomrom mellom hver verdi i partisjonen, som vil si at alle delintervallene er like lange, sier vi at partisjonen er uniform. Når vi regner ut Riemann-summer vil vi som regel bruke en uniform partisjon.

For eksempel er {0, 1, 2, 3, 4, 5} en uniform partisjon av intervallet \([0,5]\). Denne partisjonen har 5 delintervaller

\([0,1], [1,2], [2,3], [3,4], [4,5]\)

Og lengden av hvert intervall er \(\Delta x = 1\).

For å lage en uniform partisjon av et intervall \([a, b]\) med \(n\) elementer må man først regne ut forskjellen mellom elementene. Den er gitt ved \(\Delta x = \frac{b-a}{n-1}\). Deretter kan man lage partisjonen slik:

\(P = \{a, a+\Delta x, a+2\Delta x, … , a+(n-1)\Delta x, b\} \)

Høyre, venstre og midtre Riemann-sum

La oss si at vi ønsker å finne arealet under en funksjon \(f(x)\) på intervallet \([a,b]\). La oss først starte med å lage en uniform partisjon av intervallet \( P = \{x_0, x_1, …, x_n\}\). Denne partisjonen deler intervallet \([a,b]\) opp i \(n\) delintervaller gitt ved \([x_0, x_1], [x_1, x_2], …, [x_{n-1}, x_n] \).

Vi kan nå lage et rektangel for hvert delintervall, der hvert rektangel har en høyde slik at øverste venstre hjørne av rektangelet ligger på funksjonen \(f(x)\):

*Det fungerte ikke å laste opp bilde*

Som du kan se ut ifra figuren, vil arealet til rektangel nummer \(5\) være gitt ved:

\(A_5 = f(x_4)\Delta x\)

Generellt vil arealet til rektangel nummer \(i\) være gitt ved:

\(A_i = f(x_{i-1})\Delta x\)

For å finne en approksimasjon av det totale arealet under grafen, må vi summere sammen arealet av alle rektanglene:

\(A = \sum_{i=1}^{n}A_i = \sum_{i=1}^{n} f(x_{i-1}\Delta x\)

Det vi nå har, er et utrykk for den venstre Riemann-summen til funksjonen på intervallet \([a,b]\) gitt partisjonen \(P\). Grunnen til at vi kaller det den venstre Riemann-summen, er at vi valgte at hvert rektangel skal være nær grafen med øverste venstre hjørne. Vi kan også velge at hvert rektangel skal være nær grafen med øverste høyre hjørne, for å finne den høyre Riemann-summen. Da blir rektanglene seende slik ut:

*lat som det er et bilde til her*

Høyden av rektanglene er nå gitt ved funksjonsverdien i slutten av delintervallene, som gjør at arealet til rektangel nummer \(i\) blir gitt ved:

\(A_i = f(x_i) \Delta x\)

Som gjør at vi får følgende utrykk når vi summerer sammen arealet til alle rektanglene:

\(A = \sum_{i=1}^{n} f(x_{i}\Delta x\)

Det er også mulig å velge høyden på rektanglene slik at de er nær grafen på midten av delintervallet. Dette kalles midtre Riemann-sum, og man får dette utrykket for arealet:

\( A = \sum_{i=1}^{n} f(x_{i}-\frac{\Delta x}{2})\Delta x \)

Det finnes også en øvre og nedre riemann-sum. Disse brukes ikke så mye i praksis, men de gir grunnlaget for definisjonen av integralet. Du kan lese mer om dette her: https://wiki.math.ntnu.no/tma4100/tema/integration?&#riemannintegralet

Sammenhengen mellom Riemann-sum og integral

Generelt blir approksimasjonen man får ved å regne ut Riemann-summen bedre desto flere rektangler man deler opp arealet under grafen i. Dersom man deler opp arealet under en graf i uendelig mange uendelig tynne rektangler, vil verdien man får ved å summere arealet av rektanglene være eksakt lik arealet under grafen. Dette kan utrykkes matematisk slik:

\( \lim_{n \to \infty} \sum_{i=1}^{n} f(x_i) \Delta x =\int_{a}^{b} f(x) \,dx \)

Det vil si at alt man kan skrive på formen

\( \lim_{n \to \infty} \sum_{i=1}^{n} f(x_i) \Delta x_i \)

Der \(x_i\) er en partisjon av intervallet \([a,b]\) med \(n\) elementer, kan regnes ut med integrasjon!

Numerisk integrasjon

Mange funksjoner er umulig eller helt sykt vanskelige å integrere analytisk. La oss for eksempel ta for oss integralet:

\( \int_{0}^{1} e^{-x^2} \,dx\)

Dette kan ikke løses analytisk. Heldigvis har vi datamaskiner, som gjør at vi kan løse det numerisk. Når man løser integraler numerisk, kan man bruke riemann-summer.

Kopier 
import numpy as np

n = 1001   #Antall elementer i partisjonen
a = 0      #Starten av intervallet vi vil integrere over
b = 1      #Slutten av intervallet vi vil integrere over
deltaX = (b-a)/(n-1)  #Lengden av delintervallene

def f(x):
    return np.e**(-x**2)  #Funksjonen vi vil integrere

x = np.linspace(a, b, n)  #Uniform partisjon av intervallet

venstre_sum = 0
høyre_sum = 0
midtre_sum = 0

for i in range(1, n):
    venstre_sum += f(x[i-1])*deltaX
    høyre_sum += f(x[i])*deltaX
    midtre_sum += f(x[i]+deltaX/2)*deltaX
    
print(f"Venstre sum = {venstre_sum} \nHøyre sum = {høyre_sum} \nMidtre sum = {midtre_sum}")
Numerisk integrasjon med venstre, høyre og midtre Riemann-sum

I koden over har vi først definert variabler for hvor mange elementer vi skal ha i partisjonen av intervallet, starten og slutten på intervallet og lengden av hvert delintervall. Vi har også lagd en funksjon for \(f(x)\). Deretter bruker vi «np.linspace» til å lage en uniform partisjon av intervallet mellom \(a\) og \(b\) med \(n\) antall elementer. Til slutt bruker vi en for-løkke til å regne ut summene for venstre, høyre og midtre Riemann-sum, og printer ut resultatene.

Trapesmetoden

Så langt har vi approksimert arealet under en funksjon ved å dele det opp i mange små rektangler, men man kan få en mer nøyaktig approksimasjon dersom man deler det opp i trapeser istedenfor. Det er dette man gjør i trapesmetoden.

*Her skal det være en illustrasjon men det gikk ikke å laste opp bilder*

Som du kan se ut ifra figuren, vil arealet til trapes nummer \(5\) være gitt ved:

\(A_5 = \frac{f(x_4)+f(x_5)}{2} \)

Arealet til trapes nummer \(n\) kan utrykkes slik:

\(A_i= \frac{f(x_{i-1}) + f(x_i)}{2}\)

Ved å summere sammen arealet av alle trapesene kommer vi frem til et utrykk for det totale arealet:

\(A = \sum_{i=1}^{n}A_i = \sum_{i=1}^{n} \frac{f(x_{i-1}) + f(x_i)}{2}\)

Man kan kode trapes-metoden slik:

Kopier 
import numpy as np

n = 1001   #Antall elementer i partisjonen
a = 0      #Starten av intervallet vi vil integrere over
b = 1      #Slutten av intervallet vi vil integrere over
deltaX = (b-a)/(n-1)  #Lengden av delintervallene

def f(x):
    return np.e**(-x**2)  #Funksjonen vi vil integrere

x = np.linspace(a, b, n)  #Uniform partisjon av intervallet

sum = 0

for i in range(1, n):
    sum += (f(x[i-1]) + f(x[i]))/2
    
print(f"Sum = {sum}")
Numerisk integrasjon med trapesmetoden