Programmeringsoppgaver#
Oppgave 1
Ta quizen!
Oppgave 2
Nedenfor vises en programkode.
Forklar hva programmet regner ut og bestem verdien som skrives ut av programmet. Skriv inn svaret ditt i feltet nedenfor.
Fasit
Programmet regner ut den gjennomsnittlige vekstfarten til \(f(x) = x^2 - 3x + 7\) i intervallet \([0, 5]\). Programmet skriver ut at denne verdien er \(2\).
Oppgave 3
Nedenfor vises en programkode.
Forklar hva programmet regner ut og avgjør hvilke verdier som skrives ut av programmet.
Skriv inn svaret ditt i feltet nedenfor.
Fasit
Programmet bestemmer nullpunktene til \(f(x) = x^2 - 2x - 8\). Vi bestemmer disse med \(abc\)-formelen som gir
som betyr at programmet først skriver ut \(x = -2\) og deretter \(x = 4\).
Endre på programmet slik at det løser likningen
Bestem løsningene med programmet ditt.
Fasit
Vi endrer på \(f(x)\) i programmet slik at vi i stedet bruker \(f(x) = x^2 - x - 6\).
1def f(x):
2 return x**2 - x - 6
3
4for x in range(-10, 11):
5 if f(x) == 0:
6 print(x)
Programmet skriver da ut
-2
3
som betyr at løsningene av \(x^2 - x - 6 = 0\) er
Oppgave 4
En programkode er vist nedenfor.
Forklar hva programmet regner ut og bestem hvilken verdi som skrives ut av programmet.
Sjekk svaret ved å skrive inn i feltet nedenfor.
Fasit
Programmet regner ut summen av de \(4\) først naturlige tallene. Programmet skriver derfor ut verdi
Da en matematiker som het Gauss gikk på skolen, fikk han i oppgave å summere de 100 første heltallene som straff for at han var urolig i timen.
Endre på programmet og bruk det til å løse oppgaven til Gauss.
Fasit
Vi må endre på programmet slik at det summerer opp tallene \(1, 2, \ldots, 99, 100\), som vi kan oppnå ved å bruke range(1, 101)
i stedet for range(1, 5)
. Da får vi programmet:
1s = 0
2
3for n in range(1, 101):
4 s = s + n
5
6print(s)
som gir utskriften
5050
Summen av de 100 første naturlige tallene er derfor \(5050\).
Oppgave 5
I denne oppgaven skal du jobbe med summer av oddetall og partall. Vi lar \(S_n\) være summen av de \(n\) første oddetallene. Nedenfor vises noen av disse summene:
Lag et program som regner ut og skriver ut summene \(S_1, S_2, S_3, \ldots, S_{20}\).
Fasit
1s = 0
2
3for n in range(20):
4 oddetall = 2 * n + 1
5 s = s + oddetall
6 print(s)
som gir utskriften
1
4
9
16
25
36
49
64
81
100
121
144
169
196
225
256
289
324
361
400
Avgjør om summen av de 20 første partallene er større enn summen av de 20 første oddetallene.
Fasit
1s = 0
2
3for n in range(1, 21):
4 partall = 2 * n
5 s = s + partall
6
7print(s)
som gir utskriften
420
Altså er summen av de 20 første partallene større enn summen av de 20 første oddetallene.
Oppgave 6
Nedenfor vises en figur som er satt sammen av uendelig mange linjestykker.
Lengden til et linjestykke er alltid \(90 \%\) av lengden til det forrige linjestykket. Det første linjestykket er \(100\) cm langt.
Lag et program som bestemmer summen av lengdene til de \(10\) første linjestykkene.
Fasit
1s = 0 # summen av lengdene
2lengde = 100 # første linjestykke
3n = 0 # antall linjestykker
4
5while n < 10:
6 s = s + lengde # plusser på lengden
7 n = n + 1 # øk antall linjestykker med 1
8 lengde = 0.9 * lengde # neste lengde = 90% av forrige lengde
9
10print(s)
gir utskriften
651.3215599000001
som betyr at summen av lengdene til de 10 første linjestykkene er ca. \(651.32\) cm.
Hvor mange linjestykker må du legge sammen for at summen av lengdene skal bli minst 9 meter?
Fasit
1s = 0 # summen av lengdene
2lengde = 100 # første linjestykke
3n = 0 # antall linjestykker
4
5while s < 900: # så lengde summen er mindre enn 9 m = 900 cm
6 s = s + lengde # plusser på lengden
7 n = n + 1 # øk antall linjestykker med 1
8 lengde = 0.9 * lengde # neste lengde = 90% av forrige lengde
9
10print(n)
gir utskriften
22
som betyr at vi trenger 22 linjestykker før linjestykket blir lenger enn 9 meter (900 cm).
Hvilken lengde vil lengden av hele figuren nærme seg?
Fasit
Kjører vi programmet med veldig mange linjestykker, vil summen av lengdene nærme seg \(1000\) cm.
Oppgave 7
I figuren nedenfor vises grafen til en rasjonal funksjon gitt ved
Et rektangel har hjørner i punktene \((0,0)\), \((3, 0)\), \((3, f(3))\) og \((0, f(3))\).
Lag et program som regner ut arealet til rektangelet.
Fasit
1def f(x):
2 return 8 / (x**2 + 4)
3
4def A(x):
5 return x * f(x)
6
7
8areal = A(3)
9
10print(areal)
som gir utskriften
1.8461538461538463
som betyr at arealet av rektangelet er omtrent \(1.85\).
Utvid programmet ditt slik at det skriver ut arealet av rektangelene med hjørner i punktet \((0, 0)\), \((k, 0)\), \((k, f(k))\) og \((0, f(k))\) for \(k = \{1, 2, 3, \ldots, 9, 10\}\).
Fasit
1def f(x):
2 return 8 / (x**2 + 4)
3
4def A(x):
5 return x * f(x)
6
7
8for k in range(1, 11):
9 print(k, A(k))
som gir utskriften
1 1.6
2 2.0
3 1.8461538461538463
4 1.6
5 1.3793103448275863
6 1.2000000000000002
7 1.0566037735849056
8 0.9411764705882353
9 0.8470588235294118
10 0.7692307692307693
Første kolonne er verdiene av \(k\) og andre kolonne er arealene av rektanglene.
Utvid programmet ditt og bestem hvilken verdi av \(k \in \langle 0, \to\rangle\) som gir størst mulig areal.
Fasit
Vi starter med den laveste mulige verdien av \(k\), så øker vi \(k\) med en liten verdi så lenge det neste arealet er større enn det nåværende. Når det neste arealet er mindre enn det nåværende, har vi funnet den verdien av \(k\) som gir størst areal:
1def f(x):
2 return 8 / (x**2 + 4)
3
4def A(x):
5 return x * f(x)
6
7
8k = 0
9while A(k) < A(k + 0.01): # Så lenge neste areal er større
10 k = k + 0.01
11
12print(k)
som gir utskriften
2.0000000000000013
som betyr at \(k \approx 2\) gir størst mulig areal.
Oppgave 8
I figuren nedenfor vises en følge av kvadrater der det første kvadratet har sidelengde \(1\). Sidelengdene i det neste kvadratet er \(90 \%\) av sidelengdene i det forrige kvadratet. Slik fortsetter følgen i det uendelige.
Lag et program som regner ut summen av arealene til veldig mange kvadrater.
Fasit
1sidelengde = 1
2n_kvadrater = 1_000_000 # antall kvadrater
3
4sum_arealer = 0 # lagrer summen av arealene
5for i in range(n_kvadrater):
6 areal = sidelengde ** 2 # arealet til kvadratet
7 sum_arealer = sum_arealer + areal # legg til på summen
8
9 sidelengde = 0.9 * sidelengde # neste sidelengde er 90% av forrige
10
11print(sum_arealer)
som gir utskriften
5.263157894736843
som betyr at arealet når vi bruker mange kvadrater er omtrent \(5.26\).
Oppgave 9
I denne oppgaven skal du bestemme arealet av det fargelagte området vist i figuren nedenfor. Funksjonen \(f\) er gitt ved
For å bestemme arealet av det fargelagte området, skal du summere arealene til rektangler som bruker \(f(x)\) som høyde til rektangler for ulike verdier av \(x\) i intervallet \([0, 6]\). Se figurene nedenfor:
Bestem summen av arealene i rektanglene i figuren til venstre ovenfor (med 6 rektangler).
Fasit
Arealet av rektanglene i figuren til venstre ovenfor (med 6 rektangler) er ca. \(21.78\).
Lag et program som regner ut arealet av det fargelagte området ved å bruke \(6000\) rektangler.
Du kan ta utgangspunkt i programmet nedenfor.
Fasit
Programkode:
1def f(x):
2 return 1/9 * (x + 1) * (x - 6) ** 2
3
4x_min = 0
5x_max = 6
6
7n = 6000 # antall rektangler
8
9bredde = (x_max - x_min) / n
10
11areal = 0
12for i in range(n):
13 x = x_min + i * bredde
14 høyde = f(x)
15
16 areal = areal + bredde * høyde
17
18print(areal)
Utskrift:
20.001999777777893
Arealet under grafen til \(f\) i intervallet \([0, 6]\) er derfor omtrent \(20\).
Oppgave 10
En lysstråle ble først observert ved et punkt \(A(1000, 0)\) i luften og deretter i et punkt \(B(10000, -1000)\) i vann.
Alle avstander er målt i meter. Se figuren nedenfor.
Lyset reiser med en fart på \(300 \, \mathrm{m/\mu s}\) (meter per mikrosekund) i luft og \(225 \, \mathrm{m/\mu s}\) i vann. Her står \(1 \, \mathrm{\mu s}\) for 1 mikrosekund som en milliondel av et sekund.
Nedenfor vises et program som regner ut tiden det tar for lyset å reise fra \(A\) til \(M(3000, 0)\).
Pusle sammen programmet i riktig rekkefølge.
Fasit
1from math import sqrt # jeg må være første kodelinje!
2
3def tid_luft(x):
4 fart_luft = 300 # meter per mikrosekund
5
6 AM = sqrt(x**2 + 1000**2) # meter
7 tid = AM / fart_luft # mikrosekunder
8
9 return tid
10
11
12x = 3000
13reisetid = tid_luft(x)
14
15print(f"{reisetid = :.2f} mikrosekunder")
Forklar matematikken bak kodelinje 6 og 7 i programmet.
Fasit
Kodelinje 6 bruker Pytagoras’ setning til å regne ut avstanden \(AM\) der den ene kateten er \(x = 3000\) m og den andre kateten er \(1000\) m.
Kodelinje 7 bruker vei-fart-tid-formelen \(s = v \cdot t\) til å regne ut tiden det tar å reise avstanden \(AM\) i luft, der \(s\) er avstanden, \(v\) er farten og \(t\) er tiden.
Utvid programmet slik at det regner ut tiden det tar for lyset å reise fra \(M\) til \(C\) i vann.
Bruk programmet til å regne ut tiden det tar for lyset å reise helt fra \(A\) til \(C\).
Fasit
1from math import sqrt
2
3def tid_luft(x):
4 fart_luft = 300 # meter per mikrosekund
5
6 AM = sqrt(x**2 + 1000**2) # meter
7 tid = AM / fart_luft # mikrosekunder
8
9 return tid
10
11def tid_vann(x):
12 fart_vann = 225 # meter per mikrosekund
13
14 MC = sqrt((x - 10_000)**2 + 1000**2)
15 tid = MC / fart_vann
16
17 return tid
18
19
20x = 3000
21reisetid = tid_luft(x) + tid_vann(x)
22
23print(f"{reisetid = :.2f} mikrosekunder")
som gir utskriften
reisetid = 41.97 mikrosekunder
som betyr at lyset bruker omtrent \(41.97\) mikrosekunder fra \(A\) til \(C\).
Utvid programmet ditt med en funksjon T(x)
som bruker funksjonen tid_luft(x)
og tid_vann(x)
til å regne ut den totale tiden lysstrålen bruker fra \(A\) til \(C\) når den treffer vannoverflaten i punktet \(M(x, 0)\).
Fasit
Funksjonen må plasseres nedenfor funksjonene tid_luft(x)
og tid_vann(x)
i programmet fra a. Da kan vi definere funksjonen som:
1def T(x):
2 return tid_luft(x) + tid_vann(x)
Ifølge Snells lov, vil lysstrålen vil alltid “velge” den veien mellom \(A\) og \(C\) som gir kortest mulig reisetid.
Utvid programmet ditt og bruk det til å bestemme i hvilket punkt lysstrålen må ha truffet vannoverflaten.
Fasit
Vi må bestemme hvilken verdi av \(x\) som gir minst mulig verdi for \(T(x)\). Dette kan vi gjøre ved å starte med \(x = 0\), og deretter øke \(x\) med et lite tall så lenge reisetiden i \(x\) er større enn reisetiden i \(x + \mathrm{lite \, tall}\). Altså, så lenge
Når \(T(x) \leq T(x + \mathrm{lite \, tall})\), har vi funnet den verdien av \(x\) som gir kortest mulig reisetid.
Utvidelse av programkoden fra b:
x = 0
while T(x) > T(x + 0.01):
x = x + 0.01
print(x)
Utvidelse av programkoden fra b:
1from math import sqrt
2
3def tid_luft(x):
4 fart_luft = 300 # meter per mikrosekund
5
6 AM = sqrt(x**2 + 1000**2) # meter
7 tid = AM / fart_luft # mikrosekunder
8
9 return tid
10
11def tid_vann(x):
12 fart_vann = 225 # meter per mikrosekund
13
14 MC = sqrt((x - 10_000)**2 + 1000**2)
15 tid = MC / fart_vann
16
17 return tid
18
19
20def T(x):
21 return tid_luft(x) + tid_vann(x)
22
23
24x = 0
25while T(x) > T(x + 0.01):
26 x = x + 0.01
27
28print(f"{x = :.2f} meter")
som gir utskriften
x = 8882.18 meter
som betyr at lysstrålen traff vannet omtrentlig i punktet \(M(8882, 0)\).