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. ]
Løsningsforslag
Hvis feks og , så er jo differansen 8. MEN vi skal ha med tallene fra og med -2 og til og med 6, så vi må legge til ett element, slik at
Prøv også å endre a og b, og se om koden alltid gir en heltallsarray
Her er løsningen:
1 2 3 4 5 6 7 8import numpy as np a = -2 b = 6 c = b - a + 1 x_array = np.linspace(a, b, c) print(x_array)
Å 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: , 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 , 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
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
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()
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()