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

No som du kan grunnleggjande Python, er det på tid å bruka programmering til å utforska matematikk! Med eit program kan du gjera tusenvis av berekningar på sekund – noko som ville tatt timar for hand.

I dette kapitlet skal du:

- Løysa likningar med programmering
- Plotta funksjonar
- Simulera sannsynlegheit med tilfeldig tal
- Finna primtal
- Berekna statistikk frå datamengder

Løysa likningar med programmering

Nokon likningar er vanskelege å løysa analytisk (med formlar), men vi kan bruka programmering til å finna løysingar numerisk – det vil seia ved å prøva oss fram systematisk.

Ein enkel metode er systematisk prøving: Vi testar mange xx-verdiar og ser når venstre side er omtrent lik høgre side. Vi kan gjera dette fordi datamaskina kan testa tusenvis av verdiar på eit augeblikk.

Numerisk løysing av likningar

Ein numerisk løysing finn ein tilnærma verdi av svaret ved å testa mange verdiar. Vi seier at xx er ein løysing av f(x)=0f(x) = 0 viss f(x)|f(x)| er veldig liten (nær null).

Metode: Definer f(x)f(x) som venstre side minus høgre side av likninga. Søk etter xx-verdiar der f(x)f(x) skiftar forteikn (frå positiv til negativ eller omvendt). Mellom to slike verdiar finst ein løysing.

✏️Eksempel: Løysa likninga $x^3 - 2x - 5 = 0$

Bruk Python til å finna ein løysing av x32x5=0x^3 - 2x - 5 = 0 mellom x=1x = 1 og x=3x = 3.

Løysing:

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

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

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

Utskrift:

Mogleg løysing: x = 2.094, f(x) = -0.0053
Mogleg løysing: x = 2.095, f(x) = 0.0079

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

Vi kan sjekka: 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 å finna løysingane av x24x+1=0x^2 - 4x + 1 = 0 ved å testa xx-verdiar frå 1-1 til 55 med steglengd 0,0010{,}001.

a

Skriv programmet og finn dei to løysingane.

b

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

Løs oppgavenTren

Plotta funksjonar

Ein av dei kraftigaste tinga vi kan gjera med programmering er å teikna grafar. Vi bereknar mange funksjonsverdiar og teiknar dei som punkt.

I Python kan vi laga ein enkel "tekst-graf" utan å installera ekstra bibliotek, eller vi kan bruka biblioteket matplotlib for fine grafar.

Her viser vi ein enkel måte å laga ein graf med teikn i terminalen:

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

Lag ein tekstbasert graf av f(x)=x2f(x) = x^2 for xx frå 5-5 til 55.

Løysing:

# Enkel tekstgraf av f(x) = x^2
for x in range(-5, 6):
    y = x**2
    stolpar = "*" * y
    print(f"x = {x:3d} | {stolpar} ({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 tydeleg sjå parabelforma: grafen er symmetrisk om x=0x = 0 og stig raskt for store x|x|.

For ein finare graf kan du bruka matplotlib:

import matplotlib.pyplot as plt

x_verdiar = []
y_verdiar = []

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

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

Skriv eit Python-program som lagar ein tekstgraf (med stjerner) av funksjonen f(x)=2x+3f(x) = 2x + 3 for heiltalsverdia av xx frå 3-3 til 55. Berekn funksjonsverdien for kvar xx og vis resultatet visuelt.

Simulera sannsynlegheit

Ein av dei mest spennande bruksområda for programmering i matematikk er å simulera tilfeldige forsøk. I staden for å berekna sannsynlegheit med formlar, kan vi la datamaskina gjenta forsøket tusenvis av gongar og telja utfalla.

Denna metoden kallast Monte Carlo-simulering, opppkalla etter kasinoet i Monte Carlo.

I Python brukar vi random-modulen for tilfeldige tal:

import random

terning = random.randint(1, 6)   # Tilfeldig heilt tal frå 1 til 6
mynt = random.choice(["kron", "mynt"])  # Tilfeldig val
Monte Carlo-simulering
Ein Monte Carlo-simulering er ein metode der vi brukar tilfeldige tal til å estimera eit resultat. Vi gjentar eit tilfeldig forsøk mange gongar (t.d. 10 000 gongar) og bereknar 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 fleire forsøk vi gjer, desto næmre kjem vi den eksakte sannsynligheten. Med 10 000 forsøk får vi vanlegvis eit godt estimat.

✏️Eksempel: Simulera terningkast

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

Løysing:

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

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

Typisk utskrift:

Antall gongar sum = 7: 1674
Estimert sannsynlegheit: 0.1674

Eksakt sannsynlegheit: 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 gjev eit resultat nær den eksakte verdien! \checkmark

📝Oppgave 3

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

a

Skriv programmet og kjør det.

b

Kva er den eksakte (teoretiske) sannsynligheten? Samanlikn med simuleringen.

📝Oppgave 4

Skriv eit Python-program som simulerer 10 000 kast med to terningar og finn sannsynligheten for å få minst ein seksar.

Finne primtal med programmering

Eit primtal er eit tal større enn 1 som berre er deleleg med 1 og seg sjølv. Dei første primtala er: 2,3,5,7,11,13,17,19,23,2, 3, 5, 7, 11, 13, 17, 19, 23, \ldots

Å finne store primtal er viktig i kryptografi (trygg kommunikasjon på nett). Med programmering kan vi raskt sjekke om tal er primtal og finne alle primtal opp til ei gitt grense.

✏️Døme: Sjekke om eit tal er primtal

Skriv eit Python-program som sjekkar om eit gitt tal er eit primtal.

Løysing:

import math

tal = int(input("Skriv inn eit tal: "))

if tal < 2:
    print(f"{tal} er ikkje eit primtal")
else:
    er_primtal = True
    for i in range(2, int(math.sqrt(tal)) + 1):
        if tal % i == 0:
            er_primtal = False
            break

    if er_primtal:
        print(f"{tal} er eit primtal")
    else:
        print(f"{tal} er ikkje eit primtal")

Triks: Vi treng berre å sjekke divisorar opp til n\sqrt{n}, fordi viss 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 sjekkar 2, 3, 4, 5, 6, 7, 8, 9. Ingen deler 97, altså er 97 eit primtal.

📝Oppgave 5

Skriv eit Python-program som finn og skriv ut alle primtal frå 2 til 100.

a

Skriv programmet.

b

Kor mange primtal er det mellom 2 og 100?

Berekne statistikk med programmering

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

Statistiske mål i Python
Dei viktigaste statistiske måla og korleis vi bereknar dei:

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

Median (den midtarste verdien i sortert rekkjefølgje):
- Viss nn er oddetal: medianen er det midtarste elementet
- Viss nn er partal: medianen er gjennomsnittet av dei to midtarste

Typetal (den verdien som førekjem oftest):
- Talast ved å gå gjennom lista og finne hyppigste verdi

Variasjonsbreidde: Største verdi minus minste verdi

✏️Døme: Statistikkprogram

Skriv eit Python-program som bereknar gjennomsnitt, median og variasjonsbreidde for karakterane [4,5,3,6,5,4,5,3,4,5][4, 5, 3, 6, 5, 4, 5, 3, 4, 5].

Løysing:

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

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

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

# Variasjonsbreidde
variasjonsbreidde = max(karakterar) - min(karakterar)

# Typetal (enkel metode)
typetal = max(set(karakterar), key=karakterar.count)

print(f"Karakterar: {karakterar}")
print(f"Sortert: {sortert}")
print(f"Gjennomsnitt: {gjennomsnitt:.1f}")
print(f"Median: {median}")
print(f"Typetal: {typetal}")
print(f"Variasjonsbreidde: {variasjonsbreidde}")

Utskrift:

Karakterar: [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
Typetal: 5
Variasjonsbreidde: 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: Dei to midtarste er 4 og 5, median =4+52=4,5\displaystyle = \frac{4+5}{2} = 4{,}5 \checkmark

📝Oppgave 6

Brukarane av ei app har gitt desse vurderingane (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 eit Python-program som bereknar gjennomsnitt, median, typetal og variasjonsbreidde.

Oppsummering

I dette kapitlet har du lært:

- Numerisk likningsløysing: Teste mange xx-verdiar systematisk for å finne der f(x)0f(x) \approx 0
- Plotte funksjonar: Lage tekstgrafer med Python, eventuelt bruke matplotlib for fine grafer
- Monte Carlo-simulering: Bruke tilfeldige tal til å estimere sannsynsleiker
- Primtal: Sjekke om tal er primtal ved å teste divisorar opp til n\sqrt{n}
- Statistikk: Berekne gjennomsnitt, median, typetal og variasjonsbreidde med Python

Nøkkelbegrep


BegrepForklaring
Numerisk løysingTilnærma løysing funnen ved systematisk prøving
Monte Carlo-simuleringEstimere resultat ved hjelp av tilfeldige forsøk
PrimtalTal > 1 som berre er deleleg med 1 og seg sjølv
GjennomsnittSummen av alle verdiar delt på tal av verdiar
MedianDen midtarste verdien i ei sortert datamengde
TypetalDen verdien som førekjem oftest
VariasjonsbreiddeDifferansen mellom største og minste verdi
📝Oppgave 7

Du kastar tre terningar. Bruk Python til å simulere 10 000 forsøk og estimer sannsynsleiken for at summen er nøyaktig 10.

a

Skriv programmet og finn den estimerte sannsynsleiken.

b

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

Løs oppgavenTren
📝Oppgave 8

Skriv eit Python-program som brukar Monte Carlo-simulering til å estimere verdien av π\pi. Metoden: Generer tilfeldige punkt (x,y)(x, y) der 0x10 \leq x \leq 1 og 0y10 \leq y \leq 1. Tell kor mange som havnar innanfor kvartssirkelen x2+y21x^2 + y^2 \leq 1. Da er π4innanfortotalt\displaystyle \pi \approx 4 \cdot \frac{\text{innanfor}}{\text{totalt}}.

a

Skriv programmet med 100 000 tilfeldige punkt.

b

Køyr programmet fleire gonger. Kor nær π=3,14159\pi = 3{,}14159\ldots kjem du?

c

Forklar kvifor denne metoden fungerer.

Løs oppgavenTren
📝Oppgave F1
Finn feilen! Maja har skrive eit Python-program som brukar Monte Carlo-simulering til å estimere sannsynsleiken for at summen av to terningar 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

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

Maja er nøgd — programmet køyrer utan feil og gir ca. 0,1670{,}167. Men vennen hennes Liam skriv nesten same program, berre med denne skilnaden:

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

Liam får eit anna (feil) svar. Finn feilen og forklar kva som går gale.

📝Oppgave S1
Sant eller usant?

Ein Monte Carlo-simulering gir alltid eksakt svar.

📝Oppgave D1
Drøftingsoppgåve: I matematikk kan vi ofte finna eksakte svar med algebra (til dømes løsa 2x+3=112x + 3 = 11 og få x=4x = 4). Men nokre gonger brukar vi numeriske metodar — datamaskina prøver seg fram til eit tilnærma svar.

a) Gje eit døme på ei likning som er enkel å løsa eksakt, og ei som er vanskeleg å løsa eksakt.

b) Diskuter: Når er det greitt å bruka eit tilnærma (numerisk) svar i staden for eit eksakt svar? Finnast det situasjonar der eit tilnærma svar ikkje er godt nok?

c) Kvifor trur du programmering og numeriske metodar har blitt så viktige i moderne matematikk og vitenskap?

Repetisjonsoppgåver
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.