Tilbake
9.3
Matematikk med programmering

9.3 Matematikk med programmering

Bruk Python til å utforske renter og sparing, simulere tilfeldige forsøk, løse likninger og analysere statistikk.

55 min
9 oppgaver
Renter og sparingSimuleringLikningsløsningStatistikkPython
Du leser den tradisjonelle versjonen
Din fremgang i kapitlet
0 / 9 oppgaver
Kapitlets plass i kurset

Programmering som verktøy i matematikk

I de to forrige kapitlene lærte vi hva algoritmer er, og hvordan vi skriver programmer i Python. Nå skal vi bruke disse ferdighetene til å løse ekte matematiske problemer.

Datamaskinen er fantastisk til oppgaver som krever mange beregninger eller gjentakelser. Der vi mennesker fort blir slitne av å gjenta den samme utregningen 50 ganger, kan en datamaskin gjøre det på et brøkdels sekund.

I dette kapittelet skal vi se på:
- Beregne renter og sparing over tid
- Simulere tilfeldige forsøk (terningkast)
- Finne nullpunkter til funksjoner
- Beregne statistiske mål med programmer

Beregne renter med løkker

Når du setter penger i banken, får du renter. Med rentesrente tjener du renter på rentene. Vi kan bruke vekstfaktor og en løkke for å beregne hvordan en sparesum vokser over tid.

Formelen for rentesrente er:

Kn=K0(1+r100)nK_n = K_0 \cdot \left(1 + \frac{r}{100}\right)^n

der K0K_0 er startbeløpet, rr er rentesatsen i prosent, og nn er antall år.

Men med et program kan vi beregne dette steg for steg, og se hva som skjer hvert år:

startbelop = 10000
rente = 3.5        # 3,5 % rente per år
antall_ar = 10

belop = startbelop
for ar in range(1, antall_ar + 1):
    rente_dette_ar = belop * rente / 100
    belop = belop + rente_dette_ar
    print("Etter", ar, "år:", round(belop, 2), "kr")

print("Totalvekst:", round(belop - startbelop, 2), "kr")
✏️Eksempel 1: Sparing over 20 år

Du setter 5 000 kr inn i en sparekonto med 4 % årlig rente. Skriv et program som viser beløpet etter hvert år i 20 år.

belop = 5000
rente = 4       # prosent

for ar in range(1, 21):
    belop = belop * (1 + rente/100)
    print("År", ar, ":", round(belop, 2), "kr")

print()
print("Etter 20 år har du", round(belop, 2), "kr")
print("Du startet med 5000 kr, så du har tjent", round(belop - 5000, 2), "kr i renter")

Utvalgte linjer fra kjøringen:

År 1 : 5200.0 kr
År 5 : 6083.26 kr
År 10 : 7401.22 kr
År 15 : 9004.73 kr
År 20 : 10955.62 kr

Etter 20 år har du 10955.62 kr
Du startet med 5000 kr, så du har tjent 5955.62 kr i renter

Legg merke til at beløpet mer enn dobles. Rentesrente-effekten gjør at veksten akselererer over tid!

📝Oppgave 9.9

Skriv et program som sammenligner to spareplaner over 15 år:
- Plan A: Du setter inn 20 000 kr med 3 % rente.
- Plan B: Du setter inn 15 000 kr med 5 % rente.
Hvilken plan gir mest penger etter 15 år?

Tegne grafer med programmering

Et av de kraftigste verktøyene i Python er muligheten til å tegne grafer. Vi bruker et tilleggsbibliotek som heter matplotlib.

Her er et program som tegner grafen til funksjonen f(x)=x24f(x) = x^2 - 4:

import matplotlib.pyplot as plt

# Lag en liste med x-verdier
x_verdier = []
y_verdier = []

x = -5
while x <= 5:
    x_verdier.append(x)
    y_verdier.append(x**2 - 4)
    x = x + 0.1

# Tegn grafen
plt.plot(x_verdier, y_verdier)
plt.axhline(y=0, color='black', linewidth=0.5)
plt.axvline(x=0, color='black', linewidth=0.5)
plt.grid(True)
plt.title("Grafen til f(x) = x^2 - 4")
plt.xlabel("x")
plt.ylabel("f(x)")
plt.show()

Prinsippet er enkelt: vi regner ut f(x)f(x) for mange x-verdier og lar Python tegne punktene som en sammenhengende kurve. Jo tettere x-verdiene ligger, desto jevnere blir kurven.

Simulering: Terningkast

Med programmering kan vi simulere tilfeldige forsøk tusenvis av ganger og se om resultatene samsvarer med det teorien sier.

Sannsynligheten for å kaste en sekser med en vanlig terning er 160,167=16,7%\displaystyle \frac{1}{6} \approx 0{,}167 = 16{,}7\%.

La oss sjekke dette med et program:

import random

antall_kast = 10000
antall_seksere = 0

for i in range(antall_kast):
    terning = random.randint(1, 6)
    if terning == 6:
        antall_seksere = antall_seksere + 1

relativ_frekvens = antall_seksere / antall_kast
print("Antall kast:", antall_kast)
print("Antall seksere:", antall_seksere)
print("Relativ frekvens:", round(relativ_frekvens, 4))
print("Teoretisk sannsynlighet:", round(1/6, 4))

Eksempel på kjøring:

Antall kast: 10000
Antall seksere: 1672
Relativ frekvens: 0.1672
Teoretisk sannsynlighet: 0.1667

Jo flere kast vi simulerer, desto nærmere kommer den relative frekvensen den teoretiske sannsynligheten. Dette kalles de store talls lov.

Simulering
En simulering er et eksperiment utført av en datamaskin som etterligner en virkelig situasjon. I stedet for å kaste en terning 10 000 ganger for hånd, lar vi datamaskinen gjøre det.

random.randint(1, 6) gir et tilfeldig heltall mellom 1 og 6, akkurat som å kaste en terning.

Relativ frekvens er andelen ganger en hendelse skjer:
Relativ frekvens=antall ganger hendelsen skjertotalt antall forsøk\text{Relativ frekvens} = \frac{\text{antall ganger hendelsen skjer}}{\text{totalt antall forsøk}}

✏️Eksempel 2: Simulere to terninger

Skriv et program som simulerer kast med to terninger 10 000 ganger og finner hvor ofte summen blir 7.

import random

antall_kast = 10000
antall_sju = 0

for i in range(antall_kast):
    terning1 = random.randint(1, 6)
    terning2 = random.randint(1, 6)
    if terning1 + terning2 == 7:
        antall_sju = antall_sju + 1

relativ_frekvens = antall_sju / antall_kast
print("Relativ frekvens for sum = 7:", round(relativ_frekvens, 4))
print("Teoretisk sannsynlighet:", round(6/36, 4))

Forklaring:
Det finnes 6 gunstige utfall som gir sum 7: (1,6), (2,5), (3,4), (4,3), (5,2), (6,1). Totalt er det 6×6=366 \times 6 = 36 mulige utfall. Teoretisk sannsynlighet: 636=160,1667\displaystyle \frac{6}{36} = \frac{1}{6} \approx 0{,}1667.

Simuleringen vil gi et resultat nær 0,1667.

Brute-force: Løse likninger ved å prøve mange verdier

Noen ganger kan vi løse likninger ved å la datamaskinen prøve mange verdier og se hvilken som passer best. Denne metoden kalles brute-force (rå kraft).

La oss si vi vil løse likningen 3x+7=223x + 7 = 22. Vi vet at svaret er x=5x = 5, men datamaskinen kan finne det ved å prøve:

for x in range(-100, 101):
    if 3 * x + 7 == 22:
        print("Løsning: x =", x)

For likninger med desimaltall kan vi lete etter verdien der uttrykket er nærmest null:

# Løs 2.5*x - 8.3 = 0
best_x = -100
minste_avvik = abs(2.5 * (-100) - 8.3)

x = -100
while x <= 100:
    avvik = abs(2.5 * x - 8.3)
    if avvik < minste_avvik:
        minste_avvik = avvik
        best_x = x
    x = x + 0.01

print("Tilnærmet løsning: x =", round(best_x, 2))

Denne metoden er ikke den mest elegante, men den fungerer for mange typer likninger!

Halveringsmetoden (biseksjonsmetoden)

Halveringsmetoden er en smartere måte å finne nullpunkter på. I stedet for å prøve alle verdier, halverer vi søkeområdet i hvert steg.

Prinsippet: Hvis f(a)f(a) og f(b)f(b) har ulikt fortegn, vet vi at det finnes et nullpunkt mellom aa og bb. Vi sjekker midtpunktet m=a+b2\displaystyle m = \frac{a+b}{2}. Hvis f(m)f(m) har samme fortegn som f(a)f(a), ligger nullpunktet mellom mm og bb. Ellers ligger det mellom aa og mm.

def f(x):
    return x**2 - 7    # Vi leter etter x der x^2 = 7

a = 2     # f(2) = 4 - 7 = -3 (negativ)
b = 3     # f(3) = 9 - 7 = 2  (positiv)

for i in range(50):     # 50 halveringer gir ekstremt god nøyaktighet
    m = (a + b) / 2
    if f(m) * f(a) > 0:
        a = m           # Nullpunktet er mellom m og b
    else:
        b = m           # Nullpunktet er mellom a og m

print("Nullpunkt: x =", round(m, 10))
print("Sjekk: f(x) =", round(f(m), 15))

Resultat: x2,6457513111x \approx 2{,}6457513111 (som er 7\sqrt{7}!)

✏️Eksempel 3: Finne nullpunkter med halveringsmetoden

Bruk halveringsmetoden til å finne nullpunktet til f(x)=x32x5f(x) = x^3 - 2x - 5 i intervallet [1,3][1, 3].

Vi sjekker først fortegnene: f(1)=125=6f(1) = 1 - 2 - 5 = -6 (negativ) og f(3)=2765=16f(3) = 27 - 6 - 5 = 16 (positiv). Siden fortegnene er ulike, finnes det et nullpunkt i intervallet.

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

a = 1
b = 3

for i in range(40):
    m = (a + b) / 2
    if f(m) * f(a) > 0:
        a = m
    else:
        b = m

print("Nullpunkt: x =", round(m, 6))
print("Sjekk: f(x) =", round(f(m), 10))

Resultat:

Nullpunkt: x = 2.094552
Sjekk: f(x) = -0.0000000001

Nullpunktet er x2,0946x \approx 2{,}0946. Vi kan verifisere: 2,0946322,0946502{,}0946^3 - 2 \cdot 2{,}0946 - 5 \approx 0

Statistikk med programmering

Python er perfekt for å beregne statistiske mål fra datasett. Her er et program som beregner gjennomsnitt, median og variasjonsbredde:

def gjennomsnitt(data):
    return sum(data) / len(data)

def median(data):
    sortert = sorted(data)
    n = len(sortert)
    if n % 2 == 1:
        return sortert[n // 2]         # Odde antall: midterste verdi
    else:
        midt1 = sortert[n // 2 - 1]
        midt2 = sortert[n // 2]
        return (midt1 + midt2) / 2     # Par antall: snitt av de to midterste

def variasjonsbredde(data):
    return max(data) - min(data)

# Testresultater fra en prøve
resultater = [78, 85, 62, 91, 74, 88, 67, 95, 73, 80]

print("Gjennomsnitt:", gjennomsnitt(resultater))
print("Median:", median(resultater))
print("Variasjonsbredde:", variasjonsbredde(resultater))

Resultat:

Gjennomsnitt: 79.3
Median: 79.0
Variasjonsbredde: 33
✏️Eksempel 4: Automatisere beregninger fra hverdagen

Skriv et program som beregner den totale strømregningen for en husstand. Programmet skal ta inn antall kilowattimer (kWh) brukt, pris per kWh (i kroner), nettleie per måned og merverdiavgift (25 %).

def beregn_stromregning(kwh, pris_per_kwh, nettleie):
    stromkostnad = kwh * pris_per_kwh
    sum_uten_mva = stromkostnad + nettleie
    mva = sum_uten_mva * 0.25
    total = sum_uten_mva + mva
    return stromkostnad, nettleie, mva, total

kwh = float(input("Antall kWh brukt denne måneden: "))
pris = float(input("Pris per kWh (kr): "))
nettleie = float(input("Nettleie per måned (kr): "))

strom, nett, mva, total = beregn_stromregning(kwh, pris, nettleie)

print()
print("=== Strømregning ===")
print("Strømforbruk:", kwh, "kWh x", pris, "kr =", round(strom, 2), "kr")
print("Nettleie:", round(nett, 2), "kr")
print("MVA (25 %):", round(mva, 2), "kr")
print("-------------------------")
print("TOTAL:", round(total, 2), "kr")

Eksempel på kjøring:

Antall kWh brukt denne måneden: 850
Pris per kWh (kr): 1.20
Nettleie per måned (kr): 350

=== Strømregning ===
Strømforbruk: 850.0 kWh x 1.2 kr = 1020.0 kr
Nettleie: 350.0 kr
MVA (25 %): 342.5 kr
-------------------------
TOTAL: 1712.5 kr
📝Oppgave 9.10

Skriv et program som simulerer 10 000 terningkast og teller opp hvor mange ganger hvert øyetall (1 til 6) dukker opp. Skriv ut den relative frekvensen for hvert øyetall.

📝Oppgave 9.11

Bruk halveringsmetoden til å finne 20\sqrt{20} (altså løsningen til x2=20x^2 = 20) med minst 6 desimalers nøyaktighet. Start med intervallet [4,5][4, 5].

📝Oppgave 9.12

Skriv et program som beregner gjennomsnitt og median av en liste med tall som brukeren skriver inn. Brukeren skal kunne skrive inn så mange tall de vil, og avslutte med å skrive "ferdig".

📝Oppgave 9.13

Du setter inn 500 kr i måneden på en sparekonto med 4 % årlig rente. Skriv et program som beregner hvor mye du har spart etter 10 år. (Hint: Regn med månedlig rente, der månedlig rente er årsrente delt på 12.)

Oppsummering

I dette kapittelet har du lært:

- Rentesrente med løkker: Gang beløpet med vekstfaktoren i hver runde — programmet gjør utregningen år for år.
- Simulering: La datamaskinen gjenta et tilfeldig forsøk tusenvis av ganger og sammenlign med teoretisk sannsynlighet.
- Halveringsmetoden: Finn nullpunkter ved å halvere intervallet der fortegnet skifter, igjen og igjen.
- Statistikk: Gjennomsnitt, median og andre mål kan beregnes automatisk for store datasett.

Nøkkelbegreper


BegrepForklaring
SimuleringDatamaskin-eksperiment som etterligner virkeligheten
HalveringsmetodenNumerisk metode for å finne nullpunkter
Brute forcePrøve mange verdier systematisk

Husk


- Jo flere simuleringer, desto nærmere kommer resultatet den teoretiske sannsynligheten
Repetisjonsoppgaver
Din fremgang
0deloppgaver0 / 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.