Tilbake
11.3

11.3 Matematisk programmering

Løse likninger, plotte funksjoner og simulere sannsynlighet med Python.

60 min
8 oppgaver
Numerisk løsningFunksjonsplottingSimuleringMonte Carlo
Du leser den tradisjonelle versjonen
Din fremgang i kapitlet
0 / 8 oppgaver
Kapitlets plass i kurset

Matematisk programmering

Nå som du kan grunnleggende Python, er det på tide å bruke programmering til å utforske matematikk! Med et program kan du gjøre tusenvis av beregninger på sekunder – noe som ville tatt timer for hånd.

I dette kapittelet skal du:

- Løse likninger med programmering
- Plotte funksjoner
- Simulere sannsynlighet med tilfeldige tall
- Finne primtall
- Beregne statistikk fra datamengder

Løse likninger med programmering

Noen likninger er vanskelige å løse analytisk (med formler), men vi kan bruke programmering til å finne løsninger numerisk – det vil si ved å prøve oss frem systematisk.

En enkel metode er systematisk prøving: Vi tester mange xx-verdier og ser når venstre side er omtrent lik høyre side. Vi kan gjøre dette fordi datamaskinen kan teste tusenvis av verdier på et øyeblikk.

Numerisk løsning av likninger

En numerisk løsning finner en tilnærmet verdi av svaret ved å teste mange verdier. Vi sier at xx er en løsning av f(x)=0f(x) = 0 hvis f(x)|f(x)| er veldig liten (nær null).

Metode: Definer f(x)f(x) som venstre side minus høyre side av likningen. Søk etter xx-verdier der f(x)f(x) skifter fortegn (fra positiv til negativ eller omvendt). Mellom to slike verdier finnes en løsning.

✏️Eksempel: Løse likningen $x^3 - 2x - 5 = 0$

Bruk Python til å finne en løsning av x32x5=0x^3 - 2x - 5 = 0 mellom x=1x = 1 og x=3x = 3.

Løsning:

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

# Søk mellom 1 og 3 med liten steglengde
x = 1.0
steg = 0.001

while x <= 3.0:
    if abs(f(x)) < 0.01:
        print(f"Mulig løsning: x = {x:.3f}, f(x) = {f(x):.4f}")
    x += steg

Utskrift:

Mulig løsning: x = 2.094, f(x) = -0.0053
Mulig løsning: x = 2.095, f(x) = 0.0079

Løsningen er omtrent x2,094x \approx 2{,}094.

Vi kan sjekke: 2,094322,0945=9,194,195=0,00502{,}094^3 - 2 \cdot 2{,}094 - 5 = 9{,}19 - 4{,}19 - 5 = -0{,}005 \approx 0 \checkmark

📝Oppgave 1

Bruk Python til å finne løsningene av x24x+1=0x^2 - 4x + 1 = 0 ved å teste xx-verdier fra 1-1 til 55 med steglengde 0,0010{,}001.

a

Skriv programmet og finn de to løsningene.

b

Sjekk svaret med abc-formelen: x=4±1642\displaystyle x = \frac{4 \pm \sqrt{16 - 4}}{2}.

Løs oppgavenTren

Plotte funksjoner

En av de kraftigste tingene vi kan gjøre med programmering er å tegne grafer. Vi beregner mange funksjonsverdier og tegner dem som punkter.

I Python kan vi lage en enkel "tekst-graf" uten å installere ekstra biblioteker, eller vi kan bruke biblioteket matplotlib for fine grafer.

Her viser vi en enkel måte å lage en graf med tegn i terminalen:

✏️Eksempel: Enkel tekstgraf av $f(x) = x^2$

Lag en tekstbasert graf av f(x)=x2f(x) = x^2 for xx fra 5-5 til 55.

Løsning:

# Enkel tekstgraf av f(x) = x^2
for x in range(-5, 6):
    y = x**2
    stolper = "*" * y
    print(f"x = {x:3d} | {stolper} ({y})")

Utskrift:

x =  -5 | ************************* (25)
x =  -4 | **************** (16)
x =  -3 | ********* (9)
x =  -2 | **** (4)
x =  -1 | * (1)
x =   0 |  (0)
x =   1 | * (1)
x =   2 | **** (4)
x =   3 | ********* (9)
x =   4 | **************** (16)
x =   5 | ************************* (25)

Vi kan tydelig se parabelformen: grafen er symmetrisk om x=0x = 0 og stiger raskt for store x|x|.

For en finere graf kan du bruke matplotlib:

import matplotlib.pyplot as plt

x_verdier = []
y_verdier = []

for i in range(-50, 51):
    x = i / 10
    x_verdier.append(x)
    y_verdier.append(x**2)

plt.plot(x_verdier, y_verdier)
plt.xlabel("x")
plt.ylabel("f(x)")
plt.title("f(x) = x²")
plt.grid(True)
plt.show()
📝Oppgave 2

Skriv et Python-program som lager en tekstgraf (med stjerner) av funksjonen f(x)=2x+3f(x) = 2x + 3 for heltallsverdier av xx fra 3-3 til 55. Beregn funksjonsverdien for hver xx og vis resultatet visuelt.

Simulere sannsynlighet

En av de mest spennende bruksområdene for programmering i matematikk er å simulere tilfeldige forsøk. I stedet for å beregne sannsynlighet med formler, kan vi la datamaskinen gjenta forsøket tusenvis av ganger og telle utfallene.

Denne metoden kalles Monte Carlo-simulering, oppkalt etter kasinoet i Monte Carlo.

I Python bruker vi random-modulen for tilfeldige tall:

import random

terning = random.randint(1, 6)   # Tilfeldig heltall fra 1 til 6
mynt = random.choice(["kron", "mynt"])  # Tilfeldig valg
Monte Carlo-simulering
En Monte Carlo-simulering er en metode der vi bruker tilfeldige tall til å estimere et resultat. Vi gjentar et tilfeldig forsøk mange ganger (f.eks. 10 000 ganger) og beregner andelen av gunstige utfall.

P(hendelse)antall gunstige utfalltotalt antall forsøkP(\text{hendelse}) \approx \frac{\text{antall gunstige utfall}}{\text{totalt antall forsøk}}

Jo flere forsøk vi gjør, desto nærmere kommer vi den eksakte sannsynligheten. Med 10 000 forsøk får vi vanligvis et godt estimat.

✏️Eksempel: Simulere terningkast

Bruk Python til å simulere 10 000 kast med to terninger og finn sannsynligheten for å få summen 7.

Løsning:

import random

antall_forsok = 10000
antall_syv = 0

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

sannsynlighet = antall_syv / antall_forsok
print(f"Antall ganger sum = 7: {antall_syv}")
print(f"Estimert sannsynlighet: {sannsynlighet:.4f}")

Typisk utskrift:

Antall ganger sum = 7: 1674
Estimert sannsynlighet: 0.1674

Eksakt sannsynlighet: Det er 6 gunstige utfall for sum 7: (1,6),(2,5),(3,4),(4,3),(5,2),(6,1)(1,6), (2,5), (3,4), (4,3), (5,2), (6,1). Totalt 6×6=366 \times 6 = 36 utfall.

P(sum=7)=636=160,1667P(\text{sum} = 7) = \frac{6}{36} = \frac{1}{6} \approx 0{,}1667

Simuleringen gir et resultat nær den eksakte verdien! \checkmark

📝Oppgave 3

Skriv et Python-program som simulerer 10 000 myntkast og finner sannsynligheten for å få "kron".

a

Skriv programmet og kjør det.

b

Hva er den eksakte (teoretiske) sannsynligheten? Sammenlign med simuleringen.

📝Oppgave 4

Skriv et Python-program som simulerer 10 000 kast med to terninger og finner sannsynligheten for å få minst én sekser.

Finne primtall med programmering

Et primtall er et tall større enn 1 som bare er delelig med 1 og seg selv. De første primtallene er: 2,3,5,7,11,13,17,19,23,2, 3, 5, 7, 11, 13, 17, 19, 23, \ldots

Å finne store primtall er viktig i kryptografi (sikker kommunikasjon på nett). Med programmering kan vi raskt sjekke om tall er primtall og finne alle primtall opp til en gitt grense.

✏️Eksempel: Sjekke om et tall er primtall

Skriv et Python-program som sjekker om et gitt tall er et primtall.

Løsning:

import math

tall = int(input("Skriv inn et tall: "))

if tall < 2:
    print(f"{tall} er ikke et primtall")
else:
    er_primtall = True
    for i in range(2, int(math.sqrt(tall)) + 1):
        if tall % i == 0:
            er_primtall = False
            break

    if er_primtall:
        print(f"{tall} er et primtall")
    else:
        print(f"{tall} er ikke et primtall")

Triks: Vi trenger bare å sjekke divisorer opp til n\sqrt{n}, fordi hvis n=abn = a \cdot b og begge er større enn n\sqrt{n}, ville ab>na \cdot b > n.

For n=97n = 97: 979,8\sqrt{97} \approx 9{,}8, så vi sjekker 2, 3, 4, 5, 6, 7, 8, 9. Ingen deler 97, altså er 97 et primtall.

📝Oppgave 5

Skriv et Python-program som finner og skriver ut alle primtall fra 2 til 100.

a

Skriv programmet.

b

Hvor mange primtall er det mellom 2 og 100?

Beregne statistikk med programmering

Når vi har store datamengder, er programmering uvurderlig for å beregne statistiske mål. Med Python kan vi enkelt finne gjennomsnitt, median, typetall og standardavvik.

Statistiske mål i Python
De viktigste statistiske målene og hvordan vi beregner dem:

Gjennomsnitt (middelverdien):
xˉ=x1+x2++xnn\bar{x} = \frac{x_1 + x_2 + \ldots + x_n}{n}

Median (den midterste verdien i sortert rekkefølge):
- Hvis nn er oddetall: medianen er det midterste elementet
- Hvis nn er partall: medianen er gjennomsnittet av de to midterste

Typetall (den verdien som forekommer oftest):
- Telles ved å gå gjennom listen og finne hyppigste verdi

Variasjonsbredde: Største verdi minus minste verdi

✏️Eksempel: Statistikkprogram

Skriv et Python-program som beregner gjennomsnitt, median og variasjonsbredde for karakterene [4,5,3,6,5,4,5,3,4,5][4, 5, 3, 6, 5, 4, 5, 3, 4, 5].

Løsning:

karakterer = [4, 5, 3, 6, 5, 4, 5, 3, 4, 5]

# Gjennomsnitt
gjennomsnitt = sum(karakterer) / len(karakterer)

# Sorterer for median
sortert = sorted(karakterer)
n = len(sortert)
if n % 2 == 1:
    median = sortert[n // 2]
else:
    median = (sortert[n // 2 - 1] + sortert[n // 2]) / 2

# Variasjonsbredde
variasjonsbredde = max(karakterer) - min(karakterer)

# Typetall (enkel metode)
typetall = max(set(karakterer), key=karakterer.count)

print(f"Karakterer: {karakterer}")
print(f"Sortert: {sortert}")
print(f"Gjennomsnitt: {gjennomsnitt:.1f}")
print(f"Median: {median}")
print(f"Typetall: {typetall}")
print(f"Variasjonsbredde: {variasjonsbredde}")

Utskrift:

Karakterer: [4, 5, 3, 6, 5, 4, 5, 3, 4, 5]
Sortert: [3, 3, 4, 4, 4, 5, 5, 5, 5, 6]
Gjennomsnitt: 4.4
Median: 4.5
Typetall: 5
Variasjonsbredde: 3

Sjekk: Gjennomsnitt =4+5+3+6+5+4+5+3+4+510=4410=4,4\displaystyle = \frac{4+5+3+6+5+4+5+3+4+5}{10} = \frac{44}{10} = 4{,}4 \checkmark

Median: De to midterste er 4 og 5, median =4+52=4,5\displaystyle = \frac{4+5}{2} = 4{,}5 \checkmark

📝Oppgave 6

Brukerne av en app har gitt disse vurderingene (1–5 stjerner): [5,3,4,5,2,4,5,4,3,5,4,5,3,4,4][5, 3, 4, 5, 2, 4, 5, 4, 3, 5, 4, 5, 3, 4, 4]. Skriv et Python-program som beregner gjennomsnitt, median, typetall og variasjonsbredde.

Oppsummering

I dette kapittelet har du lært:

- Numerisk likningsløsning: Teste mange xx-verdier systematisk for å finne der f(x)0f(x) \approx 0
- Plotte funksjoner: Lage tekstgrafer med Python, eventuelt bruke matplotlib for fine grafer
- Monte Carlo-simulering: Bruke tilfeldige tall til å estimere sannsynligheter
- Primtall: Sjekke om tall er primtall ved å teste divisorer opp til n\sqrt{n}
- Statistikk: Beregne gjennomsnitt, median, typetall og variasjonsbredde med Python

Nøkkelbegreper


BegrepForklaring
Numerisk løsningTilnærmet løsning funnet ved systematisk prøving
Monte Carlo-simuleringEstimere resultater ved hjelp av tilfeldige forsøk
PrimtallTall > 1 som bare er delelig med 1 og seg selv
GjennomsnittSummen av alle verdier delt på antall verdier
MedianDen midterste verdien i en sortert datamengde
TypetallDen verdien som forekommer oftest
VariasjonsbreddeForskjellen mellom største og minste verdi
📝Oppgave 7

Du kaster tre terninger. Bruk Python til å simulere 10 000 forsøk og estimer sannsynligheten for at summen er nøyaktig 10.

a

Skriv programmet og finn den estimerte sannsynligheten.

b

Den eksakte sannsynligheten er P=27216=0,125\displaystyle P = \frac{27}{216} = 0{,}125. Sammenlign med simuleringen din.

Løs oppgavenTren
📝Oppgave 8

Skriv et Python-program som bruker Monte Carlo-simulering til å estimere verdien av π\pi. Metoden: Generer tilfeldige punkter (x,y)(x, y) der 0x10 \leq x \leq 1 og 0y10 \leq y \leq 1. Tell hvor mange som havner innenfor kvartssirkelen x2+y21x^2 + y^2 \leq 1. Da er π4innenfortotalt\displaystyle \pi \approx 4 \cdot \frac{\text{innenfor}}{\text{totalt}}.

a

Skriv programmet med 100 000 tilfeldige punkter.

b

Kjør programmet flere ganger. Hvor nær π=3,14159\pi = 3{,}14159\ldots kommer du?

c

Forklar hvorfor denne metoden fungerer.

Løs oppgavenTren
📝Oppgave F1
Finn feilen! Maja har skrevet et Python-program som bruker Monte Carlo-simulering til å estimere sannsynligheten for at summen av to terninger er 7:

import random

antall_forsok = 10000
antall_gunstige = 0

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

sannsynlighet = antall_gunstige / antall_forsok
print(f"Estimert sannsynlighet: {sannsynlighet}")
print(f"Eksakt svar: {1/6}")

Maja er fornøyd — programmet kjører uten feil og gir ca. 0,1670{,}167. Men vennen hennes Liam skriver nesten samme program, bare med denne forskjellen:

    terning1 = random.randint(0, 6)
    terning2 = random.randint(0, 6)

Liam får et annet (feil) svar. Finn feilen og forklar hva som går galt.

📝Oppgave S1
Sant eller usant?

En Monte Carlo-simulering gir alltid eksakt svar.

📝Oppgave D1
Drøftingsoppgave: I matematikk kan vi ofte finne eksakte svar med algebra (for eksempel løse 2x+3=112x + 3 = 11 og få x=4x = 4). Men noen ganger bruker vi numeriske metoder — datamaskinen prøver seg frem til et tilnærmet svar.

a) Gi et eksempel på en likning som er enkel å løse eksakt, og en som er vanskelig å løse eksakt.

b) Diskuter: Når er det greit å bruke et tilnærmet (numerisk) svar i stedet for et eksakt svar? Finnes det situasjoner der et tilnærmet svar ikke er godt nok?

c) Hvorfor tror du programmering og numeriske metoder har blitt så viktige i moderne matematikk og vitenskap?

Repetisjonsoppgaver
Din fremgang
0deloppgaver0 / 6 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.