8.7 Programmering i S1
Python i S1: numerisk derivasjon og grensekostnad, søk etter toppunkt og når metoden svikter, simulering, opptelling av utfall og løkker som finner første verdi som oppfyller et krav.
Programmering på S1-eksamen
På eksamen i S1 møter du Python-program i både Del 1 og Del 2. Oppgavene handler om det samme som resten av faget: vekstfart og derivasjon, toppunkter, økonomi og sannsynlighet. Du skal kunne
- lese et program og forklare hva det regner ut, og hva utskriften betyr i sammenhengen
- vurdere om metoden i programmet alltid virker
- skrive et program som regner ut, simulerer eller teller opp
Dette delkapitlet bygger på grunnleggende Python: variabler, def og return, for med range, while og if.
Kort repetisjon
| Python | Betyr |
|---|---|
x ** 2 | |
def f(x): og return … | definerer funksjonen |
for i in range(1, 7): | går gjennom 1, 2, 3, 4, 5, 6 (ikke 7) |
while betingelse: | gjentar så lenge betingelsen er sann |
if a == b or a == c: | == sammenlikner, = gir en variabel en verdi |
from random import randint og randint(1, 6) | et tilfeldig helt tall fra og med 1 til og med 6 |
Python skriver desimaltall med punktum. I svaret skriver du desimalkomma.
Numerisk derivasjon
Den deriverte er grenseverdien av den gjennomsnittlige vekstfarten (delkapittel 2.8):
Et program kan ikke regne ut en grenseverdi, men det kan regne ut brøken for en liten , for eksempel . Resultatet er da en god tilnærming til . Med blir brøken : i økonomi er det kostnaden ved å produsere én enhet til, som er omtrent lik grensekostnaden.
Kostnaden ved å produsere enheter av en vare er kroner. Forklar hva programmet regner ut, og hva utskriften betyr.
def K(x):
return (
0.02 * x**2
+ 30 * x
+ 5000
)
x = 100
h = 0.001
print((K(x + h) - K(x)) / h)34.000020001258235Kontroll: gir .
Svar: Programmet finner en tilnærmet verdi for . Grensekostnaden ved en produksjon på 100 enheter er omtrent 34 kr per enhet.
Søke etter et toppunkt
Et vanlig eksamensprogram starter i en -verdi og går ett steg til høyre så lenge funksjonsverdien øker. Løkka stopper første gang neste verdi ikke er større. Da står i (eller nær) et toppunkt.
Metoden finner bare det første toppunktet til høyre for startverdien, og bare med den nøyaktigheten steglengden gir. Er funksjonen avtagende ved start, stopper løkka med en gang.
Overskuddet ved salg av enheter er kroner. Hva skriver programmet ut, og hva betyr svaret?
def O(x):
return (
-0.5 * x**2 + 40 * x - 300
)
x = 0
while O(x + 1) > O(x):
x = x + 1
print(x, O(x))Dette er positivt for , så løkka stopper når .
40 500.0Kontroll: gir .
Svar: Programmet skriver ut 40 500.0. Overskuddet er størst, 500 kr, når det selges 40 enheter.
Simulering
I en simulering gjentar programmet et tilfeldig forsøk mange ganger og teller hvor ofte en hendelse inntreffer. Den relative frekvensen
nærmer seg sannsynligheten når antall forsøk blir stort. Svaret blir litt forskjellig fra kjøring til kjøring. Med forsøk er det vanligvis riktig på to desimaler.
Et simuleringsprogram har nesten alltid denne formen: en ytre løkke over forsøkene, et forsøk inne i løkka, en if som sjekker hendelsen, og en teller.
Lag et program som simulerer sannsynligheten for å få minst én sekser når du kaster fire terninger. Sammenlikn med den eksakte sannsynligheten.
from random import randint
N = 100000
treff = 0
for i in range(N):
seksere = 0
for kast in range(4):
if randint(1, 6) == 6:
seksere = seksere + 1
if seksere >= 1:
treff = treff + 1
print(treff / N)Én kjøring ga:
0.51605Eksakt, med komplementsetningen:
Svar: Simuleringen gir omtrent , som stemmer godt med den eksakte verdien .
Telle opp alle utfall
Når alle utfall er like sannsynlige, kan et program finne den eksakte sannsynligheten ved å gå gjennom alle utfallene med én løkke per terning og telle de gunstige:
Med tre terninger er det utfall, med fire terninger . Opptelling gir samme svar hver gang, i motsetning til simulering.
Lag et program som finner den eksakte sannsynligheten for at summen av tre terninger er større enn 12.
antall = 0
gunstige = 0
for a in range(1, 7):
for b in range(1, 7):
for c in range(1, 7):
antall = antall + 1
if a + b + c > 12:
gunstige = (
gunstige + 1
)
print(
gunstige,
antall,
gunstige / antall,
)56 216 0.25925925925925924Svar: Sannsynligheten er .
Finne den første verdien som oppfyller et krav
Spørsmål av typen «Hvor mange kast må til?» eller «Hvor mange år tar det?» løses med en while-løkke: start med den minste verdien og øk med 1 så lenge kravet ikke er oppfylt. Når løkka stopper, er variabelen den minste verdien som oppfyller kravet.
Pass på betingelsen i while: den er det motsatte av kravet. Krav «større enn 0,9» gir while … <= 0.9.
Hvor mange ganger må du minst kaste en terning for at sannsynligheten for minst én sekser skal være større enn 0,9? Løs med et program og kontroller med logaritmer.
n = 1
while 1 - (5 / 6) ** n <= 0.9:
n = n + 1
print(n, 1 - (5 / 6) ** n)13 0.9065361210128207Kontroll:
Ulikhetstegnet snur fordi .
Svar: Minst 13 kast.
Mia setter inn 20 000 kr på en konto ved slutten av hvert år. Renten er 4 % per år. Forklar hva programmet gjør, og hva utskriften forteller.
saldo = 0
ar = 0
while saldo < 500000:
saldo = saldo * 1.04 + 20000
ar = ar + 1
print(ar, round(saldo))Hvert gjennomløp av løkka er ett år: saldoen får 4 % rente, og så settes 20 000 kr inn. Løkka stopper første gang saldoen er minst 500 000 kr.
18 512908Svar: Etter 18 år har Mia for første gang minst 500 000 kr på kontoen. Da har hun 512 908 kr.
Oppgaver
Hva skriver programmet ut? Løs uten å kjøre programmet.
def f(x):
return x ** 2 - 3 * x
print(f(4), f(-1))Hva skriver programmet ut? Hva regner programmet ut?
s = 0
for i in range(1, 6):
s = s + i ** 2
print(s)Et beløp på 1000 kr vokser med 6 % per år.
x = 1000
n = 0
while x < 2000:
x = x * 1.06
n = n + 1
print(n, round(x, 2))Hva skriver programmet ut?
Hva forteller utskriften?
Funksjonen er gitt ved .
def f(x):
return 2 * x ** 3 - x
h = 0.0001
print((f(1 + h) - f(1)) / h)Forklar hva programmet regner ut.
Programmet skriver ut verdien under. Sammenlikn med regnet ved derivasjon.
5.000600019997581Kostnaden ved å produsere enheter er kroner.
def K(x):
return (
0.5 * x**2 + 20 * x + 800
)
print(K(101) - K(100))Hva skriver programmet ut, og hva betyr tallet?
Sammenlikn med grensekostnaden .
Hva skriver programmet ut? Løs uten å kjøre programmet.
def f(x):
return -x ** 2 + 6 * x + 2
x = 0
while f(x + 0.5) > f(x):
x = x + 0.5
print(x, f(x))Overskuddet ved salg av enheter er kroner. Lag et program som finner hvor mange enheter som gir størst overskudd, og hvor stort overskuddet da er. Kontroller ved derivasjon.
Lag et program som simulerer sannsynligheten for at summen av to terninger er 7. Sammenlikn med den eksakte sannsynligheten.
Vi kaster to terninger og ganger tallene sammen. Lag et program som finner den eksakte sannsynligheten for at produktet er større enn 12.
Programmet under simulerer et forsøk med tre terninger.
from random import randint
N = 100000
treff = 0
for i in range(N):
a = randint(1, 6)
b = randint(1, 6)
c = randint(1, 6)
if a == b or a == c or b == c:
treff = treff + 1
print(treff / N)Hvilken sannsynlighet anslår programmet?
Én kjøring ga utskriften under. Regn ut den eksakte sannsynligheten og sammenlikn.
0.44657Hver uke er det 4 % sannsynlighet for å vinne i et lotteri. Lag et program som finner hvor mange uker du minst må spille for at sannsynligheten for minst én gevinst skal være 50 % eller mer. Kontroller med logaritmer.
I en eske ligger 3 hvite kuler og svarte kuler. Du trekker to kuler uten tilbakelegging.
Vis at sannsynligheten for to svarte kuler er .
Lag et program som finner det minste antallet svarte kuler som gir minst 50 % sannsynlighet for to svarte.
Jonas vil finne den største verdien til for og skriver programmet under. Det skriver ut 1.0 5.0.
def f(x):
return (
x**3
- 6 * x**2
+ 9 * x
+ 1
)
x = 0
while f(x + 0.1) > f(x):
x = x + 0.1
print(round(x, 1), round(f(x), 3))Vis at svaret til programmet ikke er den største verdien på intervallet.
Hva skriver programmet ut hvis funksjonen byttes med ? Forklar.
def g(x):
return x ** 2 - 4 * x
x = 0
while g(x + 0.1) > g(x):
x = x + 0.1
print(x, g(x))Hva må være oppfylt for at metoden skal gi den største verdien?
Lag et program som finner den eksakte sannsynligheten for at summen av fire terninger er minst 20.
I et spill kaster du en terning og legger sammen poengene til summen er minst 20.
from random import randint
N = 100000
totalt = 0
for i in range(N):
poeng = 0
kast = 0
while poeng < 20:
poeng = poeng + randint(
1, 6
)
kast = kast + 1
totalt = totalt + kast
print(totalt / N)Forklar hva programmet regner ut.
Én kjøring ga utskriften under. Er resultatet rimelig?
6.19202Sara sparer 30 000 kr ved slutten av hvert år på en konto med 5 % rente per år. Lag et program som finner hvor mange år det tar før hun har minst 1 000 000 kr. Kontroller med CAS.
Oppsummering
- (f(x + h) - f(x)) / h med liten h gir en tilnærmet verdi for . Med h = 1 er det endringen ved én enhet til.
- En løkke som går til høyre så lenge f(x + steg) > f(x), stopper i det første toppunktet. Den finner ikke en større verdi lenger ut, og stopper med en gang hvis er avtagende ved start.
- Simulering: tell hvor ofte hendelsen inntreffer i forsøk. Svaret varierer litt og er tilnærmet.
- Opptelling: én løkke per terning gir eksakt sannsynlighet som gunstige delt på mulige.
- «Hvor mange må til?»: while med det motsatte av kravet, og øk telleren med 1.
- Forklar alltid hva utskriften betyr i sammenhengen, og kontroller gjerne med regning.
Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.