8.7 Programmering i S1
Python i S1: numerisk derivasjon og grensekostnad, søk etter toppunkt og når metoden sviktar, simulering, opptelling av utfall og løkker som finn første verdi som oppfyller eit krav.
Programmering på S1-eksamen
På eksamen i S1 møter du Python-program i både Del 1 og Del 2. Oppgåvene handlar om det same som resten av faget: vekstfart og derivasjon, toppunkt, økonomi og sannsyn. Du skal kunne
- lese eit program og forklare kva det reknar ut, og kva utskrifta tyder i samanhengen
- vurdere om metoden i programmet alltid verkar
- skrive eit program som reknar ut, simulerer eller tel opp
Dette delkapittelet byggjer på grunnleggjande Python: variablar, def og return, for med range, while og if.
Kort repetisjon
| Python | Tyder |
|---|---|
x ** 2 | |
def f(x): og return … | definerer funksjonen |
for i in range(1, 7): | går gjennom 1, 2, 3, 4, 5, 6 (ikkje 7) |
while betingelse: | gjentek så lenge vilkåret er sant |
if a == b or a == c: | == samanliknar, = gir ein variabel ein verdi |
from random import randint og randint(1, 6) | eit tilfeldig heilt tal frå og med 1 til og med 6 |
Python skriv desimaltal med punktum. I svaret skriv du desimalkomma.
Numerisk derivasjon
Den deriverte er grenseverdien av den gjennomsnittlege vekstfarten (delkapittel 2.8):
Eit program kan ikkje rekne ut ein grenseverdi, men det kan rekne ut brøken for ein liten , til dømes . Resultatet er då ei god tilnærming til . Med blir brøken : i økonomi er det kostnaden ved å produsere éi eining til, som er omtrent lik grensekostnaden.
Kostnaden ved å produsere einingar av ei vare er kroner. Forklar kva programmet reknar ut, og kva utskrifta tyder.
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 finn ein tilnærma verdi for . Grensekostnaden ved ein produksjon på 100 einingar er omtrent 34 kr per eining.
Søkje etter eit toppunkt
Eit vanleg eksamensprogram startar i ein -verdi og går eitt steg til høgre så lenge funksjonsverdien aukar. Løkka stoppar første gongen neste verdi ikkje er større. Då står i (eller nær) eit toppunkt.
Metoden finn berre det første toppunktet til høgre for startverdien, og berre med den nøyaktigheita steglengda gir. Er funksjonen minkande ved start, stoppar løkka med ein gong.
Overskotet ved sal av einingar er kroner. Kva skriv programmet ut, og kva tyder 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 stoppar når .
40 500.0Kontroll: gir .
Svar: Programmet skriv ut 40 500.0. Overskotet er størst, 500 kr, når det blir selt 40 einingar.
Simulering
I ei simulering gjentek programmet eit tilfeldig forsøk mange gonger og tel kor ofte ei hending skjer. Den relative frekvensen
nærmar seg sannsynet når talet på forsøk blir stort. Svaret blir litt ulikt frå køyring til køyring. Med forsøk er det vanlegvis rett på to desimalar.
Eit simuleringsprogram har nesten alltid denne forma: ei ytre løkke over forsøka, eit forsøk inne i løkka, ein if som sjekkar hendinga, og ein teljar.
Lag eit program som simulerer sannsynet for å få minst éin seksar når du kastar fire terningar. Samanlikn med det eksakte sannsynet.
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)Éi køyring gav:
0.51605Eksakt, med komplementsetninga:
Svar: Simuleringa gir omtrent , som stemmer godt med den eksakte verdien .
Telje opp alle utfall
Når alle utfall er like sannsynlege, kan eit program finne det eksakte sannsynet ved å gå gjennom alle utfalla med éi løkke per terning og telje dei gunstige:
Med tre terningar er det utfall, med fire terningar . Opptelling gir same svar kvar gong, i motsetnad til simulering.
Lag eit program som finn det eksakte sannsynet for at summen av tre terningar 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: Sannsynet er .
Finne den første verdien som oppfyller eit krav
Spørsmål av typen «Kor mange kast trengst?» eller «Kor mange år tek det?» blir løyste med ei while-løkke: start med den minste verdien og auk med 1 så lenge kravet ikkje er oppfylt. Når løkka stoppar, er variabelen den minste verdien som oppfyller kravet.
Pass på vilkåret i while: det er det motsette av kravet. Krav «større enn 0,9» gir while … <= 0.9.
Kor mange gonger må du minst kaste ein terning for at sannsynet for minst éin seksar skal vere større enn 0,9? Løys med eit program og kontroller med logaritmar.
n = 1
while 1 - (5 / 6) ** n <= 0.9:
n = n + 1
print(n, 1 - (5 / 6) ** n)13 0.9065361210128207Kontroll:
Ulikskapsteiknet snur fordi .
Svar: Minst 13 kast.
Mia set inn 20 000 kr på ein konto ved slutten av kvart år. Renta er 4 % per år. Forklar kva programmet gjer, og kva utskrifta fortel.
saldo = 0
ar = 0
while saldo < 500000:
saldo = saldo * 1.04 + 20000
ar = ar + 1
print(ar, round(saldo))Kvar gjennomgang av løkka er eitt år: saldoen får 4 % rente, og så blir 20 000 kr sette inn. Løkka stoppar første gongen saldoen er minst 500 000 kr.
18 512908Svar: Etter 18 år har Mia for første gong minst 500 000 kr på kontoen. Då har ho 512 908 kr.
Oppgåver
Kva skriv programmet ut? Løys utan å køyre programmet.
def f(x):
return x ** 2 - 3 * x
print(f(4), f(-1))Kva skriv programmet ut? Kva reknar programmet ut?
s = 0
for i in range(1, 6):
s = s + i ** 2
print(s)Eit beløp på 1000 kr veks med 6 % per år.
x = 1000
n = 0
while x < 2000:
x = x * 1.06
n = n + 1
print(n, round(x, 2))Kva skriv programmet ut?
Kva fortel utskrifta?
Funksjonen er gitt ved .
def f(x):
return 2 * x ** 3 - x
h = 0.0001
print((f(1 + h) - f(1)) / h)Forklar kva programmet reknar ut.
Programmet skriv ut verdien under. Samanlikn med rekna ved derivasjon.
5.000600019997581Kostnaden ved å produsere einingar er kroner.
def K(x):
return (
0.5 * x**2 + 20 * x + 800
)
print(K(101) - K(100))Kva skriv programmet ut, og kva tyder talet?
Samanlikn med grensekostnaden .
Kva skriv programmet ut? Løys utan å køyre 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))Overskotet ved sal av einingar er kroner. Lag eit program som finn kor mange einingar som gir størst overskot, og kor stort overskotet då er. Kontroller ved derivasjon.
Lag eit program som simulerer sannsynet for at summen av to terningar er 7. Samanlikn med det eksakte sannsynet.
Vi kastar to terningar og gongar tala saman. Lag eit program som finn det eksakte sannsynet for at produktet er større enn 12.
Programmet under simulerer eit forsøk med tre terningar.
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)Kva for eit sannsyn anslår programmet?
Éi køyring gav utskrifta under. Rekn ut det eksakte sannsynet og samanlikn.
0.44657Kvar veke er det 4 % sannsyn for å vinne i eit lotteri. Lag eit program som finn kor mange veker du minst må spele for at sannsynet for minst éin gevinst skal vere 50 % eller meir. Kontroller med logaritmar.
I ei eske ligg 3 kvite kuler og svarte kuler. Du trekkjer to kuler utan tilbakelegging.
Vis at sannsynet for to svarte kuler er .
Lag eit program som finn det minste talet på svarte kuler som gir minst 50 % sannsyn for to svarte.
Jonas vil finne den største verdien til for og skriv programmet under. Det skriv 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 ikkje er den største verdien på intervallet.
Kva skriv programmet ut dersom funksjonen blir bytt 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))Kva må vere oppfylt for at metoden skal gi den største verdien?
Lag eit program som finn det eksakte sannsynet for at summen av fire terningar er minst 20.
I eit spel kastar du ein terning og legg saman poenga 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 kva programmet reknar ut.
Éi køyring gav utskrifta under. Er resultatet rimeleg?
6.19202Sara sparer 30 000 kr ved slutten av kvart år på ein konto med 5 % rente per år. Lag eit program som finn kor mange år det tek før ho har minst 1 000 000 kr. Kontroller med CAS.
Oppsummering
- (f(x + h) - f(x)) / h med liten h gir ein tilnærma verdi for . Med h = 1 er det endringa ved éi eining til.
- Ei løkke som går til høgre så lenge f(x + steg) > f(x), stoppar i det første toppunktet. Ho finn ikkje ein større verdi lenger ute, og stoppar med ein gong dersom er minkande ved start.
- Simulering: tel kor ofte hendinga skjer i forsøk. Svaret varierer litt og er tilnærma.
- Opptelling: éi løkke per terning gir eksakt sannsyn som gunstige delt på moglege.
- «Kor mange trengst?»: while med det motsette av kravet, og auk teljaren med 1.
- Forklar alltid kva utskrifta tyder i samanhengen, og kontroller gjerne med rekning.
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.