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 dei to førre kapitla lærte vi kva algoritmar er, og korleis vi skriv program i Python. No skal vi bruke desse ferdigheitene til å løyse ekte matematiske problem.

Datamaskina er fantastisk til oppgåver som krev mange berekningar eller gjentagingar. Der vi menneske fort blir trætte av å gjenta den same utrekninga 50 gonger, kan ein datamaskin gjere det på eit brøkdels sekund.

I dette kapitlet skal vi sjå på:
- Berekne renter og sparing over tid
- Simulere tilfeldige forsøk (terningkast)
- Finne nullpunkt til funksjonar
- Berekne statistiske mål med program

Berekne renter med løkker

Når du set pengar i banken, får du renter. Med rentesrente tener du renter på rentene. Vi kan bruke vekstfaktor og ei løkke for å berekne korleis ein sparesum veks 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 antalet år.

Men med eit program kan vi berekne dette steg for steg, og sjå kva som skjer kvart å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")
✏️Døme 1: Sparing over 20 år

Du set 5 000 kr inn i ein sparekonto med 4 % årleg rente. Skriv eit program som viser beløpet etter kvart å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 starta med 5000 kr, så du har tjent", round(belop - 5000, 2), "kr i renter")

Utvalde linjer frå kjøringa:

Å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 starta med 5000 kr, så du har tjent 5955.62 kr i renter

Legg merke til at beløpet meir enn dobler seg. Rentesrente-effekten gjer at veksten akselererer over tid!

📝Oppgave 9.9

Skriv eit program som samanliknar to spareplaner over 15 år:
- Plan A: Du set inn 20 000 kr med 3 % rente.
- Plan B: Du set inn 15 000 kr med 5 % rente.
Kvilken plan gir mest pengar etter 15 år?

Teikne grafar med programmering

Eitt av dei kraftigaste verktøya i Python er moglegheita til å teikne grafar. Vi bruker eit tilleggsbibliotek som heiter matplotlib.

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

import matplotlib.pyplot as plt

# Lag ei liste med x-verdiar
x_verdier = []
y_verdier = []

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

# Teikn 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 reknar ut f(x)f(x) for mange x-verdiar og let Python teikne punkta som ei samanhengande kurve. Jo tettare x-verdiane ligg, desto jamnar blir kurven.

Simulering: Terningkast

Med programmering kan vi simulere tilfeldige forsøk tusenvis av gonger og sjå om resultata samsvarar med det teorien seier.

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

La oss sjekke dette med eit 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 sannsynlegheit:", round(1/6, 4))

Døme på kjøring:

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

Jo fleire kast vi simulerer, desto næmare kjem den relative frekvensen den teoretiske sannsynlegheita. Dette kallast dei store tals lov.

Simulering
Ein simulering er eit eksperiment utført av ein datamaskin som etterliknar ein verkeleg situasjon. I staden for å kaste ein terning 10 000 gonger for hand, let vi datamaskina gjere det.

random.randint(1, 6) gir eit tilfeldig heiltal mellom 1 og 6, akkurat som å kaste ein terning.

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

✏️Døme 2: Simulere to terningar

Skriv eit program som simulerer kast med to terningar 10 000 gonger og finn kor 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 sannsynlegheit:", round(6/36, 4))

Forklaring:
Det finst 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 moglegje utfall. Teoretisk sannsynlegheit: 636=160,1667\displaystyle \frac{6}{36} = \frac{1}{6} \approx 0{,}1667.

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

Brute-force: Løyse likningar ved å prøve mange verdiar

Nokon gonger kan vi løyse likningar ved å la datamaskina prøve mange verdiar og sjå kva som passar best. Denne metoden kallast brute-force (rå kraft).

La oss seia vi vil løyse likninga 3x+7=223x + 7 = 22. Vi veit at svaret er x=5x = 5, men datamaskina kan finne det ved å prøve:

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

For likningar med desimaltal kan vi leite etter verdien der uttrykket er nærmast null:

# Løys 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ærma løysing: x =", round(best_x, 2))

Denna metoden er ikkje den mest elegant, men ho fungerer for mange typar likningar!

Halveringsmetoden (biseksjonsmetoden)

Halveringsmetoden er ein smartare måte å finne nullpunkt på. I staden for å prøve alle verdiar, halverer vi søkeområdet i kvart steg.

Prinsippet: Viss f(a)f(a) og f(b)f(b) har ulikt forteikn, veit vi at det finst eit nullpunkt mellom aa og bb. Vi sjekkar midtpunktet m=a+b2\displaystyle m = \frac{a+b}{2}. Viss f(m)f(m) har same forteikn som f(a)f(a), ligg nullpunktet mellom mm og bb. Elles ligg det mellom aa og mm.

def f(x):
    return x**2 - 7    # Vi leiter 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 halveringar gir ekstremt god nøyaktigheit
    m = (a + b) / 2
    if f(m) * f(a) > 0:
        a = m           # Nullpunktet ligg mellom m og b
    else:
        b = m           # Nullpunktet ligg 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}!)

✏️Døme 3: Finne nullpunkt med halveringsmetoden

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

Vi sjekkar først forteikna: f(1)=125=6f(1) = 1 - 2 - 5 = -6 (negativ) og f(3)=2765=16f(3) = 27 - 6 - 5 = 16 (positiv). Sidan forteikna er ulike, finst det eit 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 å berekne statistiske mål frå datasett. Her er eit program som bereknar 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 dei to midterste

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

# Testresultat frå ein prøve
resultat = [78, 85, 62, 91, 74, 88, 67, 95, 73, 80]

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

Resultat:

Gjennomsnitt: 79.3
Median: 79.0
Variasjonsbredde: 33
✏️Døme 4: Automatisere berekningar frå kvardagen

Skriv eit program som bereknar den totale straumregningen for ein husstand. Programmet skal ta inn antall kilowattimar (kWh) brukt, pris per kWh (i kroner), nettleige per månad 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ånaden: "))
pris = float(input("Pris per kWh (kr): "))
nettleie = float(input("Nettleige per månad (kr): "))

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

print()
print("=== Straumregning ===")
print("Straumforbruk:", kwh, "kWh x", pris, "kr =", round(strom, 2), "kr")
print("Nettleige:", round(nett, 2), "kr")
print("MVA (25 %):", round(mva, 2), "kr")
print("-------------------------")
print("TOTAL:", round(total, 2), "kr")

Døme på kjøring:

Antall kWh brukt denne månaden: 850
Pris per kWh (kr): 1.20
Nettleige per månad (kr): 350

=== Straumregning ===
Straumforbruk: 850.0 kWh x 1.2 kr = 1020.0 kr
Nettleige: 350.0 kr
MVA (25 %): 342.5 kr
-------------------------
TOTAL: 1712.5 kr
📝Oppgave 9.10

Skriv eit program som simulerer 10 000 terningkast og tel upp kor mange gonger kvart øyetal (1 til 6) dukkar opp. Skriv ut den relative frekvensen for kvart øyetal.

📝Oppgave 9.11

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

📝Oppgave 9.12

Skriv eit program som bereknar gjennomsnitt og median av ei liste med tal som brukaren skriv inn. Brukaren skal kunne skrive inn så mange tal dei vil, og avslutta med å skrive "ferdig".

📝Oppgave 9.13

Du set inn 500 kr i månaden på ein sparekonto med 4 % årleg rente. Skriv eit program som bereknar kor mykje du har spart etter 10 år. (Hint: Rekn med månadleg rente, der månadleg rente er årsrente delt på 12.)

Oppsummering

I dette kapittelet har du lært:

- Rentas rente med løkker: Gang beløpet med vekstfaktoren i kvar runde — programmet gjer utrekninga år for år.
- Simulering: La datamaskinen gjenta eit tilfeldig forsøk tusenvis av gonger og samanlikn med teoretisk sannsyn.
- Halveringsmetoden: Finn nullpunkt ved å halvere intervallet der fortegnet skiftar, igjen og igjen.
- Statistikk: Gjennomsnitt, median og andre mål kan berast automatisk for store datasett.

Nøkkelbegrep


OmgrepForklaring
SimuleringDatamaskinkjøring som etterliker verkeligheten
HalveringsmetodenNumerisk metode for å finna nullpunkt
Brute forcePrøve mange verdiar systematisk

Husk


- Jo fleire simuleringer, desto nærare kjem resultatet den teoretiske sannsyn
Repetisjonsoppgåver
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.