8.7

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.

60 min
16 oppgaver
PythonNumerisk derivasjonToppunktsøkSimuleringOpptelling
Din fremgang i kapitlet
0 / 16 oppgaver
Kapitlets plass i kurset

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

PythonTyder
x ** 2x2x^2
def f(x): og return …definerer funksjonen ff
for i in range(1, 7):ii 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):

f′(x)=lim⁡h→0f(x+h)−f(x)hf'(x) = \lim_{h \to 0} \frac{f(x + h) - f(x)}{h}

Eit program kan ikkje rekne ut ein grenseverdi, men det kan rekne ut brøken for ein liten hh, til dømes h=0,001h = 0{,}001. Resultatet er då ei god tilnærming til f′(x)f'(x). Med h=1h = 1 blir brøken f(x+1)−f(x)f(x + 1) - f(x): i økonomi er det kostnaden ved å produsere éi eining til, som er omtrent lik grensekostnaden.

✏️Døme 1: Kva reknar programmet ut?

Kostnaden ved å produsere xx einingar av ei vare er K(x)=0,02x2+30x+5000K(x) = 0{,}02x^2 + 30x + 5000 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)

Programmet reknar ut den gjennomsnittlege vekstfarten til KK frå x=100x = 100 til x=100,001x = 100{,}001:

K(100+0,001)−K(100)0,001\frac{K(100 + 0{,}001) - K(100)}{0{,}001}

34.000020001258235

Kontroll: K′(x)=0,04x+30K'(x) = 0{,}04x + 30 gir K′(100)=34K'(100) = 34.

Svar: Programmet finn ein tilnærma verdi for K′(100)K'(100). Grensekostnaden ved ein produksjon på 100 einingar er omtrent 34 kr per eining.

Søkje etter eit toppunkt

Eit vanleg eksamensprogram startar i ein xx-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 xx 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.

✏️Døme 2: Største overskot

Overskotet ved sal av xx einingar er O(x)=−0,5x2+40x−300O(x) = -0{,}5x^2 + 40x - 300 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))

Løkka held fram så lenge O(x+1)>O(x)O(x + 1) > O(x):

O(x+1)−O(x)=−0,5(2x+1)+40=39,5−xO(x + 1) - O(x) = -0{,}5(2x + 1) + 40 = 39{,}5 - x

Dette er positivt for x<39,5x < 39{,}5, så løkka stoppar når x=40x = 40.

O(40)=−0,5⋅1600+40⋅40−300=500O(40) = -0{,}5 \cdot 1600 + 40 \cdot 40 - 300 = 500

40 500.0

Kontroll: O′(x)=−x+40=0O'(x) = -x + 40 = 0 gir x=40x = 40.

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

talet pa˚ gonger hendinga skjertalet pa˚ forsøk\frac{\text{talet på gonger hendinga skjer}}{\text{talet på forsøk}}

nærmar seg sannsynet når talet på forsøk blir stort. Svaret blir litt ulikt frå køyring til køyring. Med N=100 000N = 100\,000 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.

✏️Døme 3: Minst éin seksar

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.51605

Eksakt, med komplementsetninga:

P(minst eˊin seksar)=1−(56)4=6711296≈0,518P(\text{minst éin seksar}) = 1 - \left(\frac{5}{6}\right)^4 = \frac{671}{1296} \approx 0{,}518

Svar: Simuleringa gir omtrent 0,5160{,}516, som stemmer godt med den eksakte verdien 0,5180{,}518.

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:

P=talet pa˚ gunstige utfalltalet pa˚ moglege utfallP = \frac{\text{talet på gunstige utfall}}{\text{talet på moglege utfall}}

Med tre terningar er det 63=2166^3 = 216 utfall, med fire terningar 64=12966^4 = 1296. Opptelling gir same svar kvar gong, i motsetnad til simulering.

✏️Døme 4: Summen av tre terningar

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.25925925925925924

P(sum>12)=56216=727≈0,259P(\text{sum} > 12) = \frac{56}{216} = \frac{7}{27} \approx 0{,}259

Svar: Sannsynet er 727≈0,259\dfrac{7}{27} \approx 0{,}259.

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.

✏️Døme 5: Kor mange kast?

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.9065361210128207

Kontroll:

1−(56)n>0,91 - \left(\frac{5}{6}\right)^n > 0{,}9

(56)n<0,1\left(\frac{5}{6}\right)^n < 0{,}1

n>ln⁡0,1ln⁡56≈12,6n > \frac{\ln 0{,}1}{\ln \frac{5}{6}} \approx 12{,}6

Ulikskapsteiknet snur fordi ln⁡56<0\displaystyle \ln \frac{5}{6} < 0.

Svar: Minst 13 kast.

✏️Døme 6: Sparing

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 512908

Svar: Etter 18 år har Mia for første gong minst 500 000 kr på kontoen. Då har ho 512 908 kr.

Oppgåver

📝Oppgave 8.7.1

Kva skriv programmet ut? Løys utan å køyre programmet.

def f(x):
    return x ** 2 - 3 * x

print(f(4), f(-1))

📝Oppgave 8.7.2

Kva skriv programmet ut? Kva reknar programmet ut?

s = 0
for i in range(1, 6):
    s = s + i ** 2
print(s)

📝Oppgave 8.7.3

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))

a

Kva skriv programmet ut?

b

Kva fortel utskrifta?

📝Oppgave 8.7.4

Funksjonen ff er gitt ved f(x)=2x3−xf(x) = 2x^3 - x.

def f(x):
    return 2 * x ** 3 - x

h = 0.0001
print((f(1 + h) - f(1)) / h)

a

Forklar kva programmet reknar ut.

b

Programmet skriv ut verdien under. Samanlikn med f′(1)f'(1) rekna ved derivasjon.

5.000600019997581

Løs oppgaven
📝Oppgave 8.7.5

Kostnaden ved å produsere xx einingar er K(x)=0,5x2+20x+800K(x) = 0{,}5x^2 + 20x + 800 kroner.

def K(x):
    return (
        0.5 * x**2 + 20 * x + 800
    )

print(K(101) - K(100))

a

Kva skriv programmet ut, og kva tyder talet?

b

Samanlikn med grensekostnaden K′(100)K'(100).

Løs oppgaven
📝Oppgave 8.7.6

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))

📝Oppgave 8.7.7

Overskotet ved sal av xx einingar er O(x)=−0,04x2+60x−12 000O(x) = -0{,}04x^2 + 60x - 12\,000 kroner. Lag eit program som finn kor mange einingar som gir størst overskot, og kor stort overskotet då er. Kontroller ved derivasjon.

📝Oppgave 8.7.8

Lag eit program som simulerer sannsynet for at summen av to terningar er 7. Samanlikn med det eksakte sannsynet.

📝Oppgave 8.7.9

Vi kastar to terningar og gongar tala saman. Lag eit program som finn det eksakte sannsynet for at produktet er større enn 12.

📝Oppgave 8.7.10

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)

a

Kva for eit sannsyn anslår programmet?

b

Éi køyring gav utskrifta under. Rekn ut det eksakte sannsynet og samanlikn.

0.44657

📝Oppgave 8.7.11

Kvar 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.

📝Oppgave 8.7.12

I ei eske ligg 3 kvite kuler og nn svarte kuler. Du trekkjer to kuler utan tilbakelegging.

a

Vis at sannsynet for to svarte kuler er P(n)=n(n−1)(n+3)(n+2)P(n) = \dfrac{n(n - 1)}{(n + 3)(n + 2)}.

b

Lag eit program som finn det minste talet på svarte kuler som gir minst 50 % sannsyn for to svarte.

Løs oppgaven
📝Oppgave 8.7.13

Jonas vil finne den største verdien til f(x)=x3−6x2+9x+1f(x) = x^3 - 6x^2 + 9x + 1 for x∈[0,5]x \in [0, 5] 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))

a

Vis at svaret til programmet ikkje er den største verdien på intervallet.

b

Kva skriv programmet ut dersom funksjonen blir bytt med g(x)=x2−4xg(x) = x^2 - 4x? 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))

c

Kva må vere oppfylt for at metoden skal gi den største verdien?

Løs oppgaven
📝Oppgave 8.7.14

Lag eit program som finn det eksakte sannsynet for at summen av fire terningar er minst 20.

📝Oppgave 8.7.15

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)

a

Forklar kva programmet reknar ut.

b

Éi køyring gav utskrifta under. Er resultatet rimeleg?

6.19202

📝Oppgave 8.7.16

Sara 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 f′(x)f'(x). 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 ff er minkande ved start.
- Simulering: tel kor ofte hendinga skjer i NN 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.

Repetisjonsoppgåver
Din fremgang
0 / 4 oppgaver

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.