Standard Python inneheld mellom anna funksjonane print() og len(), men vi kan lage våre eigne funksjonar òg. Kvifor ikkje lage oss ein matematisk funksjon?
Vi tenker oss no ei bedrift som har ein funksjon som modell for kostnadene K i kroner ved å produsere x einingar av ei vare lik
Sidan prisen på ei eining er 45 kroner, blir inntektsfunksjonen
Oppgåve – rekning
Finn ein funksjon O for overskotet ut frå dei to funksjonane over.
Løysingsforslag
Overskotet finn vi ved å trekke kostnadene frå inntekta.
Vi går no ut frå at bedrifta produserer 60 einingar per dag. Dei vurderer å auke produksjonen til 100 einingar per dag, og dei lurer på kor mykje overskotet endrar seg. Oppdraget vårt blir å lage eit program som kan rekne ut forskjellen i overskot ved to ulike tal på produserte einingar.
Programmet må rekne ut kva overskotet er når det blir produsert 100 einingar, og trekke frå overskotet når det blir produsert 60 einingar. Så må svaret skrivast til skjermen.
🤔 Tenk over: Korleis skriv vi reknestykket over matematisk ved hjelp av funksjonen O?
Forklaring
Oppgåve – algoritme
Over har vi beskrive kva programmet skal gjere. Skriv ein litt meir detaljert algoritme til eit slikt program der du bruker variablar for den noverande og for den nye produksjonsmengda. Hugs å få med gode, forklarande tekstar.
Forslag til algoritme
Set variabelen x_gml lik 60.
Set variabelen x_ny lik 100.
Rekn ut overskotet med talet i variabelen x_gml ved hjelp av funksjonsuttrykket til O, og set det lik variabelen O_gml.
Rekn ut overskotet med talet i variabelen x_ny ved hjelp av funksjonsuttrykket til O, og set det lik variabelen O_ny.
Skriv til skjermen: "Endringa i overskotet ved å endre produksjonen frå <x_gml> til <x_ny> einingar er <O_ny - O_gml> kroner."
I siste punkt betyr vinkelparentesane at vi skal ha verdien av variablane.
Oppgåve – koding
Skriv koden til programmet etter algoritmen over i ein programeditor for Python. Kontroller at programmet reknar rett ved til dømes å skrive funksjonen inn i GeoGebra og rekne ut .
LøysingsforslagPython
1x_gml =602x_ny =1003O_gml =-0.25*x_gml**2+45*x_gml -5004O_ny =-0.25*x_ny**2+45*x_ny -5005print(f"Endringa i overskotet ved å endre produksjonen"6f" frå {x_gml} til {x_ny} einingar er {O_ny - O_gml:.2f} kroner.")
Programmet gir følgande utskrift: "Endringa i overskotet ved å endre produksjonen frå 60 til 100 einingar er 200.00 kroner."
I utrekningane i linje 3 og 4 har vi brukt den matematiske funksjonen O for overskotet som vi kom fram til lenger opp på sida. Innhaldet i linjene er vanskeleg å lese. Tenk om vi kunne ha brukt skrivemåten frå matematikken her! Matematisk skriv vi
for å finne endringa i overskotet ved å endre produksjonen frå 60 einingar til 100. Dette kan kan vi heldigvis gjere i Python òg. Vi kan fjerne linje 3 og 4, og i linje 6 kan vi erstatte O_ny - O_gml med
O(x_ny) - O(x_gml)
For å kunne gjere det må vi lage oss funksjonen O, og korleis gjer vi det i Python? Jo, vi kan definere funksjonen med kodeordet def. Funksjonen O blir med dette ein såkalla eigendefinert funksjon. Det betyr at vi øvst i programmet vårt skriv følgande:
Python
1defO(x):2return-0.25*x**2+45*x -500
Desse to kodelinjene blir ikkje utførte i første omgang når vi køyrer programmet fordi dei utgjer ein definisjon. Kodelinjene blir ikkje utførte før vi kallar på den eigendefinerte funksjonen O første gong ved å skrive O(x_ny) i koden nedanfor funksjonsdefinisjonen. Då skjer følgande:
Programmet vil leite opp definisjonen av funksjonen O.
Programmet erstattar x i definisjonen med innhaldet av variabelen x_ny.
Vi får rekna ut overskotet ved denne produksjonsmengda.
Oppgåve – koding
Endre på programmet ved å definere funksjonen O, fjerne variablane O_gml og O_ny og i staden kalle på funksjonen O. Kontroller at programmet fungerer som før.
LøysingsforslagPython
1defO(x):2return-0.25*x**2+45*x -50034x_gml =605x_ny =1006print(f"Endringa i overskotet ved å endre produksjonen"7f" frå {x_gml} til {x_ny} einingar er {O(x_ny)- O(x_gml):.2f} kroner.")
Koden gir same utskrift som før.
b) Kva endringar blir det i algoritmen til programmet når vi bruker den eigendefinerte funksjonen O i staden for å rekne ut overskotsendringa direkte?
Løysingsforslag
Algoritmen til programmet blir kortare:
Set variabelen x_gml lik 60.
Set variabelen x_ny lik 100.
Skriv til skjermen: "Endringa i overskotet ved å endre produksjonen frå <x_gml> til <x_ny> einingar er <O(x_ny) - O(x_gml)> kroner."
Sjølve funksjonsdefinisjonen er ikkje ein del av algoritmen til programmet sidan det berre er ein definisjon. Funksjonen O(x) har sin eigen algoritme:
Rekn ut følgande:
Returner svaret.
Spørsmål – vurdering
Kvifor er det lurt å endre programkoden ved å lage ein eigendefinert funksjon?
Svar
Den viktigaste årsaka er at vi får ryddigare og kortare programkode (sjølv om koden ikkje vart kortare her). Dette blir viktigare og viktigare jo større programmet blir.
Ei anna viktig årsak er gjenbruk av kode. Kanskje skal den funksjonen du definerer i eitt program brukast i eit anna program? Då er det berre å kopiere og lime inn heile funksjonsdefinisjonen inn i det andre programmet. Å definere eigne funksjonar gjer det mykje lettare å utveksle kode med andre. I Python finst det mange programbibliotek med eigendefinerte funksjonar som vi kan laste ned og bruke.
Kodelinjene her er definisjonar og blir ikkje utførte før det blir skrive funksjonsnamn(verdi1, verdi2, ...) i den eigentlege programkoden nedanfor funksjonsdefinisjonen. Hugs kolon på slutten av linja som byrjar med "def", og legg merke til at kodelinjene til ein funksjon skal rykkast inn.
Døme:
Vi skal bruke den matematiske funksjonen i eit program som skal rekne ut funksjonsverdiar. Då skriv vi
def f(x): return 3*x - 2
øvst i programkoden. Kodeordet return bruker vi for å få tilbake noko frå funksjonen. Dersom vi i koden til programmet skriv
verdi = f(1)
vil funksjonen rekne ut og setje det lik variabelen verdi.
I dømet skal funksjonen f berre ha éin verdi inn (x), men vi kan lage funksjonar som skal ha inn fleire verdiar, som det generelle dømet over viser.
Bedrifta ønsker å få testa kor stort overskotet er ved fleire ulike produksjonsmengder: 40, 80, 120, 160, 200 og 240.
Skriv ein algoritme for eit slikt program. Bruk den eigendefinerte funksjonen O frå over.
Forslag til algoritme
Her kan vi utnytte at produksjonsmengda aukar med 40 frå eitt nivå til neste.
Set variabelen x lik 0.
Gjenta 6 gonger:
Auk x med 40.
Skriv til skjermen: "Overskotet ved <x> produserte einingar er <O(x)> kroner."
I tillegg må vi ha algoritmen for funksjonen O som før.
b) Koding
Skriv ein kode som passar til algoritmen ovanfor.
Løysingsforslag
Det er fleire måtar å løyse dette på. Her vel vi å bruke ei for-lykkje.
Python
1defO(x):2return-0.25*x**2+45*x -50034for x inrange(40,241,40):5print(f"Overskotet ved {x} produserte einingar er {O(x)} kroner.")
Programmet gir at av dei undersøkte produksjonsmengdene blir overskotet størst når det blir produsert 80 einingar. Ved ein produksjon på 200 eller 240 einingar går bedrifta med underskot.