Hopp til innhold
Fagartikkel

Eksponentialfunksjonen som modell. Regresjon

Eksponentialfunksjoner brukes ofte som modeller for vekst.

Eksponentialfunksjonen som modell

Antall ørret i et vann har økt kraftig etter at det i 1998 ble satt i gang med kalking av vannet. Tabellen viser antall ørret i vannet noen år etter 1998.

Ørretbestand

Årstall

1998

2000

2002

2004

Antall år etter 1998, x

0

2

4

6

Antall ørret i tusen, N

4,0

6,7

10,9

17,4

Tabellen viser at ørretbestanden øker mer og mer. Vi vil finne en modell for utviklingen av ørretbestanden.

Regresjon med GeoGebra

Vi legger dataene fra tabellen inn i regnearket i GeoGebra. Så merker vi cellene og klikker på knappen for regresjonsanalyse.

Punktene viser at vi må finne en funksjon som vokser raskere og raskere ettersom x-verdiene øker, noe vi også ser direkte av tabellen. Derfor kan en eksponentiell modell passe godt med de observerte verdiene.

Ved å velge "Eksponentiell 2" som regresjonsmodell får vi tallet e som grunntall i potensen.

Vi får funksjonen N gitt ved

Nx=4,05e0,24x

som modell for utviklingen av ørretbestanden.

For å få grafen og punktene over i det vanlige grafikkfeltet kopierer vi den over ved å trykke på knappen til høyre for innstillingshjulet, og vi velger "Kopier til grafikkfeltet".

Av grafene kan vi for eksempel se at ut fra denne modellen vil ørretbestanden ha passert 46 000 individer i 2008 og 76 000 individer i 2010.

Regresjon med Python

Regresjon med Python kan gjøres på flere måter. Her har vi valgt å bruke metoden curve_fit fra scipy.optimize selv om den gir oss mer data enn vi skal bruke her.

Metoden er basert på at vi angir i koden hva slags type funksjon som skal brukes i den matematiske modellen. Dette gjøres ved å definere modellen som en egendefinert pythonfunksjon i koden. I vårt tilfelle ønsker vi å tilpasse målingene til en eksponentialfunksjon av typen fx=a·ebx. Starten på programmet kan se slik ut:

python
1        # importerer nødvendige bibliotek
2from scipy.optimize import curve_fit
3import numpy as np
4import matplotlib.pyplot as plt
5
6        # lager funksjonen som beskriver modellen
7def modell(x,a,b):
8  return a*np.e**(b*x)

Parametrene til pythonfunksjonen modell er først den frie variabelen x, deretter konstantene som skal brukes i modellfunksjonen, a og b. Funksjonen modell brukes av metoden curve_fit sammen med ei liste med x-verdiene og ei liste med y-verdiene i målingene. curve_fit gir tilbake to lister. Den ene inneholder de to konstantene a og b (i vårt tilfelle) som gjør at den matematiske funksjonen vi definerte i pythonfunksjonen modell, passer mest mulig med måledataene. Den andre lista inneholder de såkalte kovariansene, som vi ikke skal bruke her.

Koden kan videre se slik ut:

python
1        # legger inn måledataene i lister
2x_verdier = [0,2,4,6]
3y_verdier = [4,6.7,10.9,17.4]
4
5        # bruker metoden curve_fit og legger resultatene i to lister
6konstanter,kovarians = curve_fit(modell,x_verdier,y_verdier)
7
8        # henter ut konstantene fra lista konstanter
9a, b = konstanter
10
11        # lager utskrift av funksjonen
12print(f"Funksjonen blir f(x) = {a:.3f}e^({b:.3f}x).")
13
14        # plotter data
15plt.plot(x_verdier,y_verdier,'o', label = "Målinger")
16
17        # plotter modell
18x_array = np.linspace(min(x_verdier),max(x_verdier),300)
19y_array = modell(x_array,a,b)
20plt.plot(x_array,y_array,"brown", label = "Modell")
21plt.legend(bbox_to_anchor=(0.6,1))
22plt.xlabel("$x$, antall år etter 1998") # tittel på x-aksen
23plt.ylabel("$y$, antall tusen ørret")
24plt.show()
Kommentarer til koden i den andre kodeblokka

I linje 9 bruker vi éi linje på å legge verdiene fra lista konstanter over til de to variablene.

Lista kovarians bruker vi ikke i programmet. Vi har vurdert dette med kovarians til å være utenfor det som kreves i faget. Kovariansen sier noe om hvor godt dataene passer til modellen.

I linje 15 bruker vi en o i plot-kommandoen for at grafen skal bli punkter og ikke en sammenhengende graf. Vi kunne også ha brukt kommandoen scatter i stedet for plot her.

Du trenger kanskje ikke kommandoen plt.show() til slutt for å få se plottet.

Kjøring av koden gir følgende utskrift:

"Funksjonen blir f(x) = 4.126e^(0.240x)."

Vi får nesten den samme modellfunksjonen som med GeoGebra. Årsaken til at det ikke blir likt, kan være at ulike programmer kan bruke litt ulike måter å regne seg fram til resultatet på.

Videre utvikling av ørretbestanden

Etter modellen vil ørretbestanden fortsette å vokse raskere og raskere. Er det slik det vil utvikle seg videre?

Registreringen av ørretbestanden fortsatte hvert andre år etter 2004. Resultatene ser du i tabellen nedenfor.

Ørretbestand

Årstall

1998

2000

2002

2004

2006

2008

2010

Antall år etter 1998, x

0

2

4

6

8

10

12

Antall ørret i tusen, N

4,0

6,7

10,9

17,4

21,5

24,5

26,0

I koordinatsystemet nedenfor ser du grafen til N sammen med de registrerte verdiene i 2006, 2008 og 2010 (merket av som grønne punkter).

Det viser seg altså at modellen ikke var egnet til å si noe om utviklingen i perioden etter 2004.

Eksponentialfunksjoner passer ofte godt til å beskrive hvordan populasjoner endrer seg i et begrenset tidsrom mens det er rik tilgang på mat og lite eller ingenting som begrenser veksten.

Etter hvert blir utviklingen annerledes. Når populasjonen blir stor nok, bremses veksten fordi det for eksempel blir for lite mat.

teorisiden "Logistisk vekst" ser vi på en matematisk modell som passer bedre til utviklingen i ørretbestanden.