Løsningsforslag, mer om lister og dictionaries

Negative indekser i lister

Oppgave 1:

Vi oppretter ei liste som heter kvadrat:

kvadrat = [1, 4, 9, 16, 25, 36]

Så skal vi avgjøre hvilke tall kvadrat[-2] og kvadrat[-6] da refererer til.

Negative indekser regnes fra −1 fra høyre mot venstre, så kvadrat[-2] refererer til 25 og kvadrat[-6] til 1.

Tilbake til oppgaven

Deler av lister

Oppgave 1:

Vi oppretter ei liste som heter kvadrat:

kvadrat = [1, 4, 9, 16, 25, 36]

Så skal vi avgjøre hva kvadrat[1:3], kvadrat[:3], kvadrat[2:] og kvadrat[:5:2] da refererer til.

[a:b:c] gir ei liste som består av elementene med indeks fra og med a inntil b i skritt på c. Utelater vi a, betyr det at vi skal starte på første element i lista. Utelater vi b, betyr det at vi skal slutte på siste element i lista. Utelater vi c, betyr det at vi skal bruke 1 som skrittverdi.

kvadrat[1:3] refererer til ei liste med elementene med indekser fra og med 1 inntil 3 i kvadrat, det vil si [4, 9].

kvadrat[:3] refererer til ei liste med elementene fra begynnelsen inntil indeks 3 i kvadrat, det vil si [1, 4, 9].

kvadrat[2:] refererer til ei liste med elementene fra og med indeks 2 til og med siste element i kvadrat, det vil si [9, 16, 25, 36].

kvadrat[:5:2] refererer til ei liste med elementene fra og med begynnelsen inntil indeks 5 i skritt på 2 i kvadrat, det vil si [1, 9, 25].

Tilbake til oppgaven

Kopiere lister

Oppgave 1:

Vi har funksjonen kvadrer(), som gjør endringer i lista siffer vi sender inn som argument:

kvadrer(siffer)

Så skal vi forklare hvordan vi kan skrive om oppkallet av funksjonen slik at siffer ikke endres.

Vi må sørge for at en egen kopi av siffer overføres til kvadrer() ved å skrive

kvadrer(siffer.copy())

eller

kvadrer(siffer[:])

Bruker vi Python Tutor, ser vi ser vi at siffer i hovedprogrammet og liste i kvadrer() er forskjellige lister:

Illustrasjon av hovedprogram og funksjon som refererer til lister som er forskjellige objekter

Tilbake til oppgaven

Sortere lister

Oppgave 1:

Vi skal skrive Python-kode som oppretter lista kaos = [6, −3, 0, 5, 2, 8] og deretter sorterer lista synkende uten at vi angir reverse = True i sort().

Dette kan vi gjøre ved først å sortere og deretter snu rekkefølgen i lista:

kaos = [6, -3, 0, 5, 2, 8]
kaos.sort()
kaos.reverse()

Tilbake til oppgaven

Lister som inneholder lister

Oppgave 1:

Vi oppretter lista grader, som vist under.

grader_uke_1 = [12, 10, 14, 7, 8, 11, 10]
grader_uke_2 = [10, 7, 9, 6, 6, 8, 15]
grader_uke_3 = [10, 5, 3, 6, 4, 3, 2]
grader = [grader_uke_1, grader_uke_2, grader_uke_3]

Så skal vi avgjøre hva som blir skrevet ut hvis vi kjører følgende kode:

print(grader[1][2])
print(grader[2][1])
print(grader[0])

grader[1][2] betyr at vi skal bruke element nummer 1 i grader, altså grader_uke_2, og element nummer 2 i denne lista, så vi får skrevet ut 9.

grader[2][1] betyr at vi skal bruke element nummer 2 i grader, altså grader_uke_3, og element nummer 1 i denne lista, så vi får skrevet ut 5.

grader[0] har bare én indeks, så dette er hele element nummer 0, som er lista grader_uke_1. Så vi får skrevet ut [12, 10, 14, 7, 8, 11, 10].

Tilbake til oppgaven

Løsningsforslag, funksjoner

Skrive funksjoner

Oppgave 1:

Vi skal skrive en Python-funksjon, cels_til_fahr(), som regner om fra grader Celsius til grader Fahrenheit ved hjelp av formelen $f = {\large \frac{9c}{5}} + 32$, der f er grader Fahrenheit og c grader Celsius. Funksjonen kan bli slik:

def cels_til_fahr(celsius):
    """Konverterer fra grader Celsius til grader Fahrenheit."""
    fahrenheit = 9 * celsius / 5 + 32
    return fahrenheit

Vi skriver så

print(f"{cels_til_fahr(10):.02f}")

i hovedprogrammet. Når vi kjører koden, svarer Python 50.00.

Tilbake til oppgaven

Oppgave 2:

Vi skal skrive en Python-funksjon som finner og returnerer det minste av to tall.

Vi bruker funksjonen i eksempel 4 som mal, endrer funksjonsnavnet fra storst til minst og snur ulikhetstegnet:

def minst(tall_1, tall_2):
    """Finner det minste av to tall."""
    if tall_1 < tall_2:
        return tall_1
    else:
        return tall_2

For å teste funksjonen kan det være lurt å prøve med en variant der tall_1 < tall_2, en variant der tall_1 > tall_2, og en variant der tall_1 == tall_2. Så i hovedprogrammet skriver vi 

print(minst(1, 2))
print(minst(2, 1))
print(minst(1, 1))

Vi får skrevet ut 1 i alle tre tilfeller.

Tilbake til oppgaven

Funksjonsparametere

Oppgave 1:

Vi skal skrive en Python-funksjon som simulerer terningkast, det vil si genererer tilfeldige tall mellom 1 og 6, og returnerer resultatet.

Funksjonen kan se som vist under. I hovedprogrammet før funksjonen importerer vi randint.

from random import randint

def terningkast():
    """Simulerer et terningkast."""
    return randint(1, 6)

Hvis vi i hovedprogrammet skriver

print(terningkast())

vil vi få skrevet ut et vilkårlig tall mellom 1 og 6.

Tilbake til oppgaven

Oppgave 2:

Vi har funksjonen normal(x, my = 0, sigma = 1) som beregner sannsynlighetstetthet i en normalfordeling.

Så skal vi skrive kode som bruker normal() til å beregne sannsynlighetstettheten til 3 i en normalfordeling der sigma er 5, men my beholder standardverdien 0.

Vi kan ikke hoppe over my og bare gi en verdi til sigma, for skriver vi normal(3, 5), er det my som blir satt til 5, men sigma beholder standardverdien 1. Vi navngir derfor parameteren sigma, og skriver

normal(3, sigma = 5)

Tilbake til oppgaven

Lokale og globale variabler

Oppgave 1:

Vi har funksjonen kvadrer(), som vist under:

def kvadrer(y):
    """Kvadrerer y."""
    z = y**2
    return z

Så skal vi avgjøre hva som blir skrevet ut når vi i hovedprogrammet skriver

y = 5
z = 6
y = kvadrer(z)
print(f"y = {y}, z = {z}")

Her er det gjort et forsøk på å forvirre ved å bruke variablene y og z både i funksjonen og i hovedprogrammet. Men variablene i funksjonen er lokale, og vi trenger ikke ta hensyn til dem i det hele tatt. Alt vi trenger å vite er at kvadrer() returnerer den kvadrerte verdien av det vi gir inn som argument. Når z = 6, blir derfor y = kvadrer(6) = 62 = 36, og vi får skrevet ut y = 36, z = 6.

Tilbake til oppgaven

Funksjoner i Python Tutor

Oppgave 1:

Vi har bildet under av kode i Python Tutor, der vi har klikket oss fram så langt at verdien til returvariabelen er beregnet, men funksjonen ikke har returnert. Så skal vi tegne en skisse av hvordan vi tror høyre side av bildet i Python Tutor ser ut.

Oppgave i Python Tutor

Høyre side ser slik ut:

Løsningsforslag i Python Tutor

Vi ser at kvadrer er en variabel med en pil som peker til en funksjon. Vi ser også at vi har variablene y = 5 og z = 6 i hovedprogrammet, slik de er blitt opprettet i linje 6 og 7.

Videre ser vi at kvadrer() er en funksjon med lokale variabler y = 6 og z = 36. y er 6 fordi parameteren y fikk verdien 6 fra argumentet z i funksjonskallet. z er 36 fordi z er beregnet som y2 = 62 = 36. Returverdien er 36 fordi returverdien er verdien til z.

Tilbake til oppgaven

Lagre funksjoner i moduler

Oppgave 1:

Vi skal først skrive funksjonen fakultet(), slik den er vist, inn i ei tom fil, og lagre fila med navnet kombinatorikk.

Vi åpner ei ny fil i Thonny ved å velge «Fil» – «Ny», og limer inn koden under:

def fakultet(n):
    """Beregner n!"""
    if n == 0:
        return 1
    else:
        produkt = 1
        for m in range(1, n + 1):
            produkt *= m
        return produkt

Så velger vi «Fil» – «Lagre» eller «Fil» -«Lagre som», og oppgir kombinatorikk som navn. Thonny lagrer fila med navnet kombinatorikk.py, der py betyr at det dreier seg om ei fil med Python-kode.

Så skal vi åpne ei ny fil, importere fakultet() fra kombinatorikk, bruke fakultet() til å beregne fakultetet til 5, og skrive ut resultatet.

Vi åpner ei ny fil i Thonny, og skriver inn kode tilsvarende dette:

from kombinatorikk import fakultet

print(fakultet(5))

Vi kan alternativt velge å importere hele modulen kombinatorikk. Da må vi referere til fakultet som kombinatorikk.fakultet:

import kombinatorikk

print(kombinatorikk.fakultet(5))

Når vi kjører koden, får vi skrevet ut 120.

Tilbake til oppgaven

Funksjoner som kaller funksjoner

Oppgave 1:

Vi skal åpne fila kombinatorikk og legge til funksjonen kombinasjon(), slik den er vist, og lagre fila igjen.

Vi velger «Fil» – «Åpne» i Thonny, og klikker på kombinatorikk.py. Så legger vi til koden til kombinasjon() under funksjonen fakultet(). Hele fila ser nå slik ut:

def fakultet(n):
    """Beregner n!"""
    if n == 0:
        return 1
    else:
        produkt = 1
        for m in range(1, n + 1):
            produkt *= m
        return produkt

def kombinasjon(n, k):
    """Beregner antall kombinasjoner av k blant n"""
    return int(fakultet(n) / (fakultet(k) * fakultet(n - k)))

Vi har her brukt 2 tomme linjer mellom de to funksjonene, det er i henhold til stilguiden PEP 8, men det har ingen betydning for virkemåten.

Vi lagrer så fila igjen ved å velge «Fil» – «Lagre», eller trykke <ctrl>s.

Så skal vi åpne ei ny fil, importere kombinasjon() fra kombinatorikk, bruke kombinasjon() til å beregne antall kombinasjonsmuligheter når 7 elementer velges fra en mengde på 34, og skrive ut resultatet.

Vi åpner ei ny fil i Thonny, og skriver inn kode tilsvarende dette:

from kombinatorikk import kombinasjon
 
print(kombinasjon(34, 7))

Vi kan alternativt velge å importere hele modulen kombinatorikk. Da må vi referere til kombinasjon som kombinatorikk.kombinasjon:

import kombinatorikk

print(kombinatorikk.kombinasjon(34, 7))

Når vi kjører koden, får vi skrevet ut 5379616.

Tilbake til oppgaven

Oppgave 2:

Vi skal skrive en funksjon som beregner sannsynligheten for få k «kron» i n flipp med en mynt, basert på at $P(k) = {\large \binom{n}{k}} \cdot (0{,}5)^n$.

Vi har kalt funksjonen sanns_kron(), men den kan hete hva som helst. Før funksjonen importer vi kombinasjon() fra modulen kombinatorikk, fordi vi trenger den til å beregne ${\large \binom{n}{k}}$.

Koden kan se slik ut:

from kombinatorikk import kombinasjon

def sanns_kron(n, k):
    """Beregner sanns. for k kron i n flipp med en mynt"""
    return kombinasjon(n, k) * 0.5**n

Vi kan alternativt velge å importere hele modulen kombinatorikk. Da må vi referere til kombinasjon som kombinatorikk.kombinasjon:

import kombinatorikk

def sanns_kron(n, k):
    """Beregner sanns. for k kron i n flipp med en mynt"""
    return kombinatorikk.kombinasjon(n, k) * 0.5**n

Hvis vi i hovedprogrammet skriver

print(sanns_kron(7, 5))

 får vi skrevet ut 0,1640625 når vi kjører koden,

Tilbake til oppgaven

Oppgave 3:

Vi skal utvide funksjonen fra oppgave 2 slik at den beregner sannsynligheten for at en hendelse med sannsynlighet p skal inntreffe k ganger i n forsøk, basert på at $P(k) = {\large \binom{n}{k}} \cdot p^k \cdot {(1-p)}^{(n-k)}$. Funksjonen skal hete binomisk(), og ligge i fila kombinatorikk under fakultet() og kombinasjon().

Vi velger «Fil» – «Åpne» i Thonny, og klikker på kombinatorikk.py. Så legger vi til koden til den nye funksjonen, som kan se slik ut:

def binomisk(n, k, p):
    """Beregner sanns. for k i n forsøk med sannsynlighet p"""
    return kombinasjon(n, k) * p**k * (1 - p)**(n - k)

Vi lagrer så fila igjen ved å velge «Fil» – «Lagre», eller trykke <ctrl>s.

Så skal vi åpne ei ny fil, importere binomisk() fra kombinatorikk, bruke binomisk() til å beregne sannsynligheten for at en hendelse med sannsynlighet 0,2 skal inntreffe 4 ganger i 8 forsøk, og skrive ut resultatet med 5 desimaler.

Vi åpner ei ny fil i Thonny, og skriver inn kode tilsvarende dette:

from kombinatorikk import binomisk
 
print(f"{binomisk(8, 4, 0.2):.5f}")

Vi kan alternativt velge å importere hele modulen kombinatorikk. Da må vi referere til binomisk som kombinatorikk.binomisk:

import kombinatorikk
 
print(f"{kombinatorikk.binomisk(8, 4, 0.2):.5f}")

Når vi kjører koden, får vi skrevet ut 0,04588.

Tilbake til oppgaven

Rekursjon

Oppgave 1:

Vi skal skrive en rekursiv funksjon som beregner summen av de n første leddene av den harmoniske rekka ${\large\frac{1}{1}} + {\large\frac{1}{2}} + {\large\frac{1}{3}} + \dots + {\large\frac{1}{n}}$

Vi baserer oss da på at

S1 = 1

og

$S_n = {\large \frac{1}{n}} + S_{n-1}$

Denne definisjonen kan vi kode direkte:

def harmonisk(n):
    """Beregner 1/1 + 1/2 + ... + 1/n"""
    if n == 1:
        return 1
    else:
        return 1/n + harmonisk(n - 1)

I hovedprogrammet skriver vi 

print(f"{harmonisk(10):.5f}")

Når vi kjører koden, får vi skrevet ut 2,92897.

Tilbake til oppgaven

Oppgave 2:

Vi har en rekursiv funksjon, summer():

def summer(n):
    if n == 1:
        return n
    else:
        return n + summer(n - 1)

Så skal vi gjøre en analyse av koden med penn og papir, og forklare hva som blir skrevet ut når vi i hovedprogrammet skriver

print(summer(3))

Først kalles summer() opp fra print() med argument 3. Deretter kaller summer() seg selv rekursivt to ganger med argumenter lik henholdsvis 2 og 1. Deretter vil vi få returverdier på henholdsvis 1, 2 + 1 = 3 og 3 + 3 = 6, så vi får skrevet ut 6.

Så skal vi forklare hva skjer hvis vi i stedet skriver

print(summer(-3))

I dette tilfellet vil vi få en uendelig kjede av rekursive kall fordi grunnbetingelsen n = 1 aldri blir nådd. Etter noe tid vil kjøringen av koden avsluttes med en feilmelding om for stor rekursjonsdybde.

Tilbake til oppgaven

 

Løsningsforslag, lister og dictionaries

Lister

Oppgave 1:

Vi har lista demo, som ser slik ut:

demo
"a" "b" "c" "d" "e"
Så skal vi avgjøre hvordan lista vil se ut etter at vi har kjørt følgende kode i Python:

demo[1] = demo[2]
demo[3] = demo[4]

Vi husker at indeksering starter på 0, så elementet med indeks 1 er "b", elementet med indeks 2 er "c", elementet med indeks 3 er "d", og elementet med indeks 4 er "e".

Så først erstattes "b" med "c", og lista ser slik ut:

demo
"a" "c" "c" "d" "e"
Deretter erstattes "d" med "e", og lista ser slik ut:
demo
"a" "c" "c" "e" "e"

Vi kontrollerer ved å skrive kode som først oppretter demo, deretter gjør endringene, og til slutt skriver demo ut:

demo = ["a", "b", "c", "d", "e"]
demo[1] = demo[2]
demo[3] = demo[4]
print(demo)0

Vi får skrevet ut ['a', 'c', 'c', 'e', 'e'].

Tilbake til oppgaven

Oppgave 2:

Vi har lista demo, med 5 elementer, og skal forklare hvorfor vi får feilmeldingen "IndexError: list index out of range" når vi skriver

print(demo[5])

Siden indeksering starter på 0, refererer demo[5] til et sjette element som ikke finnes, og vi får derfor en feilmelding.

Tilbake til oppgaven

Oppgave 3:

Vi oppretter variabelen diverse slik:

diverse = [3, "2", 1.0]

Så skal vi avgjøre hvilken datatype følgende da har:

    • diverse. Dette er ei liste.
    • diverse[0]. Dette er element 0 i lista diverse, som er et heltall.
    • diverse[1]. Dette er element 1 i lista diverse, som er en streng.
    • diverse[2]. Dette er element 2 i lista diverse, som er et flyttall.

For å sjekke kjører vi koden

diverse = [3, "2", 1.0]
print(type(diverse))
print(type(diverse[0]))
print(type(diverse[1]))
print(type(diverse[2]))

Tilbake til oppgaven

Opprette lister

Oppgave 1:

Vi skal skrive kode for å opprette følgende:

    • Ei liste som heter lottotrekning og inneholder tallene 2, 9, 10, 15, 16, 22 og 26.
    • Ei liste som heter basis og inneholder 10 tall som alle er lik 1.
    • Ei liste som heter hurra og inneholder 3 strenger som alle er "hipp".
    • Ei liste som heter lottotall og inneholder tallene fra og med 1 til og med 34.

Etterpå skal vi bruke print() for å sjekke at listene er blitt riktige.

I lottotrekning er det ikke noe system i tallene, så vi må opprette lista ved å ramse opp innholdet:

lottotrekning = [2, 9, 10, 15, 16, 22]

I basis skal alle tallene være lik 1, så vi kan opprette lista ved å angi et element som er 1, og så indikere at dette skal gjentas 10 ganger:

basis = [1] * 10

hurra følger samme mønster som basis, så vi skriver:

hurra = ["hipp"] * 3

I lottotall skal tallene være en følge fra 1 til 34, så lista kan vi opprette ved å bruke list() og range():

lottotall = list(range(1, 35))

For å sjekke innholdet, skriver vi

print(lottotrekning)
print(basis)
print(hurra)
print(lottotall)

Tilbake til oppgaven

Liste-metoder

Oppgave 1:

Vi skal skrive Python-kode som oppretter lista demo, som ser slik ut:

demo
7 -3 8 4 8

Deretter skal vi skrive Python-kode som

    • Legger til 9 på slutten.
    • Setter inn −4 foran elementet med indeks 3.
    • Fjerner og skriver ut elementet med indeks 1.
    • Fjerner elementet med verdi 4.
    • Utvider lista med lista [6, 3, 5].

Vi oppretter først lista

demo = [7, -3, 8, 4, 8]

For å legge til 9 på slutten skriver vi

demo.append(9)

For å sette inn −4 foran elementet med indeks 3 skriver vi

demo.insert(3, -4)

For å fjerne og skrive ut elementet med indeks 1 skriver vi

print(demo.pop(1))

For å fjerne verdien 4 skriver vi

demo.remove(4)

For å utvide lista med lista [6, 3, 5] skriver vi

demo.extend([6, 3, 5])

<eller

demo += [6, 3, 5]

Etter hver operasjon skriver vi lista ut:

print(demo)

Tilbake til oppgaven

Lister i Python Tutor

Oppgave 1:

Vi skal forsøke å forutse hva som vil skje i Python Tutor når vi kjører koden under, linje for linje.

kvadrattall = []
for n in range(1, 5):
    kvadrattall.append(n**2)

Ved første klikk på «Next >» opprettes kvadrattall som en variabel med ei pil til ei tom liste. Ved andre klikk opprettes n som en variabel med verdi 1. Ved tredje klikk legges n2, det vil si 12 = 1 inn som første element i lista. Ved påfølgende klikk økes verdien til n med 1, og n2 legges til bakerst i lista. Dette fortsetter inntil n har fått verdien 4, og 42 = 16 er lagt til. (Vi husker at sluttverdien i range() ikke tas med, så 4 er siste verdi for n.) Resultatet ser slik ut:

Python Tutor etter ferdig kjøring av koden i oppgaven

Tilbake til oppgaven

Gjennomløpe lister

<>Oppgave 1:

Vi skal skrive Python-kode som oppretter ei liste som inneholder alle oddetall fra og med 1 til og med 19, og skriver dem ut, ett for ett.

For å generere oddetallene skriver vi range(1, 21, 2), som vil generere tall i skritt på 2 fra og med 1 inntil 21. (Det vil gjøre samme nytte å bruke 20 som sluttverdi, men vi holder oss til oddetall for logikkens skyld.) range() bruker vi så som argument til list(). Deretter bruker vi ei for-løkke til å hente ut og skrive ut tallene i lista. Koden kan se ut som vist under. Vi har kalt lista oddeliste, men den kan hete hva som helst.

# Oppretter ei liste med oddetallene fra 1 til 19,
# og skriver dem ut
oddeliste = list(range(1, 21, 2))
for oddetall in oddeliste:
    print(oddetall)

Tilbake til oppgaven

Oppgave 2:

Vi skal endre koden fra oppgave 1 slik at også nummeret på oddetallet skrives ut, sammen med litt forklarende tekst. Vi tar da i bruk enumerate() med startverdi 1, og bruker en f-streng i utskriften. Koden kan se slik ut:

# Oppretter ei liste med oddetallene fra 1 til 19,
# og skriver dem ut nummerert
oddeliste = list(range(1, 21, 2))
for nummer, oddetall in enumerate(oddeliste, start = 1):
    print(f"Oddetall nummer {nummer} er {oddetall}")

Tilbake til oppgaven

Oppgave 3:

Vi skal endre koden fra oppgave 1 slik at den bruker indekser til å skrive ut lista med oddetallene i omvendt rekkefølge.

Vi bruker da range() til å generere indekser som går fra siste indeks ned til første. Koden kan se ut som vist under.

# Oppretter ei liste med oddetallene fra 1 til 19,
# og skriver dem ut i baklengs rekkefølge
oddeliste = list(range(1, 21, 2))
for n in range(len(oddeliste) - 1, -1, -1):
    print(oddeliste[n])

Startverdien til range() blir len(oddeliste) − 1. Vi må trekke fra 1 fordi siste indeks i ei liste med n elementer er n − 1. Sluttverdien blir −1 fordi siste verdi i range() ikke tas med, og vi må ha med tallet 0. Skrittverdien blir −1 fordi vi går nedover i skritt på 1.

Alternativt setter vi startverdien til len(oddeliste) og sluttverdien til 0, og trekker fra 1 når vi bruker indeksen, slik det er vist under.

# Oppretter ei liste med oddetallene fra 1 til 19,
# og skriver dem ut i baklengs rekkefølge
oddeliste = list(range(1, 21, 2))
for n in range(len(oddeliste), 0, -1):
    print(oddeliste[n - 1])

Tilbake til oppgaven

«break»

Oppgave 1:

En student har skrevet koden under, som er ment å la brukeren skrive inn en streng, og så skrive ut en melding om strengen inneholder minst én vokal::

# Leser inn streng og sjekker om den inneholder vokal
streng = input("Streng å søke i: ")
for vokal in "aeiouyæøå":
    if vokal in streng:
        print("Strengen inneholder vokal.")
    else:
        print("Strengen inneholder ingen vokaler.")

Men koden virker ikke som tenkt, og vi skal forklare hva problemet er og skrive koden riktig.

Problemet er at koden for hver enkelt vokal i strengen "aeiouyæøå" skriver ut om akkurat den vokalen finnes i strengen eller ikke. Her må vi i stedet bruke break og else:

# Leser inn streng og sjekker om den inneholder vokal
streng = input("Streng å søke i: ")
for vokal in "aeiouyæøå":
    if vokal in streng:
        print("Strengen inneholder vokal.")
        break
else:
    print("Strengen inneholder ingen vokaler.")

Hvis vi i denne koden finner en vokal i strengen, får vi skrevet ut teksten Strengen inneholder vokal., og gjennomløpet av løkka avbrytes med break. else-blokka blir da ikke utført. Hvis løkka ikke blir avbrutt, men kjøres til siste vokal er sjekket, blir else-blokka utført, og teksten Strengen inneholder ingen vokaler. skrives ut.

Tilbake til oppgaven

Søke i lister

Oppgave 1:

Vi skal skrive kode som oppretter lista ensifrede, som inneholder heltallene fra og med 1 til og med 9, og skriver ut hvor mange av tallene i lista som er delelige med 4.

For å opprette lista bruker vi hintet, og skriver list(range(1, 10)).

Så bruker vi ei for-løkke til å gjennomløpe lista og telle hvor mange tall i lista som er delelige med 4. Koden kan se slik ut:

# Oppretter ei liste med tallene fra 1 til 9,
# og teller antall tall delelig med 4 i lista
ensifrede = list(range(1, 10))
antall = 0
for tall in ensifrede:
    if tall % 4 == 0: # Tallet er delelig med 4
    antall += 1
print(f"Lista inneholder {antall} tall som er delelige med 4.")

Tilbake til oppgaven

Opprette lister med inline-«for»

Oppgave 1:

Vi har koden under, som oppretter ei liste, y, med kvadratet av heltallene fra 1 til 10. 

# Oppretter lista y med tallene 1, 4, 9, ..., 100
y = []
for n in list(range(1, 11))
    y.append(n**2)

Så skal vi skrive om koden slik at den bruker inline-for til å opprette y. Koden kan se slik ut:

# Oppretter lista y med tallene 1, 4, 9, ..., 100
y = [n**2 for n in list(range(1, 11))]

Tilbake til oppgaven

Oppgave 2:

Vi har koden under, som oppretter ei liste, x, med heltallene fra 1 til 10, og ei liste, z, med 5n2 + 3n − 4 for hver n i x.

# Oppretter lista x med tallene 1 ... 10,
# og lista z med 5*n**2 + 3 * n - 4 for hver n i x
x = list(range(1, 11))
z = []
for n in x:
    z.append(5 * n**2 + 3 * n - 4)

Så skal vi skrive om koden slik at den bruker inline-for til å opprette z. Koden kan se slik ut:

# Oppretter lista x med tallene 1 ... 10,
# og lista z med 5n**2 + 3n - 4 for hver n i x
x = list(range(1, 11))
z = [5 * n**2 + 3 * n - 4 for n in x]

Tilbake til oppgaven

Dictionaries

Oppgave 1:

Vi skal skrive kode som

    • Oppretter en dictionary som heter landsprefiks, og inneholder følgende nøkkel-verdi-par: "Afghanistan": 93, "Albania": 355, "Algerie": 213, "Andorra": 0, "Angola": 244.

Vi oppretter landsprefiks som en dictionary ved å angi par med nøkler og verdier mellom krøllparenteser:

landsprefiks = {
    "Afghanistan": 93,
    "Albania": 355,
    "Algerie": 213,
    "Andorra": 0,
    "Angola": 244
}
    • Endrer verdien tilknyttet nøkkelen "Andorra" til 376 og legger til paret "Anguilla": 1264.

Vi bruker metoden update() og skriver:

landsprefiks.update({"Andorra": 376, "Anguilla": 1264})

Alternativt kan vi skrive

landsprefiks["Andorra"] = 376
landsprefiks["Anguilla"] = 1264
    • Slår opp og skriver ut verdien knyttet til nøkkelen "Angola".

Vi bruker metoden get() med "Angola" som nøkkel, og skriver:

print(landsprefiks.get("Angola"))
    • Slår opp og skriver ut meldingen "Ukjent land" ved oppslag med nøkkelen "Argentina".

Vi bruker igjen get(), men tar med "Ukjent land" som en streng get() skal returnere hvis nøkkelen ikke finnes:

print(landsprefiks.get("Argentina", "Ukjent land"))

Tilbake til oppgaven

Telle med dictionaries

Oppgave 1:

Vi har koden under, som bruker funksjonen randint() fra modulen random til å simulere kast med to terninger, og registrere summen av antall øyne på de to terningene.

from random import randint

oyne = randint(1, 6) + randint(1, 6)

Så skal vi skrive Python-kode som gjør en million slike simuleringer og teller opp og skriver ut hvor ofte de forskjellige summene av øyne forekommer. Utskriften skal være sortert på sum øyne.

Vi bruker de samme mekanismene som i eksempelet med å telle forekomster av tegn i en streng. Vi må også ha ei løkke som gjennomløpes en million ganger.

Koden kan se slik ut:

from random import randint

antall = {}  # Tom dictionary
for _ in range(1000000):
    oyne = randint(1, 6) + randint(1, 6)
    # Øk antall forekomster med 1
    antall.update({oyne: antall.get(oyne, 0) + 1})
antall = sorted(antall.items())
print(antall)

Tilbake til oppgaven

Løsningsforslag, mer om Python

Python Tutor

Oppgave 1:

Vi skal legge inn koden under i Python Tutor, og bruke «Next >» til å gå gjennom den skritt for skritt.

for n in range(1, 5):
    if n % 2 == 0:
        print(f"{n} er et partall")
    else:
        print(f"{n} er et oddetall")

Illustrasjon av kjøring i Python Tutor

Mens vi klikker, ser vi at pila i hvert gjennomløp av løkka peker på rad 1 og 2, men bare annen hver gang på rad 3 og 5, avhengig av om n er partall eller oddetall.

Tilbake til oppgaven

Konstanter

Oppgave 1:

Vi skal skrive Python-kode som leser inn et antall nautiske mil, konverterer til kilometer, og skriver ut resultatet med 3 desimaler. Det er oppgitt at 1 nm = 1,852 km, og vi skal representere konverteringsfaktoren som en konstant i koden.

Koden kan se slik ut:

# Leser inn nautiske mil og konverterer til kilometer
NM_TIL_KM = 1.852
nm = float(input("Oppgi antall nautiske mil: "))
km = nm * NM_TIL_KM
print(f"{nm:.3f} nautiske mil er {km:.3f} kilometer.")

Tilbake til oppgaven

Metoder

Oppgave 1:

Vi har Python-koden

hilsen = "GOD MORGEN, ALLE SAMMEN!"

og skal skrive kode som skriver ut hilsen med bare små bokstaver.

Vi leter på referansesiden Python String Methods. og finner ut at metoden vi trenger heter lower(). Så koden blir

print(hilsen.lower())

Tilbake til oppgaven

Import fra moduler

Oppgave 1:

Vi skal skrive Python-kode som bruker funksjonen randint() i modulen random til å simulere terningkast.

Koden kan se slik ut:

from random import randint

print(f"Terningkast {randint(1, 6)}")

Alternativt

import random

print(f"Terningkast {random.randint(1, 6)}")

Tilbake til oppgaven

Oppgave 2:

Vi skal endre koden fra oppgave 1 slik at randint() blir importert med alias rint() og brukt i koden.

Vi legger da til teksten as rint bak randint, og bruker rint() i stedet for randint() i koden.

from random import randint as rint

print(f"Terningkast {rint(1, 6)}")

Hvis vi velger varianten med å importere hele modulen, kan vi bare gi alias til modulnavnet, ikke enkeltfunksjoner i modulen.

Tilbake til oppgaven

Logiske operatorer

Oppgave 1:

Vi skal analysere Python-koden under og avgjøre om den vil skrive ut True eller False

x = -3
y = 4
print( x > 0 or x < y)

Her er to betingelser. Den første, x > 0, er False fordi x = −3. Den andre, x < y, er True fordi x = −3 og y = 4. Siden de to betingelsene er bundet sammen med or, og minst én av dem er True, vil det bli skrevet ut True.

Tilbake til oppgaven

Oppgave 2:

Vi skal analysere to linjer med Python-kode og avgjøre om de vil skrive ut True eller False.

print(True or False and False)

Siden and har høyere prioritet enn or, får vi:
True or False and FalseTrue or FalseTrue
Python vil skrive ut True.

print(True and False or not(False and True))

Siden parenteser beregnes først, deretter not, and og or, får vi:
True and False or not(False and True) → True and False or not(False) → True and False or TrueFalse or TrueTrue
Python vil skrive ut True.

Tilbake til oppgaven

Boolsk algebra

Oppgave 1:

Ved å sette opp sannhetstabeller skal vi bevise:

    • a == True er det samme som a.

a kan enten være True eller False, og vi kan sette opp følgende sannhetstabell:

a True False
a == True True == TrueTrue False == TrueFalse

Vi ser at resultatet er likt i begge tilfeller.

    • not (a or b) er det samme som not a and not b.

a og b kan være henholdsvis True og False, og vi kan sette opp følgende sannhetstabell:

a True True False False
b True False True False
not (a or b) not (True or True)
not TrueFalse
not (True or False)
not TrueFalse
not (False or True)
not TrueFalse
not (False or False)
not False True
not a and not b not True and not True
False and FalseFalse
not True and not False
False and TrueFalse
not False and not True
True and FalseFalse
not False and not False
True and TrueTrue

Vi ser at resultatet er likt i alle 4 tilfeller.

Tilbake til oppgaven

Løsningsforslag, forgreininger og løkker

Forgreininger med «if»

Oppgave 1:

Et krydder som selges i løsvekt, koster kr 0,90 per gram hvis vi kjøper inntil 25 gram og kr 0,80 per gram hvis vi kjøper 25 gram eller mer. Vi skal skrive Python-kode som leser inn vekt og skriver ut gramprisen. Koden kan se slik ut:

# Les inn vekt og skriv ut grampris på krydder
vekt = int(input("Oppgi antall gram: "))
if vekt < 25:
    pris = 0.9
else:
    pris = 0.8
print(f"Grampris er kr {pris}.")

Tilbake til oppgaven

Oppgave 2:

En student har skrevet koden under for å doble verdien til variabelen x hvis x er større enn 0, men la x være uendret ellers:

if x > 0:
    x *= 2
else:
    x = x

En annen student har skrevet koden under for å gjøre det samme:

if x > 0:
    x *= 2
else:
    pass

Vi skal vurdere om én av de to variantene er bedre enn den andre, og om koden eventuelt kan skrives på en enklere måte.

Begge variantene inneholder kode som ikke har noen effekt, så ingen av dem er særlig bra. Men å sette en variabel lik seg selv, slik som x = x, er alltid meningsløst, så den første varianten er kanskje håret dårligere enn den siste.

Det er ikke uvanlig at studenter tar med en else som ikke har noen effekt, slik som her. Grunnen er antakelig at vi ofte bruker else sammen med if, og at de derfor tror at det er et krav å ha med else. Som en plassholder putter de så inn kode som ikke gjør noe. Men hvis vi ikke har meningsfull kode til else-blokka, sløyfer vi bare else. Så en kode som gjør akkurat det samme, kan se slik ut:

if x > 0:
    x *= 2

Tilbake til oppgaven

Oppgave 3:

I koden under er det brukt en innrykket kommentar i stedet for kodeordet pass, og vi skal vurdere om koden er riktig.

radius = int(input("Oppgi radius: "))
if radius >= 0:
# Kommer senere
else:
    print("Radius kan ikke være negativ.")

Koden er ikke riktig. Kommentarer blir ignorert av Python, så slik Python ser det, står det ikke noe på den innrykkede linja. Vi har derved en tom kodeblokk, og vi får en feilmelding.

Tilbake til oppgaven

Strukturere «if»

Oppgave 1:

Vi skal fjerne overflødige betingelser i Python-koden under.

vekt = int(input("Oppgi vekt i gram: "))
if vekt < 25:
    pris = 0.90
elif 25 <= vekt < 50:
    pris = 0.80
elif 50 <= vekt < 100:
    pris = 0.75
elif vekt >= 100:
    pris = 0.70
print(f"Total pris på {vekt} g krydder er kr {pris * vekt:.2f}")

Hvis vi kommer til første elif, vet vi allerede at 25 <= vekt, så denne betingelsen kan fjernes. Hvis vi kommer til andre elif, vet vi allerede at 50 <= vekt, så denne betingelsen kan fjernes. Hvis vi kommer til tredje elif, vet vi allerede at vekt >= 100, så denne betingelsen kan erstattes med else. Koden kan se ut som vist under:

vekt = int(input("Oppgi vekt i gram: "))
if vekt < 25:
    pris = 0.90
elif vekt < 50:
    pris = 0.80
elif vekt < 100:
    pris = 0.75
else:
    pris = 0.70
print(f"Total pris på {vekt} g krydder er kr {pris * vekt:.2f}")

Så skal vi skrive om koden slik at betingelsene sjekkes i omvendt rekkefølge. Koden kan da se slik ut:

vekt = int(input("Oppgi vekt i gram: "))
if vekt >= 100:
    pris = 0.70
elif vekt >= 50:
    pris = 0.75
elif vekt >= 25:
    pris = 0.80
else:
    pris = 0.90
print(f"Total pris på {vekt} g krydder er kr {pris * vekt:.2f}")

Tilbake til oppgaven

Nøstede forgreininger

Oppgave 1:

Vi har koden under, som beregner og skriver ut pris på et kjøp av lysdioder:

# Leser inn antall lysdioder, og skriver ut stykkpris og totalpris
antall = int(input("Hvor mange lysdioder vil du kjøpe? "))
if antall < 10:
    stykkpris = 3.50
elif antall < 100:
    stykkpris = 3.00
else:
    stykkpris = 2.50
print(f"{antall} lysdioder à kr {stykkpris:.02f}, totalt kr {antall*stykkpris:.02f}.")
    1. Vi skal utvide koden med en ytre if som sjekker at antall kjøpte dioder er større enn 0, og skriver ut en feilmelding hvis ikke.
       
      Vi skriver en ytre if, slik oppgaven sier, og legger den eksisterende koden inn i en else, slik at den bare aktiveres hvis antall dioder er større enn 0, markert med gult:
# Leser inn antall lysdioder, og skriver ut stykkpris og totalpris
antall = int(input("Hvor mange lysdioder vil du kjøpe? "))
if antall <= 0:
    print("Antall dioder må være større enn 0.")
else:
    if antall < 10:
        stykkpris = 3.50
    elif antall < 100:
        stykkpris = 3.00
    else:
        stykkpris = 2.50
    print(f"{antall} lysdioder à kr {stykkpris:.02f}, totalt kr {antall*stykkpris:.02f}.")
    1. Vi skal utvide ytre if slik at den også sjekker om antall kjøpte dioder er 1000 eller mer, og i så fall skriver at kjøperen skal kontakte kundeservice.
       
      Vi har nå fått en ny betingelse, og må utvide ytre if med en elif, markert med gult:
# Leser inn antall lysdioder, og skriver ut stykkpris og totalpris
antall = int(input("Hvor mange lysdioder vil du kjøpe? "))
if antall <= 0:
    print("Antall dioder må være større enn 0.")
elif antall >= 1000:
    print("Kontakt kundeservice for et tilbud!")
else:
    if antall < 10:
        stykkpris = 3.50
    elif antall < 100:
        stykkpris = 3.00
    else:
        stykkpris = 2.50
    print(f"{antall} lysdioder à kr {stykkpris:.02f}, totalt kr {antall*stykkpris:.02f}.")

Tilbake til oppgaven

«for»-løkker

Oppgave 1:

Vi skal skrive Python-kode som beregner og skriver ut de 10 første kvadrattallene.

Vi lager ei for-løkke som bruker range() til å gå gjennom heltallene fra og med 1 til og med 10, og for hvert gjennomløp av løkka skriver ut tallet opphøyd i andre, for eksempel slik:

# Skriver ut kvadratet av tallene fra 1 til 10
for n in range(1, 11):
    print(n**2)

Vi husker at sluttverdien i range() ikke tas med, derfor står det 11, ikke 10.

Så skal vi endre koden slik at den bare skriver ut kvadratet av oddetallene i samme tallområde. Det kan vi gjøre ved å legge inn en skrittverdi på 2 i range(), markert med gult under:

# Skriver ut kvadratet av oddetallene fra 1 til 10
for n in range(1, 11, 2):
    print(n**2)

Tilbake til oppgaven

Oppgave 2:

Vi skal analysere hva for-løkkene under skriver ut:

for n in range(5, 1, -2):
    print(n)

Her starter vi med n = 5 og går i skritt på −2 så lenge n > 1, så vi får skrevet ut 5 og 3.

for n in range(-5, 10, 2):
   print(n)

Her starter vi med n = −5 og går i skritt på 2 så lenge n < 10, så vi får skrevet ut −5, −3, −1, 1, 3, 5, 7 og 9.

Tilbake til oppgaven

Oppgave 3:

Vi skal modifisere koden under slik at den skriver ut tallene mellom 1 og 100 som er delelige med 5 i stedet for delelige med 7.

# Skriver ut tallene mellom 1 og 100 som er delelige med 7
for n in range(1, 101):
    if n % 7 == 0:
        print(f"{n} er delelig med 7.")

Vi må erstatte 7 med 5 i uttrykket n % 7. Vi modifiserer også kommentaren og print() litt for å gjenspeile den nye situasjonen. Endringer er markert med gult:

# Skriver ut tallene mellom 1 og 100 som er delelige med 5
for n in range(1, 101):
    if n % 5 == 0:
        print(f"{n} er delelig med 5.")

Tilbake til oppgaven

Oppgave 4:

I koden under er linja med print() bare rykket inn én gang, og vi skal vurdere hvilken effekt dette vil ha på koden i forhold til at den er rykket inn to ganger.

for n in range(1, 101):
    if n % 7 == 0:
        pass
    print(f"{n} er delelig med 7.")

Vi ser på innrykket at print() nå ikke lenger tilhører if-strukturen, men bare for-strukturen. Derfor vil vi feilaktig få utskrift for hvert gjennomløp i løkka, uavhengig av om n er delelig med 7 eller ikke.

Tilbake til oppgaven

«while»-løkker

Oppgave 1:

Vi skal skrive Python-kode som skriver ut alle kubikktall av partall, altså 23, 43, 63, … , som er mindre eller lik 1000.

Vi trenger ei løkke med en løkkevariabel som starer på 2 og øker i skritt på 2. Vi vet imidlertid ikke hvor mange ganger løkka skal gjnnomløpes, så vi kan ikke bruke ei for-løkke. I stedet bruker vi ei while-løkke med en betingelse som gjør at løkka gjennomløpes så lenge variabelen opphøyd i 3 er mindre eller lik 1000. For eksempel slik:

# Skriver ut kubikktall av partall mindre eller lik 1000
n = 2
while n**3 <= 1000:
    print(n**3)
    n += 2

Tilbake til oppgaven

Evige løkker

Oppgave 1:

Python-koden under er ment å skrive ut 2-gangen, altså 2, 4, 6, 8, 10, 12, 14, 16, 18, 20. Men den inneholder en feil som forårsaker ei evig løkke, og vi skal forklare hva feilen er og hvordan den kan rettes.

# Skriver ut 2-gangen
n = 1
while n <= 10:
    print(n * 2)

Problemet er at vi ikke øker verdien til n i løkka. Derved vil n forbli 1, betingelsen n <= 10 er alltid sann, og gjennomløpet av løkka fortsetter evig. Løsningen er å sette inn kodelinja n +=1 etter print().

Tilbake til oppgaven

Nøstede løkker

Oppgave 1:

Vi skal gå gjennom koden under med penn og papir, og skrive opp rekkefølgen de forskjellige linjene vil bli utført i.

Nøstet løkke i Python Tutor

For hver n i den ytre løkka vil m gjennomløpe 1, 2, 3 i den indre løkka, og for hver m vil print() på linje 3 bli utført. Hver gang den indre løkka er ferdig, vil print() på linje 4 bli utført. Siden pila går til linjer med range() også idet sluttverdien nås, vil linjene bli utført i rekkefølge rekkefølge
1, 2, 3, 2, 3, 2, 3, 2, 4, 1, 2, 3, 2, 3, 2, 3, 2, 4, 1, 2, 3, 2, 3, 2, 3, 2, 4, 1..

Dette kan vi verifisere ved å klikke gjennom koden i Python Tutor.

Tilbake til oppgaven

Løsningsforslag, grunnleggende Python

Kom i gang med Python

Oppgave 1:

Vi skal legge inn Python-kode som skriver ut strengen Heisan, alle!, i editoren.

Vi starter Thonny, og skriver

print("Heisan, alle!")

i editoren.

Så skal vi lage ei mappe til Python-filene, og lagre koden der med et velvalgt filnavn. Vi oppretter ei mappe slik vi pleier på vår datamaskin, klikker på «Fil» – «Lagre» i Thonny, navigerer fram til mappa vi laget, skriver inn et passende filnavn, for eksempel heisan, og klikker på «Lagre».

Så skal vi kjøre koden, det gjør vi ved å klikke på den lille, grønne pila over editoren. Python skriver ut Heisan, alle! i kommandofeltet.

Tilbake til oppgaven

Aritmetiske operatorer og regneoperasjoner

Oppgave 1:

Vi skal bruke Python til å regne ut 7 + 42.

I editoren skriver vi

print(7 + 4**2)

Når vi kjører koden, svarer Python 23.

Tilbake til oppgaven

Oppgave 2:

Vi skal beregne 3 + (8 + 2) / 5 * 3 i hodet, eller med penn og papir, og så sjekke resultatet i Python.

Her er operatorer på tre prioritetsnivåer. Parenteser vil bli regnet ut først, deretter vil / og * bli brukt, fra venstre mot høyre, og til slutt vil + bli brukt. Så vi får

3 + (8 + 2) / 5 * 3 → 3 + 10 / 5 * 3 → 3 + 2 * 3 → 3 + 6 → 9

I editoren skriver vi

print(3 + (8 + 2) / 5 * 3)

Når vi kjører koden, svarer Python 9.0. Resultatet er et desimaltall fordi utregningen involverer en divisjon.

Tilbake til oppgaven

Oppgave 3:

Vi skal forklare hvorfor vi får −1 hvis vi skriver -1**2 i Python selv om −1 opphøyd i andre er 1,

Grunnen er at operatoren for eksponentiering har høyere prioritet enn unært minus, så uttrykket blir tolket som -(1**2) = -1.

For å få det riktig må vi sette inn parenteser: (-1)**2.

Tilbake til oppgaven

Variabler

Oppgave 1:

Vi skal regne ut for hånd hvilke verdier for variablene a, b og c som vil bli skrevet ut av Python-koden under.

a = 1
b = 2
c = 3
a = a + b + c
b = a + b + c
c = a + b + c
print(a, b, c)

Det som er viktig å forstå her, er at koden kjører linje for linje fra toppen og nedover, så hvis en verdi endrer seg i ei linje, er det den nye verdien som brukes i neste linje, markert med henholdsvis gult og blått for a og b.

a = a + b + c → a = 1 + 2 + 3 = 6.

b = a + b + c → b = 6 + 2 + 3 = 11.

c = a + b + c → c = 6 + 11 + 3 = 20.

Når vi kjører koden, svarer Python 6 11 20.

Tilbake til oppgaven

Oppgave 2:

Vi skal regne ut for hånd hvilket tall Python-koden under skriver ut:

x = 5
x *= 2
y = x + 3*x
y += 2
print(y)

I første linje gis x verdien 5.
I andre linje gis x verdien av seg selv multiplisert med 2, altså 5*2 = 10.
I tredje linje gis y verdien av x pluss verdien av x multiplisert med 3, altså 10 + 3*10 = 40.
I fjerde linje gis y verdien av seg selv addert med 2, altså 40 + 2 = 42.

Når vi kjører koden, svarer Python 42.

Tilbake til oppgaven

Oppgave 3:

Vi finne to feil i Python-koden under:

x1 = 5
2x = 11
x3 = 2x + X1
print(x3)

Den ene feilen er at 2x ikke er et gyldig variabelnavn fordi det ikke begynner med en bokstav eller understreking. Den andre feilen er at vi gir en verdi til variabelen x1, men senere refererer til X1, som ikke er samme variabel fordi vi bruker liten x i det første tilfellet og stor X i det andre. Kaller vi 2x for x2, og bruker x1 i stedet for X1, får vi koden under, som skriver ut 16, når vi kjører den.

x1 = 5
x2 = 11
x3 = x2 + x1
print(x3)

Tilbake til oppgaven

Strenger

Oppgave 1:

Vi skal analysere Python-koden under og avgjøre hva den skriver ut.

innledning = "HIPP " * 2
hilsen = (innledning + "HURRA! " ) * 3
print(hilsen)

I første linje blir strengen "HIPP " repetert 2 ganger og tilordnet til variabelen innledning. Vi får derfor at innledning = "HIPP HIPP ".
I andre linje blir variabelen innledning først slått sammen med strengen "HURRA! " til "HIPP HIPP HURRA! ". Deretter blir denne strengen repetert 3 ganger og tilordnet til variabelen hilsen. Vi får derfor at hilsen = "HIPP HIPP HURRA! HIPP HIPP HURRA! HIPP HIPP HURRA! ".
I tredje linje blir så denne strengen skrevet ut.

Tilbake til oppgaven

Oppgave 2:

Vi skal skrive Python-kode som tilordner en streng vi selv velger, til variabelen navn, og et tall vi selv velger, til variabelen alder, og så setter sammen navn og alder med en forklarende tekst i en formatert streng som skrives ut med print(). Koden kan se slik ut:

navn = "Metusalem"
alder = 969
print(f"{navn} er {alder} år.")

Tilbake til oppgaven

Datatyper

Oppgave 1:

Vi skal avgjøre hvilken datatype resultatet får når vi gjør forskjellige aritmetiske beregninger.

Beregninger som bare involverer heltall, resulterer i heltall, med mindre vi utfører divisjon. Derfor blir følgende heltall:
2 * 4, som er 8
7 // 3, som er 2

Mens følgende blir flyttall:
4 / 2, som er 2.0

Beregninger som involverer flyttall, resulterer alltid i flyttall, også heltallsdivisjon. Derfor er følgende flyttall:
2 * 4.0, som er 8.0
2.0 * 4.0, som er 8.0
4.0 / 2.0, som er 2.0
7.0 // 3, som er 2.0

Når vi multipliserer et heltall og en streng, blir resultatet en streng. Derfor er følgende en streng:
2 * "hei", som er "heihei"

Vi kan ikke multiplisere et flyttall og en streng. Det følgende resulterer derfor i en feilmelding: 
2.0 * "hei"

Hvilke datatyper en beregning gir, kan vi kontrollere ved hjelp av Python-funksjonen type(). Skriver vi for eksempel

type(7.0 // 3)

svarer Python <class float>.

Tilbake til oppgaven

Innebygde Python-funksjoner

Oppgave 1:

Det finnes ikke løsningsforslag til denne oppgaven, som bare dreier seg om å eksperimentere.

Oppgave 2:

Koden under bruker 3 kodelinjer på å konvertere to strenger til flyttall og finne det største av de to tallene ved hjelp av funksjonen max(), og vi skal skrive om koden slik at alt utføres i en enkelt kodelinje.

x = float("2.35")
y = float("2.36")
z = max(x, y)

Vi erstatter x i max() med funksjonen som returnerer verdien til x, altså float("2.35"), og tilsvarende for y:

z = max(float("2.35"), float("2.36"))

Tilbake til oppgaven

Innlesing

Oppgave 1:

Vi skal skrive Python-kode som spør etter og leser inn et mobilnummer, og så skriver ut Ringer deg på etterfulgt av nummeret som blir skrevet i inn.

Når vi skal lese inn noe, bruker vi funksjon input(), og vi angir et passende prompt som argument, for eksempel:

mobilnr = input("Hva er mobilnummeret ditt? ")

Her vil strengen brukeren skriver inn, bli tilordnet variabelen mobilnr. Denne kan vi så skrive ut i en formatert streng, for eksempel slik:

print(f"Ringer deg på {mobilnr}")

Alternativt kan vi droppe variabelen mobilnr og bruke returverdien fra input() direkte i et argument til print().

print(f"Ringer deg på {input('Hva er mobilnummeret ditt? ')}")

Men den siste varianten er kanskje i overkant uoversiktlig. Legg også merke til at vi i den siste varianten må bruke enkle anførselstegn på strengen 'Hva er mobilnummeret ditt? ' fordi denne strengen ligger inni en streng avgrenset av doble anførselstegn.

Tilbake til oppgaven

Oppgave 2:

Vi skal skrive Python-kode som først spør etter fornavn, så etter etternavn, og så skriver ut Hei, etterfulgt av fornavn og etternavn.

Denne oppgaven følger malen fra forrige oppgave, vi må bare utvide med å bruke input() to ganger:

fornavn = input("Hva er fornavnet ditt? ")
etternavn = input("Hva er etternavnet ditt? ")
print(f"Hei, {fornavn} {etternavn}!")

Å slå disse tre linjene sammen etter mal fra det vi gjorde i forrige oppgave vil bli veldig uoversiktlig, selv om det teknisk sett ikke er noe i veien for det.

Tilbake til oppgaven

Oppgave 3:

Vi skal skrive Python-kode som leser inn verdien til to heltall, x og y, og så skriver ut tallene og produktet av dem.

Denne oppgaven følger malen fra forrige oppgave, men vi må huske å bruke funksjonen int() til å konvertere strengene vi leser inn til heltall:

x = int(input("Oppgi verdien til x: "))
y = int(input("Oppgi verdien til y: "))
print(f"{x} * {y} = {x*y}")

Tilbake til oppgaven

Løsningsforslag, GeoGebra

Introduksjon

Oppgave 1:

Vi skal sette inn et punkt A i (1, 2) og et punkt C i ( 4, 3) ved å skrive i inntastingsfeltet, og deretter trekke en linje mellom punktene ved å velge «Linjestykke mellom to punkt» fra verktøylinja. 

Vi skriver først (1, 2), deretter C = (4, 3) i inntastingsfeltet. Så velger vi «Linjestykke mellom to punkt» og klikker på de to punktene etter tur.

Menyvalg for å sette inn linjestykke mellom to punkt

Tilbake til oppgaven

Oppgave 2:

Vi skal bruke GeoGebra til å tegne grafen til funksjonen f(x) = 4x3 − 48x2 + 144x, og justere enhetene på aksene slik at hele grafen får plass i grafikkfeltet.

Vi skriver følgende i inntastingsfeltet:

funksjon(4x^3 – 48x^2 + 144x, 0, 6)

Så går vi til Innstillinger-dialogboksen og endrer akseverdiene til om lag

x-min = −2

x-maks = 8

y-min = −50

y-maks = 150

Grafen er vist under:

Tredjegradskurve med begrensning i x-verdier

GeoGebra-filLast ned den tilhørende GeoGebra-fila
 

Tilbake til oppgaven

Funksjonsanalyse

Oppgave 2:

Vi skal ta utgangspunkt i funksjonen f(x) = x3 + 2x2x − 2, og bruke GeoGebra til å

    1.  Finne ekstremalpunktene til funksjonen.
      Vi skriver funksjonsforskriften i inntastingsfeltet: x^3 + 2x^2 – x – 2.
      Ekstremalpunktene finner vi ved å skrive: ekstremalpunkt(f) i inntastingsfeltet.
      GeoGebra angir at funksjonen har et maksimalpunkt i (−1,55, 0,63) og et minimalpunkt i (0,22, −2,11).
       
    2. Finne funksjonens vendepunkt.
      Vi skriver: vendepunkt(f) i inntastingsfeltet.
      GeoGebra angir at funksjonen har et vendepunkt i (−0,67, −0,74).
       
    3. Løse likningen x3 + 2x2x − 2 = 0.
      Vi finner den tilhørende funksjonens nullpunkter ved å skrive: nullpunkt(f) i inntastingsfeltet.
      GeoGebra angir at nullpunktene er (−2, 0), (−1, 0) og (1, 0).
      Løsningen er altså x1 = −2, x2 = −1, x3 = 1.
      En annen løsningsmetode kan være å finne skjæringspunktene mellom f(x) og x-aksen.

GeoGebra-filLast ned den tilhørende GeoGebra-fila
 

Tilbake til oppgaven

Oppgave 3:

Vi skal finne eventuelle asymptoter til funksjonene

    1. $f(x) = 3 + \frac{\displaystyle 2}{\displaystyle x + 4}$
      Vi skriver: 3 + 2 / (x + 4) i inntastingsfeltet.
      Vi skriver: asymptote(f) i inntastingsfeltet.
      GeoGebra viser ei liste med y = 3 og x = −4 i algebrafeltet, og tegner disse to asymptotene i grafikkfeltet.
       
    2. $g(x) = x^2 + 3x − 2$
      Vi skriver: 3x^2 + 3x – 2 i inntastingsfeltet.
      Vi skriver: asymptote(g) i inntastingsfeltet.
      GeoGebra viser ei tom liste i algebrafeltet. Funksjonen har ingen asymptoter.

Vi har her forutsatt at det ikke er noen funksjoner registrert fra før, slik at navnene automatisk blir f og g

​Tilbake til oppgaven

Oppgave 6:

Basert på målingene i tabellen under skal vi bruke glidere i GeoGebra til å anslå en funksjonsforskrift for en lineær funksjon, f(t), som kan brukes som modell for forsøket.

Tid (min) 10 11 12 13 14
Temperatur (grader Celsius) 60 64 70 76 80
    1. Ved å eksperimentere med glidere for a og b, finner vi at funksjonen f(t) = 5t + 10 ser rimelig bra ut. Her er det imidlertid rom for variasjon, så det kan godt være du har funnet noe som er bedre.
       
    2. f(0) = 10. Vannet holdt 10 grader da forsøket startet.
       
    3. Stigningstallet a = 5, derfor stiger temperaturen med 5 grader per minutt.
       
    4. Funksjonsforskriften kan ikke brukes til å anslå hvilken temperatur vannet vil ha etter 30 minutter. f(30) = 160, og modellen er bare gyldig opp til 100 grader.

Tilbake til oppgaven

GeoGebra-filLast ned den tilhørende GeoGebra-fila
 

Delt funksjonsforskrift

Oppgave 1:

Vi skal bruke kommandoen dersom i GeoGebra til å plotte funksjonen $f(x) = \begin{cases} x+2, & x < 1 \\ 2x+1, & x \ge 1 \\ \end{cases}$.

Vi kan enten bruke x < 1 som kriterium og skrive dersom(x < 1, x + 2, 2x + 1) i inntastingsfeltet, eller vi kan bruke x ≥ 1 som kriterium og skrive dersom(x >= 1, 2x + 1, x + 2).

Plottet ser i begge tilfeller slik ut:

Plott av delt funksjonsforskrift med to verdier

Tilbake til oppgaven

Oppgave 2:

Vi skal bruke kommandoen dersom i GeoGebra til å plotte funksjonen $f(x) = \begin{cases} 1, & x < 1 \\ 2, & 1 \le x < 2 \\ 3, & 2 \le x \\ \end{cases}$.

Det finnes flere måter å velge kriteriene på, men vi kan for eksempel skrive dersom(x < 1, 1, 1 ≤ x < 2, 2, 3).

Plottet ser slik ut:

Plott av delt funksjonsforskrift med tre verdier

Tilbake til oppgaven

Derivasjon

Oppgave 1:

Vi skal bruke GeoGebra til å finne første- og fjerdederiverte til funksjonen f(x) = 3x5 + 2x4 − 3x3x2 + 2x − 1.

Vi skriver funksjonsforskriften i inntastingsfeltet: 3x^5 + 2x^4 – 3x^3 – x^2 + 2x – 1.

Vi skriver: f′(x) eller derivert(f) i inntastingsfeltet.

GeoGebra tegner grafen i grafikkfeltet og angir funksjonsforskriften i algebrafeltet: f′(x) = 15x4 +8x3 − 9x2 − 2x + 2.

Vi skriver: f′′′′(x) eller derivert(f, 4) i inntastingsfeltet.

GeoGebra tegner grafen i grafikkfeltet og angir funksjonsforskriften i algebrafeltet: f′′′′(x) = 360x + 48.

Tilbake til oppgaven

Integrasjon

Oppgave 1:

Vi skal bruke GeoGebra til å beregne integralet $\int 3x^2dx$.

Vi skriver funksjonsforskriften i inntastingsfeltet: 3x^2.

GeoGebra viser funksjonsforskriften f(x) = 3x2 i algebrafeltet og grafen til f(x) i grafikkfeltet.

Vi skriver integralkommandoen i inntastingsfeltet: integral(f).

GeoGebra oppretter den integrerte funksjonen, g, viser funksjonsforskriften g(x) = x3 i algebrafeltet og grafen til g(x) i grafikkfeltet.

Hvis vi ikke har bruk for den opprinnelige funksjonen, kan vi hoppe over den, og skrive integral(3x^2).

Vi kan også åpne CAS («Vis» – «CAS») og skrive integral(3x^2) hvis vi ikke er interessert i grafen.

Tilbake til oppgaven

Trigonometri

Oppgave 1:

Vi skal bruke GeoGebra til å illustrere definisjonen av cosinus.

Vi bruker samme oppskrift som for illustrasjon av sinus, vist i eksempel 1. De første fire punktene blir like. Men i punkt 5 skal vi lage et linjestykke fra C som står vinkelrett på y-aksen. Dette punktet vil ha x-koordinat 0, og samme y-koordinat som C: (0, y(C)). Så vi skriver: linjestykke(C, (0, y(C))).

Tilbake til oppgaven

Oppgave 2:

Vi skal bygge ut det vi laget i oppgave 1 til å tegne grafen til cosinus. Vi skal følge oppskriften på å tegne grafen til sinus, fra eksempel 2.

Vi baserer oss på de 5 trinnene i eksempel 2, men I punkt 2 skal vi bruke x-koordinaten, ikke y-koordinaten til C og skriver: x(C). Denne verdien representerer cosinus, GeoGebra kaller den g i algebrafeltet. I punkt 3 bruker vi denne verdien når vi lager et punkt som har y-koordinat lik cosinus til vinkelen og skriver: (d, g). GeoGebra kaller punktet E, og vi kan sette sporing på det på samme måte som i eksempel 2.

Tilbake til oppgaven

Oppgave 3:

Vi skal plotte punktet r = 1, θ = 60° i GeoGebra. Det gjør vi ved å skrive (1; 60°) i inntastingsfeltet.

Tilbake til oppgaven

Vektorer og avbildninger

Oppgave 1:

Vi skal bruke GeoGebra til å:

  • sette inn vektoren $\vec a$ med startpunkt i (0, 0) og sluttpunkt i (4, 3).
    Vi skriver a = (4, 3) i inntastingsfeltet. Alternativt setter vi inn fra menyen «Vektor», klikker i (0, 0) og (4, 3), endrer navnet etterpå og skjuler punktene.
    GeoGebra setter inn vektoren a = [4, 3] med startpunkt i (0, 0) og sluttpunkt i (4, 0).
     
  • sette inn vektoren $\vec b$ med startpunkt i (4, 3) og sluttpunkt i (6, −1).
    Vi skriver b= vektor((4, 3), (6, -1)) i inntastingsfeltet. Alternativt bruker vi menyen «Vektor» som i forrige punkt.
    GeoGebra setter inn vektoren b = [2, −4] med startpunkt i (4, 3) og sluttpunkt i (6, −1).
     
  • beregne vektoren $\vec s = \vec a + \vec b$
    Vi skriver s = a + b i inntastingsfeltet.
    GeoGebra setter inn vektoren s = [6, −1] med startpunkt i (0, 0) og sluttpunkt i (6, −1).
     
  • beregne vektoren $\vec d = \vec a − \vec b$
    Vi skriver d = a – b i inntastingsfeltet.
    GeoGebra setter inn vektoren d = [2, 7] med startpunkt i (0, 0) og sluttpunkt i (2, 7).
     
  • beregne lengden $| \vec a |$
    Vi skriver |a| eller lengde(a) eller abs(a) i inntastingsfeltet.
    GeoGebra setter inn tallet c = 5 i algebrafeltet.
     
  • beregne prikkproduktet $\vec a \cdot \vec b$
    Vi skriver a*b i inntastingsfeltet.
    GeoGebra setter inn tallet e = −4 i algebrafeltet.

Tilbake til oppgaven

Oppgave 2:

Vi skal bruke GeoGebra til å lage en trekant med hjørner i (3, 2), (6, 2) og (4, 4), flytte trekanten −2 enheter i x-retning og 3 enheter i y-retning, og deretter rotere den flyttede trekanten 60 grader om punktet (0, 4).

Vi velger «Mangekant» fra menyen, klikker i (3, 2), (6, 2), (4, 4) og deretter i (3, 2) igjen. GeoGebra setter inn en trekant med hjørner i disse punktene.

Vi velger «Vektor» fra menyen og setter inn en vektor som er [−2, 3], for eksempel ved å klikke i punktene (0, 0) og (−2, 3). Vi velger så «Flytt objekt med vektor» fra menyen, klikker på trekanten, deretter på vektoren. GeoGebra lager en ny trekant med hjørner i (1, 5), (4, 5) og (2, 7).

Vi setter inn et punkt i (0, 4) ved å velge «Nytt punkt» fra menyen og klikke i (0, 4). Vi velger så «Roter objekt om punkt med fast vinkel», klikker på den nye trekanten, deretter punktet i (0, 4) og skriver 60 i dialogboksen som kommer opp.

Tilbake til oppgaven

Dynamisk geometri

Oppgave 1:

Vi skal lage en vilkårlig trekant og bruke den til å illustrere sinussetningen, det vil si at forholdet mellom sinus til en vinkel i en trekant og lengden på den motstående siden er likt for alle vinkler og sider i en trekant.

Vi velger «Mangekant» og klikker ut tre punkter der trekantens hjørner skal være, så klikker vi tilbake i det første punktet. Alternativt bygger vi trekanten opp ved hjelp av linjer.

Vi velger «Vinkel» og klikker parvis på de sidene vi skal opprette en vinkel mellom, hvert par i retning mot klokka.

Vi har nå en trekant med sider a, b, c og vinkler α, β, γ. Hvilke vinkler som er motstående til hvilke sider vil variere med rekkefølgen vi satte dem inn i. I det følgende antar vi at α er motstående med a, β med b og γ med c.

Vi oppretter tre variable med hvert sitt forhold mellom sinus til vinkel og sidelengde. De kan hete hva som helst, vi kaller dem fa, fb og fc. I inntastingsfeltet skriver vi
fa = sin(α)/a
fb = sin(β)/b
fc = sin(γ)/c.

De greske bokstavene henter vi fra symbolmenyen som dukker opp til høyre for inntastingsfeltet når vi setter markøren i det.

fa, fb og fc dukker opp i algebrafeltet, alle har samme verdi.

Vi velger «Tekst», klikker der boksen skal stå og skriver inn en ledetekst, for eksempel «Forhold a: «. Så setter vi inn det tilhørende objektet, som vi har kalt fa, ved å hente det fra «Objekt»-menyen i tekstboksen. NB! Dette må hentes fra menyen, vi kan ikke bare skrive inn navnet på det. Vi gjør tilsvarende for de andre to objektene.

Nå kan vi klikke på pila til venstre i verktøylinja, ta tak i et av hjørnene i trekanten og dra. Når trekanten endrer form, endrer forholdstallene seg, men de tre er alltid like.

GeoGebra-filLast ned den tilhørende GeoGebra-fila

Tilbake til oppgaven

Regresjon

Oppgave 1:

Vi skal bruke regresjon i GeoGebra til å finne forskriften til en lineær funksjon som kommer så nærme punktene i lista under som mulig.

Kvarter 1 2 3 4 5 6 7 8
Kilometer 22 38 58 80 104 122 138 161

Vi henter fram regnearkfeltet hvis det ikke allerede er framme: «Vis» – «Regneark».

Vi skriver inn lista med målinger i regnearket, kvarter i kolonne A og kilometer i kolonne B.

Vi markerer tallene, høyreklikker og velger «Lag» – «Liste med punkt».

GeoGebra lager ei liste som heter Liste1.

Vi skriver: reglin(Liste1) i inntastingsfeltet.

GeoGebra foreslår funksjonsforskriften y = 20,11x − 0,11 i algebrafeltet og tegner den tilhørende grafen i grafikkfeltet.

Matematisk er nok denne nøyaktig, men vi ser at det ikke representerer situasjonen helt godt. Den sier at når turen starter har familien kjørt 0,11 kilometer feil vei.

GeoGebra-filLast ned den tilhørende GeoGebra-fila
 

Tilbake til oppgaven

Oppgave 2:

Vi skal bruk funksjonen regpot i GeoGebra til å finne en potensfunksjon som beskriver situasjonen i tabellen under.

Tid (sekunder) 1 2 3 4 5
Distanse (meter) 4,9 19,6 44,1 78,4 122,5

Vi henter fram regnearkfeltet hvis det ikke allerede er framme: «Vis» – «Regneark».

Vi skriver inn lista med målinger i regnearket, tid i kolonne A og distanse i kolonne B.

Vi markerer tallene, høyreklikker og velger «Lag» – «Liste med punkt».

GeoGebra lager ei liste som heter Liste1.

Vi skriver: regpot(Liste1) i inntastingsfeltet.

GeoGebra foreslår funksjonsforskriften f(x) = 4,9x2 i algebrafeltet og tegner den tilhørende grafen i grafikkfeltet.
Funksjonsforskriften er helt korrekt, formelen for fritt fall er $d = {\large \frac{1}{2}}gt^2$, der d er falt distanse, t er tida og g er tyngdens akselerasjon som er om lag 9,8.

GeoGebra-filLast ned den tilhørende GeoGebra-fila
 

Tilbake til oppgaven

Statistikk

Oppgave 1:

Vi skal bruke GeoGebra til å lage et søylediagram som viser fordeling av følgende karakterer:1, 4, 5, 5, 4, 1, 3, 4, 2, 2, 2, 4, 4, 4, 3, 3, 1, 3, 2, 5, 6, 3, 1, 4, 2. Søylebredden skal være 0,75.

Metode 1:

Vi skriver tallene inn i et celleområde i regnearket i GeoGebra, for eksempel A1:E5. I inntastingsfeltet skriver vi så søylediagram(A1:E5, 0.75). GeoGebra lager søylediagrammet under:

Søylediagram

Metode 2:

Karakterene fordeler seg slik:

 Karakter  1   2   3   4   5   6 
 Frekvens   4  5   5  7  3  1

Vi skriver karakterene i én kolonne i regnearket i GeoGebra, for eksempel A1:A6 og frekvensen i en annen, for eksempel B1:B6. I inntastingsfeltet skriver vi så søylediagram(A1:A6, B1:B6, 0.75). GeoGebra lager samme søylediagram som ved metode 1.

Tilbake til oppgaven

Oppgave 2:

Vi skal bruke GeoGebra til å lage et histogram som viser fordeling av karakterene fra oppgave 1, med intervaller 1-2, 3, 4 og 5-6.

Karakterene er fordelt slik:

 Karakter 1 – 2 3 4 5 – 6
 Frekvens  9 5 7 4

Det er sagt at intervallgrensene skal være 0,5-2,5, 2,5-3,5, 3,5-4,5 og 4,5-6,5. Så vi skriver 0.5, 2,5, 3.5, 4.5, 6.5 i én kolonne, for eksempel i cellene A1 – A5. Frekvensen, altså 9, 5, 7, 4 skriver vi en annen kolonne, for eksempel i cellene B1 – B4. Intervallbredden beregner vi så for hvert intervall. Vi skriver = A2 – A1 for eksempel i celle C1, tar tak i hjørnet og drar ned til C4. Til slutt beregner vi søylehøyden for hvert intervall. Vi skriver = B1 / C1 for eksempel i celle D1, tar tak i hjørnet og drar ned til D4. 

I inntastingsfeltet skriver vi så histogram(A1:A5, D1:D4). GeoGebra lager histogrammet under:

Histogram

Tilbake til oppgaven

Oppgave 3:

Vi skal lage et boksplott av dataene 6, 25, 15, 8, 29, 14, 27, 30, 0, 29, 0, 2, 23, 125, 5, 30, 20, 10, 14, sentrert rundt y = 1 og med total bredde 1.

    1. Basert på rådataene.
      Vi skriver boksplott(1, 0.5,{6, 25, 15, 8, 29, 14, 27, 30, 0, 29, 0, 2, 23, 125, 5, 30, 20, 10, 14}), eller legger inn dataene i regneark-delen. Legger vi dataene i celle A1 – A19, skriver vi etterpå boksplott(1, 0.5, A1:A19).
       
    2. Basert på at laveste verdi er 0, første kvartil 6, median 15, tredje kvartil 29 og største verdi 125.
      Vi skriver boksplott(1, 0.5, 0, 6, 15, 29,125).

I begge tilfeller lager GeoGebra boksplottet under:

Boksplott

Tilbake til oppgaven

Sannsynlighetskalkulatoren

Oppgave 1:

X betegner antall kron i 8 kast med en juksemynt der sannsynligheten for kron er 0,6, og vi skal bruke sannsynlighetskalkulatoren i GeoGebra til beregninger.

Hvis den ikke alt er framme, tar vi opp sannsynlighetskalkulatoren ved å klikke på «Vis» – «Sannsynlighetskalkulator».

Vi velger «Binomisk fordeling» og setter «n» = 8 og «p» = 0,6.

Vi skal så beregne 

    1. ​Fordelingens forventningsverdi og standardavvik.
      Vi leser av at forventningen er μ = 4,8 og standardavviket er σ ≈ 1,3856.
       
    2. P(X = 4)
      Vi velger «Intervall» og setter 4 både som øvre og nedre grense. Alternativt drar vi begge pilene inn under kolonne 4. GeoGebra svarer 0,2322. Dette er illustrert under:
      Beregning av binomiske sannsynligheter i GeoGebra
       
    3. P(X ≤ 2)
      Vi velger «Venstresidig» og setter 2 som øvre grense. Alternativt drar vi pila inn under kolonne 2. GeoGebra svarer 0,0498.
       
    4. P(X > 6)
      I en diskret fordeling har vi at P(X > x) = P(Xx + 1).
      P(X > 6) = P(X ≥ 7).
      Vi velger «Høyresidig» og setter 7 som nedre grense. Alternativt drar vi pila inn under kolonne 7. GeoGebra svarer 0,1064.

Tilbake til oppgaven

Oppgave 2:

I en forening med 65 medlemmer er 13 negative til et forslag, og vi skal bruke sannsynlighetskalkulatoren i GeoGebra til beregninger.

Hvis den ikke alt er framme, tar vi opp sannsynlighetskalkulatoren ved å klikke på «Vis» – «Sannsynlighetskalkulator».

Vi velger «Hypergeometrisk fordeling» og setter «populasjon» = 65, «n» = 13 og «utvalg» = 20.

Vi skal finne fordelingens forventning og standardavvik, noe vi leser av til å være μ = 4 og σ ≈ 1,5.

Så skal vi finne sannsynligheten for at

    1. Ingen av representantene er negative.
      Vi velger «Intervall» og setter 0 både som øvre og nedre grense. Alternativt drar vi begge pilene inn under kolonne 0. GeoGebra svarer 0,0044.
       
    2. Én av representantene er negativ.
      Vi velger «Intervall» og setter 1 både som øvre og nedre grense. Alternativt drar vi begge pilene inn under kolonne 1. GeoGebra svarer 0,035.
       
    3. To eller flere av representantene er negative.
      Vi velger «Høyresidig» og setter 2 som nedre grense. Alternativt drar vi pila inn under kolonne 2. GeoGebra svarer 0,9605.

Tilbake til oppgaven

Oppgave 3:

I en vannprøve er det i gjennomsnitt to hoppekreps. Vi antar at mengden hoppekreps er poissonfordelt, og skal bruk sannsynlighetskalkulatoren i GeoGebra til beregninger.

Hvis den ikke alt er framme, tar vi opp sannsynlighetskalkulatoren ved å klikke på «Vis» – «Sannsynlighetskalkulator».

Vi velger «Poissonfordeling» og setter «μ» = 2. 

Så skal vi finne sannsynligheten for at en annen, like stor vannprøve inneholder

  1. Ingen hoppekreps.
    Vi velger «Intervall» og setter 0 både som øvre og nedre grense. Alternativt drar vi begge pilene inn under kolonne 0. GeoGebra svarer 0,1353 
     
  2. Én hoppekreps.
    Vi velger «Intervall» og setter 1 både som øvre og nedre grense. Alternativt drar vi begge pilene inn under kolonne 1. GeoGebra svarer 0,2707.
     
  3. To eller flere hoppkreps.
    Vi velger «Høyresidig» og setter 2 som nedre grense. Alternativt drar vi pila inn under kolonne 2. GeoGebra svarer 0,594.

Tilbake til oppgaven

Oppgave 4:

På en eksamen er resultatene normalfordelt, N(14, 22). Laveste poengsum for å stå er 12 poeng, og vis skal bruke sannsynlighetskalkulatoren i GeoGebra til å beregne hvor stor del av de som tar eksamenen som kan forventes å ikke stå.

Hvis den ikke alt er framme, tar vi opp sannsynlighetskalkulatoren ved å klikke på «Vis» – «Sannsynlighetskalkulator».

Vi velger «Normalfordeling» og setter «μ» = 14 og «σ» = 2.

Vi velger «Venstresidig» og setter 12 som øvre grense. Alternativt drar vi pila inn under kolonne 12. GeoGebra svarer 0,1587.

Tilbake til oppgaven

Oppgave 5:

Vi skal bruke sannsynlighetskalkulatoren i GeoGebra til å beregne et 99 % konfidensintervall for dagsproduksjonen av støtfangere, basert på at gjennomsnittet målt over seks dager er X = 217 enheter og at standardavviket til produksjonen er σ = 5,8.

Vi åpner sannsynlighetskalkulatoren, klikker på fanen “Statistikk”, velger «Z-estimat av et gjennomsnitt», og setter

    • «Konfidensnivå» til 0.99, fordi vi skal ha et 99 %-intervall.
    • «Gjennomsnitt» til 217, fordi gjennomsnittsproduksjonen er 217 enheter.
    • «σ» til 5.8, fordi standardavviket til produksjonen er 5,8.
    • «N» til 6, fordi vi har målinger fra 6 dager.

Beregning av 99 % konfidensintervall i sannsynlighetskalkulator, n-foredeling

GeoGebra beregner at konfidensintervallet er om lag [210,9008, 223,0992]. Dette regner vi ut for hånd i oppgave 4 i artikkelen om estimering

Tilbake til oppgaven

Oppgave 6:

Vi skal bruke sannsynlighetskalkulatoren i GeoGebra til å beregne et 90 % konfidensintervall for dagsproduksjonen av støtfangere, basert på at gjennomsnittet målt over seks dager X = 217 enheter og at utvalgsstandardavviket er beregnet til S = 6.

Vi åpner sannsynlighetskalkulatoren, klikker på fanen “Statistikk”, velger «T-estimat av et gjennomsnitt», og setter

    • «Konfidensnivå» til 0.9, fordi vi skal ha et 90 %-intervall.
    • «Gjennomsnitt» til 217, fordi gjennomsnittsproduksjonen er 217 enheter.
    • «s» til 6, fordi utvalgsstandardavviket er 6.
    • «N» til 6, fordi vi har målinger fra 6 dager.

Beregning av 90 % konfidensintervall i sannsynlighetskalkulator, t-foredeling

GeoGebra beregner at konfidensintervallet er om lag [212,0642, 221,9358].

Tilbake til oppgaven

Oppgave 7:

Vi skal bruke sannsynlighetskalkulatoren i GeoGebra til å beregne et 95 % konfidensintervall for sannsynligheten for at en vilkårlig mobillader er defekt, når det blant 2000 stikkprøver ble funnet 35 defekte.

Vi åpner sannsynlighetskalkulatoren, klikker på fanen “Statistikk”, velger «Z-estimat av en andel», og setter

    • «Konfidensnivå» til 0.95, fordi vi skal ha et 95 %-intervall.
    • «Treff» til 35 fordi 35 av laderne er defekte.
    • «N» til 2000 fordi det er tatt 2000 stikkprøver.

Beregning av 90 % konfidensintervall i sannsynlighetskalkulator, binomisk modell

GeoGebra beregner at konfidensintervallet er om lag [0,0118, 0,0232]. Dette regner vi ut for hånd i oppgave 9 i artikkelen om estimering

Tilbake til oppgaven

Oppgave 8:

Vi skal bruke sannsynlighetskalkulatoren i GeoGebra til å gjøre en hypotesetest på 5 % signifikansnivå på om henholdsvis 20 av 100 og 200 av 1000 seksere ved terningkast tyder på at terningen gir for mange seksere.

Den alternative hypotesen blir HA: p > 1/6, og nullhypotesen H0: p = 1/6.

Vi åpner sannsynlighetskalkulatoren, klikker på fanen “Statistikk”, velger «Z-test av en andel», og setter

    • «Nullhypotese p =» til 1/6 fordi nullhypotesen er at mynten er rettferdig, med en sannsynlighet for sekser på ${\large \frac{1}{6}}$. GeoGebra regner 1/6 om til desimaltall.
    • «Alternativ hypotese» til «>» fordi den alternative hypotesen er at terningen gir for mange seksere.
    • «Treff» til 20 fordi kastene i første undersøkelse har gitt 20 seksere.
    • «N» til 100 fordi det er gjort totalt 100 kast i første undersøkelse.

Hypotesetest i sannsynlighetskalkulator, binomisk modell, 20 av 100

GeoGebra regner ut at verdien til testobservatoren blir om lag Z ≈ 0,8935. Med et lite avvik, som antakelig skyldes avrundingsfeil, regner vi dette ut for hånd i oppgave 1 i artikkelen om hypotesetesting. Siden Z ≈ 0,8935 < zα = z0,05 ≈ 1,6449, kan vi konkludere med at vi ikke kan forkaste nullhypotesen. Men det er enklere å basere seg på P-verdien, som er om lag 0,1858. Siden P-verdien ikke er mindre enn signifikansnivået på 0,05, kan ikke nullhypotesen forkastes.

Vi endrer så

    • «Treff» til 200 fordi kastene i andre undersøkelse har gitt 200 seksere.
    • «N» til 1000 fordi det er gjort totalt 1000 kast i andre undersøkelse.

Hypotesetest i sannsynlighetskalkulator, binomisk modell, 200 av 1000

GeoGebra regner ut at verdien til testobservatoren blir om lag Z ≈ 2,8254. Med et lite avvik, som antakelig skyldes avrundingsfeil, regner vi dette ut for hånd i oppgave 2 i artikkelen om hypotesetesting. Siden Z ≈ 2,8254 > zα = z0,05 ≈ 1,6449, kan vi konkludere med at vi kan forkaste nullhypotesen. Men det er enklere å basere seg på P-verdien, som er om lag 0,0024. Siden P-verdien er mindre enn signifikansnivået på 0,05, kan nullhypotesen forkastes.

Tilbake til oppgaven

Oppgave 9:

Vi skal bruke sannsynlighetskalkulatoren i GeoGebra til å gjøre en hypotesetest på 5 % signifikansnivå på om angitt gjennomsnittlig ventetid på 30 sekunder på en telefontjeneste er satt for lavt når 15 oppringninger gir en gjennomsnittlig ventetid på 37 sekunder, med et standardavvik på 14.

Den alternative hypotesen blir HA: μ > 30, og nullhypotesen H0: μ = 30.

Vi åpner sannsynlighetskalkulatoren, klikker på fanen “Statistikk”, velger «T-test av en andel», og setter

    • «Nullhypotese μ =» til 30 fordi dette er den angitte ventetiden.
    • «Alternativ hypotese» til «>» fordi den alternative hypotesen er at ventetiden er høyere enn angitt.
    • «Gjennomsnitt» til 37 fordi den gjennomsnittlige ventetiden er 37 sekunder.
    • «s» til 14 fordi utvalgsstandardavviket er 14.
    • «N» til 15 fordi det er gjort 15 målinger.

Hypotesetest i sannsynlighetskalkulator, målemodell, ukjent standardavvik

GeoGebra regner ut at verdien til testobservatoren blir om lag t ≈ 1,9365. Siden t ≈ 1,9365 > tα = t0,05 (15−1) ≈ 1,7613, kan vi konkludere med at vi kan forkaste nullhypotesen. Men det er enklere å basere seg på P-verdien, som er om lag 0,0366. Siden P-verdien er mindre enn signifikansnivået på 0,05, kan nullhypotesen forkastes.

Tilbake til oppgaven

Oppgave 10:

Vi skal bruke sannsynlighetskalkulatoren i GeoGebra til å gjøre en hypotesetest på 5 % signifikansnivå på om det er forskjell på mengden sukker to maskiner tilsetter en matvare. 60 stikkprøver av maskin X gir et snitt på 10,107 gram sukker, og 75 stikkprøver av maskin Y gir et snitt på 10,061 gram sukker. Standardavvikene er kjent som, 0,11 gram for maskin X og 0,13 gram for maskin Y.

Den alternative hypotesen blir HA: μ1μ2, og nullhypotesen H0: μ1μ2.

Vi åpner sannsynlighetskalkulatoren, klikker på fanen “Statistikk”, velger «Z-test mellom gjennomsnitt», og setter

        • «Nullhypotese μ1 − μ2» til 0 fordi nullhypotesen er at forventningsverdiene i de to utvalgene er like.
        • «Alternativ hypotese» til «≠» fordi den alternative hypotesen er at forventningsverdiene i de to utvalgene ikke er like.

Vi lar «Utvalg» representere maskin X og setter

        • «Gjennomsnitt» til 10.107 fordi gjennomsnittsmengden for maskin X er 10,107.
        • «σ» til 0.11 fordi maskin X opererer med et standardavvik på 0,11.
        • «N» til 60 fordi det er gjort 60 målinger på maskin X.

Vi lar «Utvalg 2» representere maskin Y og setter

        • «Gjennomsnitt» til 10.061 fordi gjennomsnittsmengden for maskin Y er 10,061.
        • «σ» til 0.13 fordi maskin Y opererer med et standardavvik på 0,13.
        • «N» til 75 fordi det er gjort 75 målinger på maskin Y.

Hypotesetest i to utvalg sannsynlighetskalkulator, målemodell, kjent standardavvik

GeoGebra regner ut at verdien til testobservatoren blir om lag Z ≈ 2,2261. Dette regner vi ut for hånd i oppgave 1 i artikkelen om å sammenlikne datasett. Siden Z ≈ 2,2261 > zα/2 = z0,025 ≈ 1,9600, kan vi konkludere med at vi kan forkaste nullhypotesen. Men det er enklere å basere seg på P-verdien, som er om lag 0,026. Siden P-verdien er mindre enn signifikansnivået på 0,05, kan nullhypotesen forkastes.

Tilbake til oppgaven

Oppgave 11:

Vi skal bruke sannsynlighetskalkulatoren i GeoGebra til å gjøre en hypotesetest på 5 % signifikansnivå på om det er forskjell på antall defekte sømmer på bukser produsert ved to produksjonslinjer når det ved produksjonslinje X er 147 av 2500 defekter, og ved produksjonslinje Y er 151 av 2000 defekter.

Den alternative hypotesen blir HA: p1 = p2, og nullhypotesen H0: p1 ≠ p2.

Vi åpner sannsynlighetskalkulatoren, klikker på fanen “Statistikk”, velger «Z-test. Forskjell mellom andeler», og setter

    • «Nullhypotese p1 − p2» til 0 fordi nullhypotesen er at andelene defekte i de to utvalgene er like.
    • «Alternativ hypotese» til «≠» fordi den alternative hypotesen er at andelene defekte i de to utvalgene ikke er like.

Vi lar «Utvalg» representere produksjonslinje X og setter

    • «Treff» til 147 fordi antall defekte ved produksjonslinje X er 147.
    • «N» til 2500 fordi det er undersøkt 2500 sømmer ved produksjonslinje X.

Vi lar «Utvalg 2» representere produksjonslinje Y og setter

    • «Treff» til 151 fordi antall defekte ved produksjonslinje Y er 151.
    • «N» til 2000 fordi det er undersøkt 2000 sømmer ved produksjonslinje Y.

Hypotesetest i to utvalg sannsynlighetskalkulator, binomisk modell

GeoGebra regner ut at verdien til testobservatoren blir om lag Z ≈ −2,1541. Dette regner vi ut for hånd i eksempel 4 i artikkelen om å sammenlikne datasett. Siden |Z| ≈ 2,1541 > zα/2 = z0,025 ≈ 1,9600, kan vi konkludere med at vi kan forkaste nullhypotesen. Men det er enklere å basere seg på P-verdien, som er om lag 0,0252. Siden P-verdien er mindre enn signifikansnivået på 0,05, kan nullhypotesen forkastes.

Tilbake til oppgaven

CAS

Oppgave 1:

Vi skal bruke CAS i GeoGebra til å forenkle uttrykkene

    1. 4xy + 8z − 3xy + 5x − 3z
       
    2. 5m2 − 3n − 3(m2 + n) − (−m2n)
       
    3. $\frac{\displaystyle {(a^{\large 2})}^{\large 3}a^{\large 4}}{\displaystyle {(a^{\large 3})}^{\large 2}}$
       
    4. x2y2x + x3y3x−1x3y2 + xyyyyy−1x

Vi åpner CAS hvis det ikke allerede er åpent, og skriver

    1. 4xy + 8z – 3xy + 5x – 3z. GeoGebra forenkler uttrykket til xy + 5x + 5z.
       
    2. 5m^2 – 3n – 3(m^2 + n) – (-m^2 – n). GeoGebra forenkler uttrykket til 3m2 −5n.
       
    3. (a^2)^3 a^4 / (a^3)^2. GeoGebra forenkler uttrykket til a4.
       
    4. x^2y^2x + x^3y^3x^-1 – x^3y^2 + x*y*y*y*y*y^-1x. GeoGebra forenkler uttrykket til 2x2y3.

Tilbake til oppgaven

Oppgave 2:

Vi skal bruke CAS til å forenkle uttrykkene

    • $\sqrt[\Large 3]{x^4} \cdot \sqrt[\Large 3]{x^{\phantom 1}}$
       
    • $\frac{\displaystyle \sqrt{a^\phantom 1} \cdot \sqrt[\Large 4]{a^3} \cdot a}{\displaystyle \sqrt[\Large 8]{a^5} }$

Vi åpner CAS hvis det ikke allerede er åpent, og skriver

    • nrot(x^4, 3) nrot(x, 3). GeoGebra svarer imidlertid bare med $\sqrt[\Large 3]{x^{\phantom 1}}\sqrt[\Large 3]{x^4}$.
      Vi bruker derfor kommandoen forenkle, og skriver
      forenkle(nrot(x^4, 3) nrot(x, 3)). GeoGebra forenkler nå uttrykket til $x \sqrt[\Large 3]{x^2}$.
       
    • forenkle(sqrt(a) nrot(a^3, 4) a / nrot( a^5, 8)). GeoGebra forenkler uttrykket til $a \sqrt[\Large 8]{a^5}$.

Tilbake til oppgaven

Oppgave 3:

Vi skal bruke CAS til å regne ut (x + 5)3.

Vi åpner CAS hvis det ikke allerede er åpent, og skriver inn regnut((x + 5)^3). GeoGebra svarer x3 + 15x2 + 75x + 125.

Tilbake til oppgaven

Oppgave 4:

Vi skal bruke CAS til å løse likningssettet:

(I) x + 3y − 2z = 5
(II) 3x + 5y + 6z = 7
(III) 2x + 4y + 3z = 8

Vi åpner CAS og legger inn likningene, én i hver rute. Deretter markerer vi alle likningene ved å klikke på rute «1», holde nede <skift> og klikke på rute «3». Så klikker vi på «Løs» eller «Nøs Numerisk». Siden løsningene er hele tall, spiller det i dette tilfellet ikke noen rolle hva vi velger. GeoGebra viser løsningen x = −15, y = 8, z = 2.

Alternativt skriver vi løs({ x + 3y – 2z = 5, 3x + 5y + 6z = 7, 2x + 4y + 3z = 8}, {x, y, z}) i CAS. Vi kan også skrive nløs i stedet for løs.

Tilbake til oppgaven

Dynamiske ark

Oppgave 1:

Basert på ei GeoGebra-fil om derivasjon skal vi lage dynamiske ark.

Vi velger «Fil» – «Eksporter» – «Dynamisk ark som webside …».

Vi velger fanen «Eksporter som webside».

Vi skriver: «Derivasjon 1» i feltet «Tittel».

Vi klikker på «Eksporter».

Vi velger hva eksportfila skal ligge, for eksempel på «C:\Temp», og skriver derivasjon_1 i «Filnavn».

Tilbake til oppgaven

Oppgave 2:

Basert på dynamiske fila vi laget i oppgave 1 skal vi eksperimentere med hva vi kan gjøre av endringer.

Vi kan skyve på punktet A, men ikke skru av eller på sporing eller gjøre andre endringer.

Tilbake til oppgaven

Oppgave 3:

    1. Vi skal gjenta det vi gjorde i oppgave 1, men tillate høyreklikking.
      Vi bruker samme metode som i oppgave 1, men etter at vi har valgt «Eksporter som webside» og før vi klikker «Eksporter», klikker vi på fanen «Avansert» og huker av for «Tillat høyreklikking, zooming og tastaturredigering».
       
    2. Vi skal gjenta det vi gjorde i oppgave 1, men nå skal også meny- og verktøylinjer er tilgjengelige.
      Vi gjør det samme som i punkt 1, men vi huker nå også av for «Vis menylinje» og «Vis verktøylinje».

​Tilbake til oppgaven

Løsningsforslag, bevis

Visuelle bevis

Oppgave 1:

Vi skal lage et visuelt bevis for første kvadratsetning, altså at (a + b)2 = a2 + 2ab + b2.

Vi tegner et kvadrat av ruter med sidelengde a + b:

Illustrasjon av 1. kvadratsetning

Kvadratet har areal (a + b) · (a + b) = (a + b)2. Vi ser at dette arealet består av a2, markert med rødt, b2, markert med blått, og 2ab, markert med gult. Vi ser altså at (a + b)2 = a2 + 2ab + b2.

Tilbake til oppgaven

Ugyldige bevis

Oppgave 1:

Vi skal gjøre en vurdering av om formelen n2 − n + 41, der n er et heltall større eller lik 0, fungerer som en primtallsgenerator. Vi vet at n fra 0 til 20, gir primtall. Prøver vi n fra 21 til 40, får vi også primtall.

Prinsippet om at eksempler ikke er gyldige bevis, gjelder imidlertid også her. Med n = 41, får vi 1681, som ikke er et primtall, men kan faktoriseres som 41 · 41. For større n veksler det om vi får primtall eller ikke.

Det er ganske lett å skjønne at n = 41 ikke gir primtall, fordi formelen gir n2 − n + 41 = 412 − 41 + 41 = 412, som kan deles på 41.

Per 2025 finnes det ingen kjente primtallsgeneratorer.

Tilbake til oppgaven

Uttømmende bevis

Oppgave 1:

Vi skal bevise at det finnes nøyaktig ett heltall i intervallet [20, 25], som består av nøyaktig fire primtallsfaktorer.

Vi bruker et uttømmende bevis og faktoriserer heltallene mellom 20 og 25:

20 = 2 · 2 · 5

21 = 3 · 7

22 = 2 · 11

23 = 23

24 = 2 · 2 · 2 · 3

25 = 5 · 5

Vi ser at 24 og ingen andre av tallene oppfyller kravet, og påstanden er derved bevist.

Tilbake til oppgaven

Bevis ved moteksempel

Oppgave 1:

Vi skal bevise at påstanden «alle sammensatte tall større enn hundre består av minst tre primtallsfaktorer» er uriktig.

Det gjør vi ved et moteksempel: 106 er et sammensatt tall, men inneholder bare 2 primtallsfaktorer. 106 = 2 · 53.

Tilbake til oppgaven

Algebraisk bevis

Oppgave 1:

Vi skal forklare hva som er problemet med det følgende «beviset» for at summen av to partall alltid er delelig med 4, og forklare hva det egentlig er vi har bevist.

«Vi lar 2t være et vilkårlig partall. Summen av to partall blir da 2t + 2t = 4t, som er delelig med 4.»

Problemet er at vi representerer to tall som kan være ulike, med like symboler. Når vi bruker 2t som symbol for begge tallene, betyr det at tallene er like. Så det vi har bevist, er at et partall addert med seg selv er delelig med 4. For eksempel 2 + 2 og 6 + 6.

Tilbake til oppgaven

Oppgave 2:

Vi skal bevise at summen av to oddetall er et partall.

Et oddetall er et tall på formen 2t + 1 der t er et heltall. Velger vi n og m som symboler for vilkårlige heltall, vil 2n + 1 og 2m + 1 være to vilkårlige oddetall.

Summen av to oddetall kan da skrives som (2n + 1) + (2m + 1) = 2n + 2m + 1 + 1 = 2(n + m + 1). Siden uttrykket i parentesen er et heltall, ser vi at summen er på formen 2t, og derved et partall.

Tilbake til oppgaven

Oppgave 3:

Vi skal bruke et algebraisk bevis til å begrunne at vi alltid får 37 når vi dividerer et tresifret tall der sifrene er like, med summen av sifrene.

Lar vi a representere hvilket som helst av sifrene 1, 2, 3, 4, 5, 6, 7, 8 og 9, og skriver telleren på utvidet form, får vi
a · 100 + a · 10 + a = a(100 + 10 + 1) = 111a.

Nevneren blir a + a + a = 3a.

Så den generelle brøken blir ${\large \frac{111a}{3a}}$, som kan forkortes til 37. Vi får altså alltid 37 uansett hvilket siffer a representerer.

Tilbake til oppgaven

Dueslagprinsippet

Oppgave 1:

Vi spør hvor mange, m, sokker vi må ha blant n varianter for at minst to skal være like. Dueslagprinsippet sier at dette vil vi ha når m > n. Siden n = 5, og minste m > 5 er 6, må vi ha minst seks sokker.

Tilbake til oppgaven

Implikasjon og ekvivalens

Oppgave 1:

Vi skal finne feilen i et «bevis» for at −1 = 1.

«Beviset» består av en kjede med implikasjoner. Men én av implikasjonene er feil.

At $\sqrt{(2 − 1)^2 }= \sqrt{(1 − 2)^2}$ medfører ikke at 2 − 1 = 1 − 2.

Følgende implikasjon er riktig: a = ba2 = b2. Men vi kan ikke snu implikasjonspila og si a2 = b2  a = b, fordi også a = −ba2 = b2.

Implikasjonskjeden er brutt. Vi ser her hvordan en eneste implikasjonsfeil ødelegger logikken i en hel kjede av implikasjoner som ellers er riktige.

Tilbake til oppgaven

Bevis ved selvmotsigelse

Oppgave 1:

Vi påsto at det ikke fantes hele, positive tall, a og b, slik at a2b2 = 12.fordi vi, både når vi faktoriserte 12 som 4 · 3 og 12 · 1, endte opp med en a som ikke var et heltall.

Vi har imidlertid ikke tatt for oss alle måtene 12 kan faktoriseres på. Vi kan også ha 12 = 6 · 2 og da får vi

(a + b)(ab) = (6)(2) = 12.

Vi må altså ha
a + b = 6
ab = 2

Summerer vi de to likningene, får vi 2a + 0b = 8, det vil si at a = 4. Og vi ser at vi da får b = 2.

Det finnes altså a og b som er heltall, vi har ikke motsagt den opprinnelige forutsetningen, og beviset faller sammen. Vi har at 42 − 22 = 16 − 4 = 12.

Tilbake til oppgaven

Induksjonsbevis

Oppgave 1:

Vi skal bevise at

$1^2 + 2^2 + 3^2 + \cdots + n^2 = \frac{\displaystyle n(n + 1)(2n+1)}{\displaystyle 6}$

for alle n ≥ 1.

I trinn 1 viser vi da at påstanden er riktig for n0 = 1, det vil si at summen av kvadrattallene fra og med 12 til og med 12 blir 1. Og formelen gir

$\frac{\displaystyle 1(1 + 1)(2\cdot1+1)}{\displaystyle 6} = \frac{\displaystyle 1 \cdot 2 \cdot 3} {\displaystyle 6} = 1$

så påstanden er riktig for n0 = 1.

Formelen vi skal bevise sier at hvis

$1^2 + 2^2 + 3^2 + \cdots + {\color{brown}n}^2 = \frac{\displaystyle {\color{brown}n}({\color{brown}n} + 1)(2{\color{brown}n}+1)}{\displaystyle 6}$

er

$1^2 + 2^2 + 3^2 + \cdots + n^2 + ({\color{brown}{n + 1}})^2 = \frac{\displaystyle ({\color{brown}{n + 1}})(({\color{brown}{n + 1}}) + 1)(2({\color{brown}{n +1}})+1)}{\displaystyle 6}$

(For å tydeliggjøre har vi markert siste ledd i rekka med brunt.)

Regner vi ut telleren i brøken, ser vi at den blir

$\frac{\displaystyle (n+1)(n+2)(2n+3)}{\displaystyle 6}$

I trinn 2 skal vi vise at dette er riktig. Vi har altså

$1^2 + 2^2 + 3^2 + \cdots + n^2 = \frac{\displaystyle n(n + 1)(2n+1)}{\displaystyle 6}$

Vi adderer et nytt ledd på begge sider av likhetstegnet:

$1^2 + 2^2 + 3^2 + \cdots + n^2 + (n+1)^2= \frac{\displaystyle n(n + 1)(2n+1)}{\displaystyle 6} + (n+1)^2$

Vi skriver uttrykket på høyre side som en enkelt brøk:

$\frac{\displaystyle n(n + 1)(2n+1) + 6(n+1)^2}{\displaystyle 6}$

Vi setter n + 1 utenfor parentes:

$\frac{\displaystyle (n + 1)\Big(n(2n+1) + 6(n+1)\Big)}{\displaystyle 6}$

Inni den store parentesen regner vi ut parenteser og trekker sammen like ledd :

$\frac{\displaystyle (n + 1)(2n^2+7n+6)}{\displaystyle 6}$

Vi faktoriserer andregradsuttrykket:

$\frac{\displaystyle (n + 1) \cdot 2(n+2)(n+\frac{3}{2})}{\displaystyle 6} = \frac{\displaystyle (n + 1) (n+2)(2n+2\cdot\frac{3}{2})}{\displaystyle 6} = \frac{\displaystyle (n + 1) (n+2)(2n+3)}{\displaystyle 6}$

Som er det uttrykket formelen sa vi skulle få.

Tilbake til oppgaven

Løsningsforslag, mer om statistikk

Sentralgrenseteoremet

Oppgave 1:

Vi skal finne sannsynligheten for at en orkidedyrker klarer å produsere minst 3200 blomsterstengler når han har 2500 planter, og i gjennomsnitt 20 % av plantene ikke får blomsterstengler, 40 % får én stengel, 30 % to stengler, og 10 % tre stengler.

Dersom X er antall stengler per plante, har vi altså at P(X = 0) = 0,2, P(X = 1) = 0,4, P(X = 2) = 0,3 og P(X = 3) = 0,1. Dersom Y er antall stengler totalt, skal vi finne P(Y ≥ 3200).

Vi beregner forventning og varians for X:

E(X) = 0 · 0,2 + 1 · 0,4 + 2 · 0,3 + 3 · 0,1 = 1,3.

E(X2) = 02 · 0,2 + 12 · 0,4 + 22 · 0,3 + 32 · 0,1 = 2,5.

Var(X) = E(X2) − [E(X)]2 = 2,5 − (1,3)2 = 0,81.

Altså μ = E(X) = 1,3, og σ2 = Var(X) = 0,81.

n = 2500, langt over tommelfingerregelen på «> 30». Så dersom antall stengler på en plante er uavhengig av de andre, har vi ifølge sentralgrenseteoremet at summen er tilnærmet normalfordelt. Standardavviket og variansen til Y blir 2500 ganger standardavviket og variansen til X, siden vi har 2500 planter.

Y ~ N(2500 · 1,3, 2500 · 0,81) = N(3250, 2025) = N(3250, 452).

Så skal vi finne P(Y ≥ 3200). Vi skriver =1-norm.fordeling(3200; 3250; 45; sann) i Excel eller 1- fordelingnormal(3250, 45, 3200) i GeoGebra og får 0,8667.

Det er altså om lag 86,67 % sannsynlighet for at han klarer å produsere nok stengler.

Vi kan også finne normaltilnærmngen ved å bruke normalfordelingstabellen. Vi gjør da først en standardisering, og finner at P(Y ≥ 3200) = 1 − P(Y < 3200) tilsvarer $1 – G({\large \frac{3200 – 3250}{45}}) \approx 1 – G(-1{,}11) = G(1{,}11)$. Så går vi inn i tabellen, rad 1,1, kolonne 0,01, der det står 0,8665.

Tilbake til oppgaven

Oppgave 2:

Vi har en juksemynt med sannsynlighet p = 0,6 for kron, og vil finne sannsynligheten for å få 125 eller færre kron i 200 kast. Det er oppgitt at sannsynligheten for dette er ca. 0,7858.

Vi skal avgjøre om en normaltilnærming kan forventes å være god i dette tilfellet. En normaltilnærming anses å være god hvis np(1 − p) ≥ 10. Vi har n = 200, p = 0,6, så vi får np(1 − p) = 200 · 0,6(1 − 0,6) = 48, så vi forventer at normaltilnærmingen er god.

Vi har at når X ~ bin(np), er normaltilnærmingen N(np, np(1 − p)), det vil si N(200 · 0,6, 200 · 0,6(1 − 0,6) = N(120, 48).

Hvis vi så skriver =norm.fordeling(125; 120; rot(48); sann) i Excel eller fordelingnormal(120, sqrt(48), 125) GeoGebra, får vi 0,7648.

Dette er en feil på ${\large \frac{0{,}7858 – 0{,}7648}{0{,}7858}} \approx 0{,}0268$, ca. 2,6 % for lavt.

Tilbake til oppgaven

Oppgave 3:

I oppgave 2 brukte vi normaltilnærming for å finne sannsynligheten for å få 125 eller færre kron i 200 kast med en mynt med sannsynlighet p = 0,6 for kron. Nå skal vi gjøre tilnærmingen om igjen med heltallskorreksjon.

Normalfordelingen er den samme som i oppgave 2, N(120, 48), men vi skal erstatte 125 med 125 + 0,5 = 125,5.

Hvis vi skriver =norm.fordeling(125,5; 120; rot(48); sann) i Excel eller fordelingnormal(120, sqrt(48), 125.5) i GeoGebra, får vi 0,7864.

I forhold til den riktige verdien på 0,7858, er feilen ${\large \frac{0{,}7858 – 0{,}7864}{0{,}7858}} \approx -0{,}0007$, ca. 0,1 % for høyt.

Tilnærmingen er altså blitt bedre, med bare 0,1 % feil i forhold til 2,6 % feil uten heltallskorreksjon.

Tilbake til oppgaven

Estimering

Oppgave 1:

Basert på at en bedrift på 6 tilfeldige dager produserer 210, 220, 210, 225, 220 og 217 støtfangere, skal vi gi et forventningsrett estimat for dagsproduksjonen av støtfangere.

Som estimat bruker vi gjennomsnittet: $\mu = \overline X = {\large \frac{210 + 220 + 210 + 225 + 220 + 217}{6}} = 217$.

Tilbake til oppgaven

Oppgave 2:

Basert på at en bedrift på 6 tilfeldige dager produserer 210, 220, 210, 225, 220 og 217 støtfangere, som i oppgave 1, og at standardavviket til produksjonen er σ = 5,8, skal vi angi estimert gjennomsnitt i form av en rapportering.

I oppgave 1 fant vi at gjennomsnittlig dagsproduksjon var 217 støtfangere.

I en rapportering angir vi estimert verdi pluss/minus standardavviket til estimatoren.

Standardavviket til estimatoren er $\frac{\displaystyle \sigma}{\displaystyle \sqrt n} = \frac{\displaystyle 5{,}8}{\displaystyle \sqrt 6} \approx 2{,}37$.

Så en rapportering av estimatet til gjennomsnittlig produksjon blir

$217 \pm \frac{\displaystyle 5{,}8}{\displaystyle \sqrt{6}} \approx 217 \pm 2{,}37$

Tilbake til oppgaven

Oppgave 3:

Basert på at en bedrift på 6 tilfeldige dager produserer 210, 220, 210, 225, 220 og 217 støtfangere, som i oppgave 1, skal vi estimere standardavviket til produksjonen og presentere estimert gjennomsnitt i form av en rapportering.

Vi fant i oppgave 1 at gjennomsnittsproduksjonen var 217 enheter

Vi estimerer standardavviket med utvalgsstandardavviket, som blir

 $\hat \sigma = S = \sqrt{\large \frac{(210 −217)^2 + (220 − 217)^2 + (210 −217)^2 + (225 − 217)^2 + (220 − 217)^2 + (217 − 217)^2}{5}} = 6$.

Og en rapportering blir

$217 \pm \frac{\displaystyle 6}{\displaystyle \sqrt{6}} \approx 217 \pm 2{,}45$

Tilbake til oppgaven

Oppgave 4:

Basert på at dagsproduksjonen av støtfangere i seks forskjellige dager er henholdsvis 210, 220, 210, 225, 220 og 217 enheter, som i oppgave 1, og at standardavviket til produksjonen er er σ = 5,8, skal vi angi et 95 % og 99 % konfidensintervall for gjennomsnittet til produksjonen.

Et 95 % konfidensintervall er gitt ved

$\overline X \pm 1{,}96 \cdot \frac{\displaystyle \sigma}{\displaystyle \sqrt n} = 217 \pm 1{,}96 \cdot {\large \frac{5{,}8}{\sqrt{6}}} \approx [212{,}36, \: 221{,}64]$

Et 99 % konfidensintervall er gitt ved

$\overline X \pm 2{,}58 \cdot \frac{\displaystyle \sigma}{\displaystyle \sqrt n} = 217 \pm 2{,}58 \cdot {\large \frac{5{,}8}{\sqrt{6}}} \approx [210{,}89, \: 223{,}11]$

Tilbake til oppgaven

Oppgave 5:

Vi skal bruke (normal) kvantiltabellen til å finne et 97 % konfidensintervall for gjennomsnittsvekta av laks når 13 laks er veid med et gjennomsnitt på 4,14 kg, og standardavviket til vekta i populasjonen er er σ = 0,7.

I et 97 % konfidensintervall er ${\large \frac{\alpha}{2}} = {\large \frac{1 − 0{,}97}{2}} = 0{,}015$. Vi slår opp ${\large \frac{\alpha}{2}} = 0{,}015$ i kvantiltabellen, der det står 2,1701.

Et 97 % konfidensintervall er da gitt ved

$\overline X \pm 2{,}17 \cdot \frac{\displaystyle \sigma}{\displaystyle \sqrt n} = 4,14 \pm 2{,}17 \cdot {\large \frac{0{,}7}{\sqrt{13}}} \approx [3{,}72, \: 4{,}56]$

Tilbake til oppgaven

Oppgave 6:

Vi skal bruke Excel til å beregne et 98 % konfidensintervall for gjennomsnittsproduksjonen av støtfangere, som på seks tilfeldige dager er 210, 220, 210, 225, 220 og 217 enheter, når vi vet at standardavviket til produksjonen er σ = 5,8.

Vi skriver =konfidens.norm(1-0,98; 5,8; 6) i Excel, og får ut 5,51.

Vi har tidligere beregnet at gjennomsnittsproduksjonen er 217 enheter.

Et 98 prosent konfidensintervall blir derfor om lag

[217 − 5,51, 217 + 5,51 = [211,49, 222,51]

Tilbake til oppgaven

Oppgave 7:

Basert på at 6 tilfeldige observasjoner gir at gjennomsnittlig antall produserte støtfangere er X = 217 og at produksjonens standardavvik er S = 6, skal vi lage og sammenlikne et 95 % konfidensintervall basert på normalfordeling, med et basert på t-fordeling.

I et 95 % konfidensintervall er ${\large \frac{\alpha}{2}} = {\large \frac{1 − 0{,}95}{2}} = 0{,}025$.

Vi vet fra tidligere at

${\large z_{0{,}025}} \approx 1{,}96$, eller vi slår det opp i (normal) kvantiltabellen.

Basert på normalfordelingen får vi derfor følgende 95 % konfidensintervall:

$217 \pm 1{,}96 \cdot {\large \frac{6}{\sqrt{6}}} \approx [212{,}2, \: 221{,}8]$

Siden vi har 6 observasjoner, får vi v = 6 − 1 = 5 frihetsgrader. 

Vi slår opp ${\large t_{0{,}025 \, (5)}}$ i (t) kvantiltabellen, og finner 2,571.

Basert på t-fordelingen får vi derfor følgende 95 % konfidensintervall:

$217 \pm 2{,}57 \cdot {\large \frac{6}{\sqrt{6}}} \approx [210{,}7, \: 223{,}3]$

Konfidensintervallet blir en del bredere med t-fordeling enn med normalfordeling, dette skyldes at usikkerheten er stor når standardavviket er estimert ut fra så lite som 6 målinger.

Tilbake til oppgaven

Oppgave 8:

Basert på 6 tilfeldige observasjoner med gjennomsnitt 217 og utvalgsstandardavvik 6 skal vi lage et 95 % konfidensintervall basert på t-fordeling ved hjelp av Excel.

I Excel skriver vi =konfidens.t(1-0,95; 6; 6) og får ut 6,30.

Så et 95 % konfidensintervall blir

217 ± 6,30 ≈ [210,7, 223,3]

Som er det samme som vi fant da vi gjorde beregningen for hånd i oppgave 7.

Tilbake til oppgaven

Oppgave 9:

Basert på at 35 av 2000 tilfeldige ladere er målt til å være defekte, skal vi estimere sannsynligheten for at en vilkårlig lader er defekt, og finne et 95 % konfidensintervall for denne sannsynligheten.

Et forventningsrett estimat for sannsynligheten for at en lader er defekt vil være andelen defekte ladere i utvalget. Altså:

$\hat p = {\large \frac{35}{2000}} = 0{,}0175$, altså 1,75 %.

Estimert standardavvik til estimatoren blir

$\sqrt{\large \frac{\hat p(1− \hat p)}{n}} = \sqrt{\large \frac{0{,}0175(1 − 0{,}0175)}{2000}} \approx 0{,}0029$.

En rapportering av sannsynligheten for at en lader er defekt blir da

0,0175 ± 0,067

I et 95 % konfidensintervall er ${\large \frac{\alpha}{2}} = {\large \frac{1 − 0{,}95}{2}} = 0{,}025$.

Vi vet fra tidligere at

${\large z_{0{,}025}} \approx 1{,}96$, eller vi slår det opp i (normal) kvantiltabellen.

Så et 95 % konfidensintervall blir

0,0175 ± 1,96 · 0,0029 ≈ [0,0118, 0,0232], mellom 1,18 % og 2,32 %.

Tilbake til oppgaven

Hypotesetesting

Oppgave 1:

Basert på at hundre terningkast gir 20 seksere, skal vi sette opp nullhypotese og alternativ hypotese for at terningen gir for mange seksere, og teste hypotesen med et signifikansnivå på 5 %.

Den alternative hypotesen er at terningen gir for mange seksere, det vil si at sannsynligheten for å få seks er mer enn en sjettedel, slik den er på en rettferdig terning. Kaller vi sannsynligheten for å få en sekser for p, har vi

$H_A: p > \frac{\displaystyle 1}{\displaystyle 6}$.

Nullhypotesen blir da at terningen er rettferdig, med sannsynlighet lik en sjettedel for å få en sekser:

$H_0: p = \frac{\displaystyle 1}{\displaystyle 6}$.

Grensen for forkastningsområdet blir zα = z0,05 ≈ 1,6449, som vi finner ved å slå opp 0,05 i (kvantil)normalfordelingstabellen. Alternativt kan vi finne denne verdien ved å skrive =norm.s.inv(1 – 0,05) i Excel eller inversnormalfordeling(0, 1, 1 – 0.05) i GeoGebra.

Testobservatoren blir

$Z = \frac{\displaystyle X − np_0}{\displaystyle \sqrt{np_0(1 − p_0)}} = \frac{\displaystyle 20 − 100 \cdot \frac{1}{6}}{\displaystyle \sqrt{100 \cdot \frac{1}{6} \Big(1 − \frac{1}{6} \Big)}} \approx 0{,}8944$.

Siden Z ≈ 0,8944 $\ngtr$ zα ≈ 1,6449, kan vi ikke forkaste nullhypotesen på signifikansnivå 5 %. 20 seksere i 100 kast gir altså ikke grunnlag for å si at terningen gir for mange seksere.

Tilbake til oppgaven

Oppgave 2:

Vi skal utføre samme test som i oppgave 1, men nå basert på at 1000 terningkast gir 200 seksere. Hypotesene blir de samme, og grensen for forkastningsområdet det samme, zα = z0,05 ≈ 1,6449.

Testobservatoren blir nå

$Z = \frac{\displaystyle X − np_0}{\displaystyle \sqrt{np_0(1 − p_0)}} = \frac{\displaystyle 200 − 1000 \cdot \frac{1}{6}}{\displaystyle \sqrt{1000 \cdot \frac{1}{6} \Big(1 − \frac{1}{6} \Big)}} \approx 2{,}8284$.

Z ≈ 2,8284 > zα ≈ 1,6449. Testobservatoren ligger langt inni forkastningsområdet, og vi forkaster nullhypotesen på signifikansnivå 5 %. 200 av 1000 seksere gir altså grunnlag for å si at terningen gir for mange seksere.

Sammenlikninger vi med oppgave 1, ser vi at det relative antallet seksere er det samme i begge tilfeller: $\frac{\displaystyle 20}{\displaystyle 100} = \frac{\displaystyle 200}{\displaystyle 1000} = 0{,}2$. Men å få 200 seksere på 1000 kast er altså mye mindre sannsynlig enn å få 20 på 100 kast. Det kommer av at den forventede spredningen, altså standardavviket, blir mindre jo flere forsøk vi gjør. 200 av 1000 seksere vil faktisk gi forkastning av nullhypotesen på så lite signifikansnivå som 0,25 %.

Tilbake til oppgaven

Oppgave 3:

Vi skal sette opp og gjennomføre en hypotesetest med et signifikansnivå på 1 % på om oljeinnholdet i dressingpakker er over 10 ml, når gjennomsnittet i 25 pakker er målt til 10,3 ml, og produksjonen har et standardavvik på 0,65 ml.

Hypotesene blir HA: μ > 10, H0: μ = 10.

Vi har X = 10,3, og σ = 0,65.

Vi vet fra eksempel 3 at grensen for forkastningsområdet er zα = z0,05 ≈ 1,6449.

Testobservatoren blir:

$Z = \frac{\displaystyle \overline X − \mu_0}{\displaystyle \frac{\sigma}{\sqrt n}} = \frac{\displaystyle 10{,}3 − 10}{\displaystyle \frac{0{,}65}{\sqrt{25}}} \approx 2{,}31$.

Siden Z ≈ 2,31 $\ngtr$ zα ≈ 2,3263, kan vi ikke forkaste nullhypotesen på 1 % signifikansnivå. Målingene indikerer altså ikke at dressingene i snitt inneholder mer enn 10 ml. olje.

Tilbake til oppgaven

Oppgave 4:

Basert på at 15 målinger av svartid på en servicetelefon gir et gjennomsnitt på 37 sekunder med et standardavvik på 14 sekunder skal vi sette opp og gjennomføre en hypotesetest på signifikansnivå 5 % på om oppgitt gjennomsnittlig ventetid på 30 sekunder er lav.

Hypotesene blir HA: μ > 30, H0: μ = 30.

Siden vi baserer oss på utvalgsstandardavviket, bruker vi t-fordeling i testen. Antall frihetsgrader blir 15 − 1 = 14. For å finne grensen til forkastningsområdet slår vi opp i (kvantil) t-fordelingstabellen, med t0,05 (14), der det står 1,761. Alternativt kan vi finne denne verdien ved å skrive =t.inv(1 – 0,05; 14) i Excel eller inverstfordeling(14, 1 – 0.05) i GeoGebra.

Testobservatoren blir

$T = \frac{\displaystyle \overline X − \mu_0}{\displaystyle \frac{S}{\sqrt n}} = \frac{\displaystyle 37 − 30}{\displaystyle \frac{14}{\sqrt{15}}} \approx 1{,}94$.

Siden T ≈ 1,94 > t0,05 (14) ≈ 1,761, kan vi forkaste nullhypotesen, og har på 5 % signifikansnivå grunnlag for å si at gjennomsnittlig ventetid er over 30 sekunder.

Tilbake til oppgaven

Oppgave 5:

Basert på at innholdet i 30 glass syltetøy i gjennomsnitt er målt til 47,7 % bær, med et standardavvik på 5,7 %, skal vi sette opp og gjennomføre hypotesetester på signifikansnivå 5 % og signifikansnivå 1 % på om syltetøyet inneholder mindre enn fabrikantens påstand om minst 50 % bær.

Hypotesene blir HA: μ < 50, H0: μ = 50.

Siden vi baserer oss på utvalgsstandardavviket, bruker vi t-fordeling i testen. Antall frihetsgrader blir 30 − 1 = 29. For å finne grensene til forkastningsområdene slår vi opp i (kvantil) t-fordelingstabellen, med henholdsvis t0,05 (29), der det står 1,699, og t0,01 (29), der det står 2,462. Alternativt kan vi finne disse verdiene ved å skrive henholdsvis  =t.inv(1 – 0,05; 29) og =t.inv(1 – 0,01; 29) i Excel, eller henholdsvis inverstfordeling(29, 1 – 0.05) og inverstfordeling(29, 1 – 0.01) i GeoGebra.

Siden vi har en venstresidig test, blir grensene −1,699 og −2,462.

Testobservatoren blir

$T = \frac{\displaystyle \overline X − \mu_0}{\displaystyle \frac{S}{\sqrt n}} = \frac{\displaystyle 47{,}7 − 50}{\displaystyle \frac{5{,}7}{\sqrt{30}}} \approx −2{,}21$.

Siden T ≈ −2,21 < −t0,05 (29) ≈ −1,699, kan vi på 5 % signifikansnivå forkaste nullhypotesen og akseptere hypotesen om at syltetøyet har for lite bær.

Men siden T ≈ −2,21 $\nless$t0,01 (29) ≈ −2,462, kan vi på 1 % nivå ikke forkaste nullhypotesen.

Tilbake til oppgaven

Oppgave 6:

Basert på 15 stikkprøver av sukkermengde med en vekt på gjennomsnittlig 82,5 gram og et standardavvik på 0,6 gram skal vi sette opp og gjennomføre en hypotesetest på signifikansnivå 1 % på om gjennomsnittlig sukkermengde er 83 gram.

Siden vi baserer oss på utvalgsstandardavviket, må vi bruke t-fordeling i testen, med 15 − 1 = 14 frihetsgrader. For å finne grensene til forkastningsområdet slår vi opp i (kvantil) t-fordelingstabellen, med t0,01/2 (14) = t0,005 (14), der det står 2,977. Alternativt kan vi finne denne verdien ved å skrive =t.inv(1 – 0,005; 14) i Excel eller inverstfordeling(14, 1 – 0.005) i GeoGebra.

Testobservator blir $T = \frac{\displaystyle \overline X − \mu_0}{\displaystyle \frac{S}{\sqrt n}} = \frac{\displaystyle 82{,}5 − 83}{\displaystyle \frac{0{,}6}{\sqrt{15}}} \approx −3{,}227$.

Siden |T| ≈ 3,227 > t0,005 (14) ≈ 2,977, kan vi på 1 % signifikansnivå forkaste nullhypotesen og akseptere hypotesen om at sukkermengden ikke er korrekt.

Tilbake til oppgaven

Samvariasjon

Oppgave 1:

Vi har gitt to datasett X og Y med 4 korresponderende verdier:

X1 = 242 X2 = 266 X3 = 218 X4 = 234
Y1 = 363 Y2 = 399 Y3 = 327 Y4 = 351

og skal beregne

  1. Gjennomsnittet i hvert av settene.
      
    $\overline X = \frac{\displaystyle 242 + 266 + 218 + 234}{\displaystyle 4} = 240$
     
    $\overline Y = \frac{\displaystyle 363 + 399 + 327 + 351}{\displaystyle 4} = 360$
     
  2. Standardavviket i hvert av settene.
     
    Summen av kvadratavvikene i X er
     
    (242 − 240)2 + (266 − 240)2 + (218 − 240)2 + (234 − 240)2 = 1200
     
    Og standardavviket blir
     
    $S_X = \sqrt {\frac{\displaystyle 1200}{\displaystyle 4-1}} = 20$
     
    Summen av kvadratavvikene i Y er
     
    (363 − 360)2 + (399 − 360)2 + (327 − 360)2 + (351 − 360)2 = 2700
     
    Og standardavviket blir
     
    $S_Y = \sqrt {\frac{\displaystyle 2700}{\displaystyle 4-1}} = 30$
     
  3. Kovariansen mellom settene.
     
    Summen av produktene av avstandene mellom verdi og gjennomsnitt i settene er
     
    (242 − 240)(363 − 360) + (266 − 240)(399 − 360) + (218 − 240)(327 − 360) + (234 − 240)(351 − 360) = 1800
     
    Og kovariansen blir
     
    $Cov(X, Y) =  \frac{\displaystyle 1800}{\displaystyle 4-1} = 600$
     
  4. Korrelasjonskoeffisienten mellom settene.
     
    $R(X, Y) =  \frac{\displaystyle Cov(X, Y)}{\displaystyle S_X S_Y} = \frac{\displaystyle 600}{\displaystyle 20 \cdot 30} = 1$

Tolkningen av korrelasjonskoeffsienten er at vi har perfekt samvariasjon. Hvis vi kontrollregner, ser vi at det stemmer, for hvert element i Y er lik det tilhørende elementet i X multiplisert med 1,5.

Tilbake til oppgaven

Sammenlikne datasett

Oppgave 1:

En bedrift sammenlikner to maskiner for å se om det er forskjell i mengden sukker de tilsetter i en matvare. Maskin X arbeider med et standardavvik på 0,11 og maskin Y med et standardavvik på 0,13. 

60 prøver av maskin X gir et snitt på 10,107 gram sukker, 75 prøver av maskin Y gir et snitt på 10,061 gram sukker.

Så skal vi sette opp hypoteser og gjennomføre en hypotesetest på 5 % signifikansnivå på om de to maskinene tilsetter forskjellig mengde sukker.

Vi har altså X = 10,107, Y = 10,061, σX = 0,11, σY = 0,13, nX = 60, nY = 75.

Hypotesene blir HA: μXμY , H0: μXμY .

Testobservatoren blir

$Z = \frac{\displaystyle 10{,}107 − 10{,}061}{\displaystyle \sqrt{\frac{(0{,}11)^2}{60} + \frac{(0{,}13)^2}{75}}} \approx 2{,}2261$

Siden vi har en tosidig test, skal vi forkaste nullhypotesen hvis |Z| > zα/2

Med 5 % signifikansnivå blir α/2 = 0,05/2 = 0,025.

Vi slår opp i (kvantil)normalfordelingstabellen med α = 0,025, der det står 1,9600. Alternativt kan vi finne denne verdien ved å skrive =norm.s.inv(1 – 0,025) i Excel eller inversnormalfordeling(0, 1, 1 – 0.025) i GeoGebra.

Siden |Z| ≈ 2,2261 > zα/2 ≈ 1,9600, kan vi forkaste vi nullhypotesen. Undersøkelsen bekrefter at det er forskjell på sukkermengdene.

Tilbake til oppgaven

Oppgave 2:

Frukthøsten til 13 kirsebærtrær av type X og 12 kirsebærtrær av type Y er vist i tabellen under, og vi skal sette opp og gjennomføre en hypotesetest på 5 % signifikansnivå på om de to typene trær gir forskjellig mengde frukt.

 Type X 44 44 56 46 47 38 58 53 49 35 46 30 41 
 Type Y 35 47 55 29 40 39 32 41 42 57 51 39   

Hypotesene blir HA: μXμY , H0: μXμY .

Vi har altså nX = 13, nY = 12.

Fra kalkulator eller PC får vi:

X = 45,1538

Y = 42,25

SX ≈ 7,9984

SY ≈ 8,7399

Vi beregner:

$S_P = \sqrt \frac{\displaystyle {S_X}^2(n^{\phantom 1}_X − 1) + {S_Y}^2(n^{\phantom 1}_Y − 1)}{\displaystyle n^{\phantom 1}_X + n^{\phantom 1}_Y − 2} \approx \sqrt \frac{\displaystyle {7{,}9984}^2(13 − 1) + {8{,}7399}^2(12 − 1)}{\displaystyle 13 + 12 − 2} \approx 8{,}3612$

Testobservatoren blir da

$T = \frac{\displaystyle \overline X − \overline Y}{\displaystyle S_P \sqrt{\frac{1}{n^{\phantom 1}_X} + \frac{1}{n^{\phantom 1}_Y}}} \approx \frac{\displaystyle 45{,}1538 − 42{,}25}{\displaystyle 8{,}3612 \sqrt{\frac{1}{13} + \frac{1}{12}}} \approx 0{,}8675$.

Siden vi har en tosidig test, skal vi forkaste nullhypotesen hvis |T| > tα/2 (v)

Med 5 % signifikansnivå blir α/2 = 0,05/2 = 0,025

Vi slår opp i (t) kvantiltabellen med a = 0,025 og v = 13 + 12 − 2 = 23, der det står 2,069. Alternativt kan vi finne denne verdien ved å skrive =t.inv(1 – 0,025; 23) i Excel eller inverstfordeling(23, 1 – 0.025) i GeoGebra.

Siden |T| ≈ 0,8675 $\ngtr$ tα/2 ≈ 2,069, kan vi ikke forkaste nullhypotesen. Undersøkelsen gir ikke grunnlag for å si at den ene typen trær gir mer kirsebær enn den andre.

Tilbake til oppgaven

Oppgave 3:

Basert på blodtrykket til 15 pasienter før og etter bruk av en medisin, vist i tabellen under, skal vi sette opp og gjennomføre en hypotesetest på 5 % signifikansnivå på om medisinen som en bieffekt reduserer blodtrykket.

 Før 70 80 72 76 76 76 72 78 82 64 74 92 74 68 84 
 Etter 78 72 62 70 58 66 68 52 64 72 74 60 74 72 74

Her gir det bare mening å gjøre en parvis test. Vi beregner først differansen mellom før og etter:

 Differanse 2 8 10 6 18 10 4 26 18 −8 0 32 0 −4 10 

Vi kaller «før» for X, «etter» for Y og differansen for D.

Hypotesene blir HA: μXμY , H0: μX ≤ μY .

Fra kalkulator eller PC får vi:

X = 8,8

SD ≈ 10,9753

Testobservatoren blir

$T = \frac{\displaystyle \overline D}{\displaystyle S_D \frac{1}{\sqrt n}} \approx \frac{\displaystyle 8{,}8}{\displaystyle 10{,}975 \frac{1}{\sqrt{15}}} \approx 3{,}1054$.

Siden vi har en ensidig test, skal vi forkaste nullhypotesen hvis |T| > tα (v)

Med 5 % signifikansnivå blir α = 0,05

Vi slår opp i (t) kvantiltabellen med a = 0,05 og v = 15 − 1 = 14, der det står 1,761. Alternativt kan vi finne denne verdien ved å skrive =t.inv(1 – 0,05; 14) i Excel eller inverstfordeling(14, 1 – 0.05) i GeoGebra.

Siden |T| ≈ 3.1054 > tα (v) ≈ 1,761, kan vi forkaste nullhypotesen. Testen gir absolutt grunnlag for å si at medisinen gir redusert blodtrykk.

Tilbake til oppgaven

Oppgave 4:

En bedrift skal undersøke om det er forskjell i sannsynlighetene for defekter ved to produksjonslinjer for bukser. De finner 147 av 2500 defekte ved første produksjonslinje og 151 av 2000 ved andre. Vi skal sette opp og på 5 % signifikansnivå teste en hypotese om at sannsynligheten for defekter er forskjellig ved de to linjene.

Vi kaller sannsynligheten for defekt ved linje 1 for p1 og sannsynligheten for defekt ved linje 2 for p2. Hypotesene blir

HA: p1p2 mot H0: p1p2.

Vi har n1 = 2500, n2 = 2000, X1 = 147, X2 = 151.

Vi estimerer

$\hat p_1 = \frac{\displaystyle 147}{\displaystyle 2500} =  0{,}0588$.

$\hat p_2 = \frac{\displaystyle 151}{\displaystyle 2000} = 0{,}0755$.

$\hat p = \frac{\displaystyle 147 + 151}{\displaystyle 2500 + 2000} \approx 0{,}0662$.

Og vi får

$Z \approx \frac{\displaystyle 0{,}0588 − 0{,}0755}{\displaystyle \sqrt{0{,}0662(1 − 0{,}0662)(\frac{\displaystyle 1}{\displaystyle 2500} + \frac{\displaystyle 1}{\displaystyle 2000})}} \approx −2{,}239$.

Siden vi har en tosidig test, skal vi forkaste nullhypotesen hvis |Z| > zα/2

Med 5 % signifikansnivå blir α/2 = 0,05/2 = 0,025.

I (kvantil)normalfordelingstabellen finner vi at z0,025 ≈ 1,9600. Alternativt kan vi finne denne verdien ved å skrive =norm.s.inv(1 – 0,025) i Excel eller inversnormalfordeling(0, 1, 1 – 0.025) i GeoGebra.

Siden |Z| ≈ 2,239 > zα/2 ≈ 1,9600, forkaster vi nullhypotesen og aksepterer den alternative hypotesen om at det er forskjell i sannsynligheten for defekt ved de to linjene.

Tilbake til oppgaven

Løsningsforslag, sannsynlighetsfordelinger

Binomisk fordeling

Oppgave 1:

X betegner antall kron i 8 kast med en juksemynt der sannsynligheten for kron er 0,6, og vi skal beregne de tre sannsynlighetene under ved bruk av formelen for binomisk fordeling, $P(X = x) = {\large \binom{n}{x}} p^x (1 − p)^{(n − x)}$, og kontrollere svarene i Excel eller GeoGebra.

Her er p = 0,6 siden sannsynligheten for kron er 0,6, og n = 8 fordi vi kaster 8 ganger.

  1. P(X = 4)
     Formelen gir
    ${\large \binom{8}{4}} (0{,}6)^4 (1 − 0{,}6)^{(8 − 4)} \approx 0{,}2322$
     I Excel og GeoGebra skriver vi henholdsvis =binom.fordeling.n(4; 8; 0,6; usann) og fordelingbinomial(8, 0.6, 4, false).
     
  2. P(X ≤ 2)
    Dette er summen av sannsynlighetene for at X er 0, 1 eller 2:
    $P(X = 0) + P(X = 1) + P(X = 2) =$
    ${\large \binom{8}{0}} (0{,}6)^0 (1 – 0{,}6)^{(8 \text{ – } 0)} + {\large \binom{8}{1}} (0{,}6)^1 (1 – 0{,}6)^{(8 \text{ – } 1)} + {\large \binom{8}{2}} (0{,}6)^2 (1 – 0{,}6)^{(8 \text{ – } 2)} \approx $
    $0{,}0007 + 0{,}0079 + 0{,}0413 = 0{,}0498$
    I Excel og GeoGebra skriver vi henholdsvis =binom.fordeling.n(2; 8; 0,6; sann) og fordelingbinomial(8, 0.6, 2, true).
     
  3. P(X ≤ 6)
     I stedet for å summere sannsynlighetene for at X er 0, 1, 2, 3, 4, 5 eller 6, er det enklere å benytte seg av den komplementære hendelsen, X > 6, altså at X er 7 eller 8.
    $P(X \le 6) = 1 − P(X > 6) = 1 − P(X = 7) − P(X = 8) =$
    $1 – {\large \binom{8}{7}} (0{,}6)^7 (1 – 0{,}6)^{(8 \text{ – } 7)} – {\large \binom{8}{8}} (0{,}6)^8 (1 – 0{,}6)^{(8 \text{ – } 8)} \approx$
    $1 – 0{,}0896 – 0{,}0168 = 0{,}8936$
    I Excel og GeoGebra skriver vi henholdsvis =binom.fordeling.n(6; 8; 0,6; sann) og fordelingbinomial(8, 0.6, 6, true).

Så skal vi vurdere om P(X = 7) er større, lik, eller lavere enn P(X = 1).

P(X = 7) tilsvarer «7 kron», mens P(X = 1) tilsvarer «7 mynt». Siden kron har høyere sannsynlighet enn mynt, vil en overvekt av kron være mer sannsynlig enn en tilsvarende overvekt av mynt, så P(X = 7) > P(X = 1). Hadde sannsynlighetene for mynt og kron vært like, p = 0,5, ville vi hatt P(X = 7) = P(X = 1).

Tilbake til oppgaven

Oppgave 2:

Vi skal finne E(X) og Var(X) når

  1. X er antall kron i 10 kast med en rettferdig mynt.
    Dette er en binomisk situasjon der kron betyr suksess og mynt betyr fiasko. Vi har n = 10 og p = 0,5, så vi får
    E(X) = n · p = 10 · 0,5 = 5.
    Var(X) = n · p(1 − p) = 10 · 0,5(1 − 0,5) = 2,5.
     
  2. X er antall seksere i 5 kast med en rettferdig terning.
    Dette er en binomisk situasjon der «sekser» betyr suksess og «ikke sekser» betyr fiasko. Vi har n = 5 og $p = {\large \frac{1}{6}} \approx 0{,}167$, så vi får
    E(X) = n · p = 5 · 0,167 ≈ 0,84.
    Var(X) = n · p(1 − p) = 5 · 0,167(1 − 0,167) ≈ 0,70.

Tilbake til oppgaven

Hypergeometrisk fordeling

Oppgave 1:

I en forening med 65 medlemmer er 13 negative til et forslag. Vi velger 20 representanter tilfeldig fra gruppen og skal finne sannsynligheten for at et visst antall er negative. Lar vi X være antall negative representanter, er P(X) hypergeometrisk fordelt med N = 65 elementer, av disse er M = 13 spesielle, altså negative. Vi trekker n = 20 ganger og skal finne sannsynligheten for at

  1. Ingen av representantene er negative.
    Vi får
    $P(X = 0) = \frac{\displaystyle \binom{13}{0} \cdot \binom{65 − 13}{20 − 0}}{\displaystyle \binom{65}{20}} \approx 0{,}0044$.
    Det er ca. 0,44 % sannsynlighet for at ingen er negative.
    I Excel og GeoGebra skriver vi henholdsvis =hypgeom.fordeling.n(0; 20; 13; 65; usann) og fordelinghypergeometrisk(65, 13, 20, 0, false).
     
  2. Én av representantene er negativ.
    Vi får
    $P(X = 1) = \frac{\displaystyle \binom{13}{1} \cdot \binom{65 − 13}{20 − 1}}{\displaystyle \binom{65}{20}} \approx 0{,}0350$.
    Det er ca. 3,5 % sannsynlighet for at én er negativ.
    I Excel og GeoGebra skriver vi henholdsvis =hypgeom.fordeling.n(1; 20; 13; 65; usann) og fordelinghypergeometrisk(65, 13, 20, 1, false).
     
  3. To eller flere av representantene er negative.
    Dette kan vi beregne som
    P(X = 2) + P(X = 3) + … + P(X = 20), men det er mye enklere å se på den komplementære hendelsen. Da kan vi også bruke det vi har funnet i punkt 1 og 2.
    Vi får
    P(X ≥ 2) = 1 − P(X = 0) − P(X = 1) ≈ 1 − 0,004 − 0,035 = 0,9610.
    Det er ca. 96,10 % sannsynlighet for at to eller flere er negative.
    I Excel og GeoGebra skriver vi henholdsvis =1 – hypgeom.fordeling.n(1; 20; 13; 65; sann) og 1 – fordelinghypergeometrisk(65, 13, 20, 1, true).

RegnearkLast ned regneark med beregningene fra oppgave 1
 

​Tilbake til oppgaven

Oppgave 2

Vi skal bruke formelen for hypergeometrisk fordeling til å finne sannsynligheten for å få henholdsvis 5 og 4 rette i Lotto. Vi trekker da 7 tall fra en mengde på 34, der 7 er spesielle (vinnertallene), og beregner hva sannsynligheten for å få henholdsvis 5 og 4 av de spesielle er. Vi får

$P(X = 5) = \frac{\displaystyle \binom{7}{5} \cdot \binom{34 − 7}{7 − 5}}{\displaystyle \binom{34}{7}} \approx 1{,}3702 \cdot 10^{−3}$.

$P(X = 4) = \frac{\displaystyle \binom{7}{4} \cdot \binom{34 − 7}{7 − 4}}{\displaystyle \binom{34}{7}} \approx 1{,}9030 \cdot 10^{−2}$.

Det er om lag 0,137 % sannsynlighet for å få 5 rette, og om lag 1,903 % sannsynlighet for å få 4 rette.

​Tilbake til oppgaven

Oppgave 3

Vi skal finne E(X) og Var(X) i et utvalg der N = 65, M = 13 og n = 20. Vi får

$E(X) = 20 \cdot {\large \frac{13}{65}} = 4$.

$Var(X) = \Big({\large \frac{65 − 20}{65 − 1}} \Big) \cdot 20 \cdot {\large \frac{13}{65}} \cdot \Big(1 − {\large \frac{13}{65}} \Big) = 2{,}25$.

​Tilbake til oppgaven

Poissonfordeling

Oppgave 1:

Vi vet at det i en vannprøve i gjennomsnitt er to hoppekreps, at forekomsten av hoppekreps er poissonfordelt, og skal finne sannsynligheten for at en tilsvarende vannprøve inneholder et gitt antall hoppekreps ved hjelp av formelen for poissonfordeling, $P(X = x) = \frac{\displaystyle \lambda^x}{\displaystyle x!}e^{− \lambda}$.

  1. Sannsynligheten for ingen hoppekreps.
    $P(X = 0) = \frac{\displaystyle 2^{0}}{\displaystyle 0!}e^{−2} \approx 0{,}1353$.
    I Excel og GeoGebra skriver vi henholdsvis =poisson.fordeling(0; 2; usann) og fordelingpoisson(2, 0, false).
     
  2. Sannsynligheten for én hoppekreps
    $P(X = 1) = \frac{\displaystyle 2^{1}}{\displaystyle 1!}e^{−2} \approx 0{,}2707$.
    I Excel og GeoGebra skriver vi henholdsvis =poisson.fordeling(1; 2; usann) og fordelingpoisson(2, 1, false).
     
  3. Sannsynligheten for to eller flere hoppekreps. Vi ser på den komplementære hendelsen:
    $P(X \ge 2) = 1 − P(X = 1) − P(X = 0) \approx 1 − 0{,}1353 − 0{,}2707 = 0{,}5940$.
    I Excel og GeoGebra skriver vi henholdsvis =1 – poisson.fordeling(1; 2; sann) og 1 – fordelingpoisson(2, 1, true).

RegnearkLast ned regneark med beregningene fra oppgave 1
 

​Tilbake til oppgaven

Tilnærme fordelinger

Oppgave 1:

Innbyggerne i en by med 10 000 innbyggere er delt akkurat på midten når det gjelder synet på kommunesammenslåing. Vi trekker 100 innbyggere tilfeldig og skal beregne sannsynligheten for at den gruppen også er delt akkurat på midten.

Her har vi altså N = 10 000, M = 5000, n = 100, og skal finne P(X = 50).

  1. Vi skal først bruke hypergeometrisk fordeling og får:
    $P(X = 50) = \frac{\displaystyle \binom{5000}{50} \cdot \binom{10000 − 5000}{100 − 50}}{\displaystyle \binom{10000}{100}} \approx 0{,}0800$.
    Vi ser at mellomregningene involverer svært høye tall, for eksempel er ${\large \binom{10000}{100}} \approx 6{,}52 \cdot 10^{241}$.
     
  2. Så skal vi avgjøre om en tilnærming med binomisk fordeling vil være god. Vi har n = 100 og ${\large \frac{N}{20}} = 500$. Siden $n \le {\large \frac{N}{20}}$, er tilnærmingen god.
     
  3. Vi bruker binomisk fordeling og får: $P(X = 50) = {\large \binom{100}{50}} (0,5)^{50} (1 − 0,5)^{100 − 50} \approx 0{,}0796$.
     
  4. Med fire siffer bak komma ble feilen 0,0800 − 0,0796 = 0,0004.

Tilbake til oppgaven

Oppgave 2:

Vi skal bruke binomisk sannsynlighetsfordeling for å finne sannsynligheten for å få spar ess minst én gang når vi trekker 75 ganger fra en komplett kortstokk. Vi har n = 75 og $p = {\large \frac{1}{52}} \approx 0{,}0192$. Det enkleste er å basere seg på sannsynligheten for den komplementære hendelsen «aldri spar ess»:

$P(X \ge 1) = 1 − P(X = 0) = 1 − {\large \binom{75}{0}} (0{,}0192)^0 (1 − 0{,}0192)^{75 − 0} \approx 0{,}7664$.

Så skal vi avgjøre om vi kan bruke poissonfordeling til å beregne denne sannsynligheten. Vi har n = 75, som er innenfor grensa på n > 50, og vi har p = 0,0192, som er innenfor grensa på p ≤ 0,05, så tilnærmingen bør være god. Vi har λ = 75 · 0,0192 = 1,44 og får

$P(X \ge 1) = 1 − P(X = 0) = 1 − {\large \frac{(1{,}44)^0}{0!}}e^{−1{,}44} \approx 0{,}7631$

Tilbake til oppgaven

Normalfordelingen

Oppgave 1:

Vi skal bruke normalfordelingstabellen til å finne

    1. P(Z ≤ 0,85)
      Det vil si G(0,85).
      Vi leser av tabellen der rad 0,8 krysser kolonne 0,05, der det står
      0,8023.
       
    2. P(Z ≤ −1,21)
      Det vil si G(−1,21) = 1 − G(1,21)
      Vi leser av tabellen der rad 1,2 krysser kolonne 0,01, der det står 0,8669.
      Så vi får 1 − 0,8669 = 0,1131.
       
    3. P(−0,22 ≤ Z ≤ 0,22)
      Det vil si G(0,22) − G(−0,22) = G(0,22) − [1 − G(0,22)] = 2 · G(0,22) − 1
      Vi leser av tabellen der rad 0,2 krysser kolonne 0,02, der det står 0,5871.
      Så vi får 2 · 0,5871 − 1 = 0,1742.

Tilbake til oppgaven

Oppgave 2:

På en eksamen er resultatene N(14, 22), og vi skal finne hvor mange som kan forventes å ikke stå, det vil si få 12 poeng eller mindre. Vi skal beregne ved hjelp av normalfordelingstabellen, Excel og GeoGebra.

Det vi skal beregne er P(X ≤ 12) i den gitte fordelingen. Vi gjør en standardisering og finner ut at dette tilsvarer $G({\large \frac{12 − 14}{2}}) = G(−1) = 1 − G(1)$. Vi går inn i normalfordelingstabellen, rad 1,0 og kolonne 0,00, der det står 0,8413.

P(X < 12) ≈ 1 − 0,8413 = 0,1587. Om lag 15,8 % kan forventes å ikke stå.

I Excel skriver vi =norm.fordeling(12; 14; 2; sann) og får 0,1587.

I GeoGebra skriver vi fordelingnormal(14, 2, 12) og får det samme. (Muligens etter at vi har brukt menyen «Innstillinger» – «Avrunding» til å sette at GeoGebra skal vise tall med 4 desimaler.

Tilbake til oppgaven