Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Funksjoner og plotting i Python

Av Sigurd Rage, Universitetet i Sørøst-Norge

ToDo

  • Lage flere oppgaver til hvert kodeeksempel

  • Dele opp denne siden pr tema, kan ha egen side om plotting feks?

  • Se litt på didaktiske vinkler

  • Utvide seksjonen om funksjoner til flere eksempler med forklaringer

  • Funksjoner og plotting kan kobles lettere til matematikk. Lage egen side om funksjoner

Arrayer

En array er en form for liste hvor alle elementene er av samme datatype. Et array kan være endimensjonalt, som en vanlig liste, men kan også ha flere dimensjoner. For eksempel vil en tabell kunne representeres ved hjelp av en 2-dimensjonal liste. Python har ikke denne datatypen innebygget, men slike finnes i mange standardbiblioteker vi kan benytte oss av. Et vanlig og bra bibliotek til matematikk heter numpy. Dette biblioteker inneholder også ferdigkompilerte rutiner skrevet i C som gjør at det kan gjøre beregninger med og behandle store datamengder på relativt kort tid.

Et array kan lages manuelt, og inneholde forskjellige datatyper akkurat som den innebygde typen liste i python. Men vi skal heller konsentrere oss om hvordan vi kan bruke disse til å lage funksjonstabeller og matematiske analyser

Funksjonen linspace lager en array hvor du kan bestemme start og sluttverdi, og hvor mange elementer du vil ha med i arrayet. Dette er nyttig når man for eksempel skal lage en tabell med x-verdier. Se på følgende eksempel.

import numpy as np

x_array = np.linspace(-2, 6, 9)
print(x_array)
[-2. -1.  0.  1.  2.  3.  4.  5.  6.]

I koden overfor har jeg bestilt 9 verdier (med hensikt!) fra -2 til 6, og fått tilbake heltallene -2, -1, 0, 1, 2, 3, 4, 5 og 6. Hvorfor gir 9 verdier meg eksakte heltall i listen?

Man kan lage slike linspaces (linear spaces) med så mange elementer du vil for bedre oppløsning under beregninger, plotting og så videre. Hvis jeg vil ha 50 x-verdier mellom -2 til 6 skriver jeg kommandoen som under. linspace()-funksjonen deler automatisk opp slik at jeg får 50 verdier jevt fordelt mellom -2 og 6.

import numpy as np

x_array = np.linspace(-2, 6, 50)
print(x_array)
[-2.         -1.83673469 -1.67346939 -1.51020408 -1.34693878 -1.18367347
 -1.02040816 -0.85714286 -0.69387755 -0.53061224 -0.36734694 -0.20408163
 -0.04081633  0.12244898  0.28571429  0.44897959  0.6122449   0.7755102
  0.93877551  1.10204082  1.26530612  1.42857143  1.59183673  1.75510204
  1.91836735  2.08163265  2.24489796  2.40816327  2.57142857  2.73469388
  2.89795918  3.06122449  3.2244898   3.3877551   3.55102041  3.71428571
  3.87755102  4.04081633  4.20408163  4.36734694  4.53061224  4.69387755
  4.85714286  5.02040816  5.18367347  5.34693878  5.51020408  5.67346939
  5.83673469  6.        ]

Å lage en verditabell for en matematisk funksjon

Hvis jeg nå vil gjøre beregninger på x-tabellen min og lage en y-tabell gjøres det superenkelt og superraskt ved hjelp av de vanlige regneartene i python. Hvis jeg vil ha en funksjonstabell over y-verdiene til funksjonen: f(x)=x24 f(x) = x^2 - 4 , så kan jeg ta utgangpunkt i løsningen over. Jeg vil undersøke funksjonsverdiene fra x = -3 til x = 4

import numpy as np

a = -3
b = 4
c = b - a + 1

x = np.linspace(a, b, c)
y = x**2 - 4

print("x-verdier:", x)
print("y-verdier:", f)
x-verdier: [-3. -2. -1.  0.  1.  2.  3.  4.]
y-verdier: [ 5.  0. -3. -4. -3.  0.  5. 12.]

Plotting

Enkelt plott av koordinatene i verditabellen

I forrige seksjon brukte vi print til å se på verdiene i listene og arrayene våre, og så på hvordan vi lager x- og y-tabeller for funksjoner. Det går selvfølgelig også an å plotte grafer fra disse tabellverdiene. Det finnes mange biblioteker som kan tilby dette, men vi skal konsentrere oss om funksjonen plot fra biblioteket matplotlib. Dette er et stort bibliotek med mange undergrupper – derfor skal vi ikke importere hele biblioteket, så legg merke til hvordan vi importerer her. (Mer om importmetoder lenger ned i dokumentet!)

For å lage et enkelt plot lager jeg en x og en y-tabell først, og sender disse som argumenter inn i plottefunksjonen. Her er også kode for å sette navn på aksene.

Vi kan ta utgangspunkt i eksempelet fra over, der vi lagde verditabell for funksjonen f(x)=x24f(x) = x^2-4, med verditabell med heltallene fra -3 til 4

import numpy as np
import matplotlib.pyplot as plt # bibliotek for å plotte grafer

a = -3
b = 4
c = b - a + 1

x = np.linspace(a, b, c)
y = x**2 - 4

# Plotter y mot x og setter på aksenavn
plt.xlabel("x-akse") # setter navn på x-aksen
plt.ylabel("y-akse") # setter navn på y-aksen
plt.axvline(x=0, color="black") # tegner x-aksen i svart
plt.axhline(y=0, color="black") # Tegner y-aksen i svart
plt.plot(x,y, "b.")  # plotter verditabellene x og y med blå prikker!
                     # i et koordinatsystem (skalerere automatisk!)
plt.show()           # viser plottet til skjerm
<Figure size 640x480 with 1 Axes>

Som dere ser over, ble resultatet ganske kantete. “plot()” funksjonen plotter kun inn punktene fra x- og y-tabellen. Datamaskinen kan faktisk egentlig ikke lage kontinuerlige grafer til oss, men hvis vi øker antallet verdier i verditabellen vår så kan vi nærme oss noe som ser kontinuerlig ut:

“Kontinuerlige” plots

I dette eksempelet vil jeg plotte grafen til funksjonen

f(x)=x33x2+2x2f(x)=-x^3-3x^2+2x-2

Fra x = -4 til x = 2

Nå som vi har blitt litt fortrolige med å lage x- og y-tabeller, og å plotte resultatene trenger jeg ikke lenger å begrense meg til heltallstabeller, og skriver inn start, slutt og antall elementer direkte i plottefunksjonen. Her har jeg valgt å lage verditabeller med 100 elementer, og plot()-funksjonen forbinder de 100 elementene slik at grafen ser tilnærmet kontinuerlig ut.

import matplotlib.pyplot as plt
import numpy as np

# Lager x-verditabell
x = np.linspace(-4, 2, 100)
y = -x**3-3*x**2+2*x-2

# Plotter y mot x og setter på aksenavn
plt.xlabel("x-akse")
plt.ylabel("y-akse")
plt.axvline(x=0, color="black") # tegner x-aksen i svart
plt.axhline(y=0, color="black") # Tegner y-aksen i svart
plt.plot(x,y)
plt.show()
<Figure size 640x480 with 1 Axes>

Siden plot()-funksjonen tegner linjestykker mellom de 100 punktene mine begynner dette nå å ligne på en kontinuerlig graf (men den er IKKE det, egentlig! Men, dess flere elementer du har i verditabellen din, dess mer nøyaktig blir plottet!

Funksjoner

Funksjoner i programmering er ikke det helt samme som funksjoner i matematikk, men de har noen likheter. I programmering er funksjoner ferdiglagede kodesnutter som skal brukes flere ganger. Du har allerede brukt mange forskjellige funksjoner i de kodesnuttene som er beskrevet over i dokumentet.

I turtle-biblioteket var det f.eks funksjonen forward(), left(), right() som fikk skilpadden til å bevege seg. Du har mange ganger brukt den innebyggede funksjonen print() for å skrive verdier til konsoll. Vi har også sett på matematiske funksjoner, som sin() og sqrt() og i forrige seksjon så vi på funksjonen plot() som kunne skrive ut grafer. Du kan også lage dine egne funksjoner i python. Funksjoner kan ta såkalt input (en eller flere) og den kan returnere output (en eller flere), men de må ikke. Dette kalles parameteroverføring, og vi sier at en funksjon tar ingen, en eller flere parameter inn. Variabler som er laget inni en funksjon er såkalt «lokale», dvs de eksisterer kun inne i funksjonen. Man kan heller ikke endre på variabler fra «utsiden» inne i funksjoner. Dette er fordi en funksjon ikke skal lage krøll på dine variabler eller variabler i andre funksjoner.

Nedenfor er det 3 eksempler på funksjoner. Legg merke til at vi gjenbruker a og b som variabler, det er helt ok siden de kun eksisterer inne i hver sin funksjon.

# Funksjonsdefinisjoner skal stå øverst i pythonkoden ( i det minste før den kalles og kjøres )

# en funksjon uten argumenter (parametere) hverken input eller output
def funksjonUten():
    print("Denne funksjonen skriver bare ut dette")
    
# en funksjon med 2 input og ingen output
def leggSammen(a,b):
    print("Svaret er:",a,"+",b,"=", a+b)
    
# en funksjon med 2 input og en output
def multipliser(a,b):
    svartekst = "Svaret er: "+str(a)+" * "+str(b)+" = "+str(a*b)
    return svartekst

# Legg merke til at ingenting skjer på skjermen før vi kommer ned hit.
# Vi har laget funksjonene, men vi har ikke brukt de enda!
# Kaller funksjonene:

# første funksjone er bare en sekvens
funksjonUten()

# den andre funksjonen tar forskjellige parameter inn, men skriver ut svaret fra inne i funksjonen
leggSammen(2,5)
leggSammen(-3,2)

# den tredje funksjonen returnerer svaret slik at vi kan spare den i vår egen variabel
svar = multipliser(3,4)
print(svar)
# eller bruke den direkte som input i en annen funksjon (snedig)
print(multipliser(-5,6))
Denne funksjonen skriver bare ut dette
Svaret er: 2 + 5 = 7
Svaret er: -3 + 2 = -1
Svaret er: 3 * 4 = 12
Svaret er: -5 * 6 = -30

Hvordan bruke funksjoner i matematisk sammenheng

import matplotlib.pyplot as plt
import numpy as np

# definerer funksjonene
def f(x):
    return x**2-4

def g(x):
    return -np.sin(x)

# Lager x-verditabell
x = np.linspace(-4, 4, 100)

# Plotter y mot x og setter på aksenavn
plt.xlabel("x-akse")
plt.ylabel("y-akse")
plt.axvline(x=0, color="black") # tegner x-aksen i svart
plt.axhline(y=0, color="black") # Tegner y-aksen i svart
# siden funksjonen returnerer y-tabell kan jeg bruke funksjonskallet direkte i plot()
plt.plot(x,f(x))
plt.plot(x,g(x))
plt.show()
<Figure size 640x480 with 1 Axes>