PROGRAMMERING I MATEMATIKK

ETTERUTDANNINGSKURS FOR LÆRERE I VGS

Løsningsforslag til oppgavene (2. utgave av kursheftet)

Finner du feil eller har forbedringsforslag? Send en e-post til knut @ skrindo no.


print("Hello, World!")


print(3+4**2-3/(2**4+1))
    

Svar: 18.823529411764707

      
print(50//6)
      
      
    

      
print(50%6)


print(167335%3==0)

Svar: Nei.


print(64%2 == 0)


print(115469%12)

Klokka er fem.


a = 5
a += 5
a += 5
a += 5


a = 2
b = 3
c = a
a = b
b = c


v_0 = 5
a = 9.81
t = 4
uttrykk = v_0*t + (1/2)*a*t**2

tall = 56
print(f'Verdien av variabelen tall er {tall}.')  


a = 11/7
print(f"{a:.2f}")


a = 1000
b = a//23
svar = b*23
print(svar)


l = 3
b = 4
h = 5
overflate = 2*l*b + 2*l*h + 2*b*h
volum = l*b*h
print(f"Overflaten er {overflate}.")
print(f"Volume er {volum}.")


fornavn = input("Skriv inn fornavnet ditt: ")
etternavn = input("Skriv inn etternavnet ditt: ")
print(f"Hei, {fornavn} {etternavn}!")


tall = float(input("Skriv inn et tall: "))
print(f"Du tastet inn tallet {tall}.")


tall = float(input("Skriv inn et tall: "))
halvparten = tall/2
print(f"Halvparten av {tall} er {halvparten}.")


tall = int(input("Skriv inn et tall: "))
antall = (tall//5)
print(f"Tallet {tall} er minst {antall} ganger så stort som 5.")


tall = int(input("Skriv inn et tall: "))
if tall > 0:
    print(f"Tallet {tall} er positivt.")
elif tall < 0:
    print(f"Tallet {tall} er negativt.")
else:
    print(f"Tallet {tall} er null.")


tall1 = int(input("Skriv inn et tall: "))
tall2 = int(input("Skriv inn et tall til: "))

if tall1 == tall2:
    print(f"Tallene {tall1} og {tall2} er like.")
else:
    print(f"Tallene {tall1} og {tall2} er ikke like.")


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

if tall%2==0:
    print(f"Tallet {tall} er et partall.")
else:
    print(f"Tallet {tall} er et oddetall.")


tall1 = float(input("Skriv inn et tall: "))
tall2 = float(input("Skriv inn et tall: "))

if tall1*tall2 > 0:
    print(f"Tallene {tall1} og {tall2} har samme fortegn.")
elif tall1*tall2 < 0:
    print(f"Tallene {tall1} og {tall2} har ulikt fortegn.")
else:
    print(f"Et av tallene {tall1} eller {tall2} er null.")


for i in range(1, 101,2):
    print(i)

Alternativ løsning:


for i in range(0, 100):
    if i%2 == 1:
        print(i)


print("x\t f(x)")
print("-------------")

for x in range(0, 10):
    print(f"{x}\t {x**2 + 3*x - 1}")

Litt penere utskrift:


print(" x\t f(x)")
print("-------------")

for x in range(0, 10):
    print(f"{x:2}\t {x**2 + 3*x - 1:4}")


a_n = 3
k = 2

for i in range(100):
    print(a_n)
    a_n = a_n * k


for i in range(4):
    print('x'*(2*i + 1))

  
start = 7
slutt = 15
svar = 0
temp = start

while slutt - temp > 0:
    svar += 1
    temp += 1

print(f"{slutt}-{start} = {svar}")


start = 1
slutt = 128
svar = 0
temp = start

while temp != slutt:
    svar += 1
    temp *= 2

print(f"Løsningen er {svar}.")


fortsett = True

while fortsett:
    print("Hei, hei! :)")
    svar = input("Vil du fortsette? Svar «ja» eller «nei»: ")
    if svar == "nei":
        fortsett = False


def multiplikasjon(n,m):
    return n*m


def f(x):
    return 3*x**2 + 3

print(f(0))
print(f(-3))
print(f(5))


def addisjon(n, m):
    print(f"{n} + {m} = {n+m}")

  
liste = [0,1,2,3,4,5,6,7,8,9]
eller

liste = list(range(10))

  
liste = []
liste.append("Niels")
liste.append("Henrik")
liste.append("Caspar")


liste = []

liste.append('brøk')
liste.append('likninger')
liste.append('mengdelære')

print(len(liste))

  
matematikere = ['Abel', 'Bernoulli', 'Cauchy', 'Descartes', 'Euler', 'Fibonacci',\
         'Gauss', 'Hilbert', 'ibn Musa al-Khwarizmî', 'Jacobi']

tredje = matematikere[2]
fjerde = matematikere[3]
femte = matematikere[4]
print(tredje, fjerde, femte)


liste = []

ønsket_lengde = int(input("Skriv inn et heltall: "))

print(f"Legger inn {ønsket_lengde} 1-tall i en liste.")

while len(liste) < ønsket_lengde:
    liste.append(1)
    
print(liste)


def f(x):
    return x**2 + 3*x - 1

xverdier = []
yverdier = []

fortsett = True

while fortsett:
    svar = input('Skriv inn x-verdi. (Avslutt med "q".) ')
    if svar.lower() == 'q':
        fortsett = False
    else:
        x = float(svar)
        xverdier.append(x)

for x in xverdier:
    yverdier.append(f(x))

print('x\t f(x)')    
for i in range(len(xverdier)):
    print(f'{xverdier[i]:7} {yverdier[i]:7}')


partall = []
for i in range(0,101,2):
    partall.append(i)
eller
  
partall = list(range(0,101,2))

def gjennomsnitt(a, b):
    return (a + b)/2

for i in range(2,10,2):
    print(gjennomsnitt(i, i+1))


tall = int(input("Skriv inn et tall: "))
temptall = tall
teller = 0

while temptall > 1:
    teller += 1
    temptall /= 10
    
print(f"Tallet {tall} har {teller} sifre.")
eller

tall = input("Skriv inn et tall: ")
print(f"Tallet {tall} har {len(tall)} sifre.")


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

for i in range(tall + 1):
    summen += i
    
print(summen)


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

if tall%2 != 1:
    print("Tallet er ikke et oddetall!")
else:
    summen = 0
    for i in range(1, tall + 1, 2):
        summen += i
    print(summen)


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

for i in range(1, tall):
    if i%6 == 0:
        print(i)
eller

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

for i in range(6, tall, 6):
        print(i)


def x_n(x,n):
    potens = 1
    for i in range(n):
        potens *= x
    return potens


a_i = 1
a_j = 1
print(a_i)
print(a_j)

for i in range(2, 100):
    a_k = a_i + a_j
    print(a_k)
    a_i = a_j
    a_j = a_k


for i in range(4):
    print(' ' * (4 - (i+1)),'x' * (2*i+1))


primtall = [2]
for i in range(3,100,2):
    iPrimisk = True
    for j in primtall:
        if i % j == 0:
            iPrimisk = False
    if iPrimisk:
        primtall.append(i)


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

primtallsfaktorer = [1]

for i in range(2,tall):
    if tall%i == 0:
        iPrimtallsfaktor = True
        for j in primtallsfaktorer[1:]:
            if i%j == 0:
                iPrimtallsfaktor = False
        if iPrimtallsfaktor:
            primtallsfaktorer.append(i)

if primtallsfaktorer == [1]:
    print(f"Tallet {tall} er et primtall.")
else:
    print(f"Største primtallsfaktor i {tall} er {max(primtallsfaktorer[1:])}.")


n = int(input("Skriv inn et heltall: "))

objekt = n
funnet = False
while not funnet:
    objekt += 1
    divisorer = [1]
    for i in range(2, objekt):
        if objekt%i == 0:
            divisorer.append(i)
    if sum(divisorer) == objekt:
        funnet = True

print(f"Neste perfekte tall etter {n} er {objekt}.")


def f(x):
    return x**2 + 2*x + 3

print(f'x\t f(x)')

for x in range(10):
    print(f'{x}\t {f(x)}')


def f(x):
    return x**2 + 2*x + 3

nedregrense = int(input('Skriv inn nedre grense: '))
øvregrense = int(input('Skriv inn øvre grense: '))
trinnlengde = int(input('Skriv inn trinnlengde: '))

print(f'x\t f(x)')

for x in range(nedregrense, øvregrense + 1, trinnlengde):
    print(f'{x}\t {f(x)}')


import numpy as np
print(np.pi)
print(np.e)


import random

print(random.randint(1,6))
print(random.random())

randint(1,6) trekker ut et tilfeldig heltall blant \(\{1, 2, \ldots , 6\}\), altså som å kaste terning.

random() trekker ut et tilfeldig tall mellom 0 og 1


import numpy as np

x_verdier = np.arange(0,10,.1)

def f(x):
    return x**2 + 3*x + 1
for x in x_verdier:
    print(f"{x:.2f}\t{f(x):.2f}")


import numpy as np

print("Løsning av andregradslikningen ax**2 + bx +c = 0.")
a = float(input("Skriv inn koeffisienten a: "))
b = float(input("Skriv inn koeffisienten b: "))
c = float(input("Skriv inn koeffisienten c: "))

d = b**2 - 4*a*c

if d < 0:
    print("Likningen har ingen løsning.")
elif d == 0:
    print("Likningen har løsning x = {-b/(2*a):.3f}")
else:
    x_1 = (-b + np.sqrt(d))/(2*a)
    x_2 = (-b - np.sqrt(d))/(2*a)
    print(f"Løsningen av likningen er x = {x_1:.3f} eller x = {x_2:.3f}.")

Det er mange måter å skrive dette programmet på. Her kommer én mulig variant.

import random

fortsett = True
poeng_maskin = 0
poeng_bruker = 0

while fortsett:
    maskin = random.randint(1,3) #1=stein, 2=saks, 3=papir
    bruker = input("Skriv inn st(ein), sa(ks) eller p(apir): ")
    
    if maskin == 1:
        maskinvalg="stein"
    elif maskin ==2:
        maskinvalg="saks"
    else:
        maskinvalg="papir"
    #
    if bruker == "st":
        brukervalg="stein"
    elif bruker =="sa":
        brukervalg="saks"
    elif bruker == "p":
        brukervalg="papir"
    else:
        print("Feil! Du skulle tastet inn st, sa eller p.")
    
    print(f"\nDu valgte {brukervalg}.")
    print(f"Maskinen valgte {maskinvalg}.")
    
    if (bruker == 'st' and maskin==1):
        print("Uavgjort!")
    elif (bruker == 'st' and maskin==2):
        poeng_bruker += 1
        print("Du vinner.")
    elif (bruker == 'st' and maskin==3):    
        poeng_maskin += 1
        print("Maskinen vinner.")
    elif (bruker == 'sa' and maskin==2):
        print("Uavgjort!")
    elif (bruker == 'sa' and maskin==3):
        poeng_bruker += 1
        print("Du vinner.")
    elif (bruker == 'sa' and maskin==1):
        poeng_maskin += 1
        print("Maskinen vinner.")
    elif (bruker == 'p' and maskin==3): 
        print("Uavgjort!")
    elif (bruker == 'p' and maskin==1): 
        poeng_bruker += 1
        print("Du vinner.")
    elif (bruker == 'p' and maskin==2): 
        poeng_maskin += 1
        print("Maskinen vinner.")
    else:
        print("Noe galt skjedde.")
    
    print("")
    svar = input("Vil du spille igjen? (j/n) ")
    if svar.lower() != "j":
        print("Da slutter vi. :-)")
        fortsett = False
        if poeng_bruker > poeng_maskin:
            print(f"Du vant! Stillingen ble {poeng_bruker} – {poeng_maskin} til deg.")
        elif poeng_bruker < poeng_maskin:
            print(f"Maskinen vant. Stillingen ble {poeng_maskin} – {poeng_bruker} til maskinen.")
        else:
            print("Det ble uavgjort!")


import matplotlib.pyplot as plt
plt.plot([0, 5, 10, 15],[30, 43, 55, 60],'o')


import matplotlib.pyplot as plt
import numpy as np

xstart = -10
xslutt = 10
trinn = 0.01

def f(x):
    return x**2 + 3*x - 4

x = np.arange(xstart, xslutt, trinn)
y = f(x)

plt.plot(x, y)


def f(x):
    return 3*x - 4 - (3/2)*x + 7

nedregrense = -10
øvregrense = 10
presisjon = .01

a = nedregrense
b = øvregrense
m = (a + b)/2
feil = False

while b - a > presisjon:
   if f(a) * f(m) < 0:
      b = m
   elif f(b) * f(m) < 0:
      a = m
   elif f(m) == 0:
      break
   else:
      feil = True
      break
   m = (a + b)/2

if feil:
    print(f"f({a}) og f({b}) er på samme side av x-aksen.")
    print(f"Jeg finner ingen løsning.")
else:
    print(f"Funksjonen har et nullpunkt i x = {m:.3f}.")

Vi bruker \(f(x)=x^2+3x-5\). Først \(x\) mellom \(-10\) og \(0\), og så mellom \(0\) og \(10\). Det gir \(x= -4{,}194\) eller \(x=1{,}196\).

Vi bruker \(f(x)=x+\sin x-4\) med \(x\) mellom \(0\) og \(10\). Det gir \(x=4{,}966\).

Vi bruker \(f(x)=x\lg x-2\) med \(x\) mellom \(1\) og \(10\). Det gir \(x=2{,}349\)


import numpy as np
def f(x):
    return x+np.sin(x)-4

nedregrense = 0
øvregrense = 100
presisjon = .01

a = nedregrense
b = øvregrense
m = (a + b)/2
feil = False
antall_iterasjoner = 0

while b - a > presisjon:
   if f(a) * f(m) < 0:
      b = m
   elif f(b) * f(m) < 0:
      a = m
   elif f(m) == 0:
      break
   else:
      feil = True
      break
   m = (a + b)/2
   antall_iterasjoner += 1

if feil:
    print(f"f({a}) og f({b}) er på samme side av x-aksen.")
    print(f"Jeg finner ingen løsning.")
else:
    print(f"Funksjonen har et nullpunkt i x = {m:.3f}.")
    print(f"Programmet brukte {antall_iterasjoner} halveringer.")


import numpy as np
def f(x):
    return x+np.sin(x)-4

nedregrense = 0
øvregrense = 10
presisjon = .01

a = nedregrense
b = øvregrense
m1 = a + (b - a)/3
m2 = a + 2*(b - a)/3
feil = False

while b - a > presisjon:
    if f(a) * f(m1) < 0:
        b = m1
    elif f(m1) * f(m2) < 0:
        a = m1
        b = m2
    elif f(m2) * f(b) < 0:
        a = m2
    elif f(m1) == 0:
        break
    elif f(m2) == 0:
        break
    else:
        feil = True
        break
    m1 = a + (b - a)/3
    m2 = a + 2*(b - a)/3

if feil:
    print(f"f({a}) og f({b}) er på samme side av x-aksen.")
    print(f"Jeg finner ingen løsning.")
else:
    print(f"Funksjonen har et nullpunkt i x = {(m1+m2)/2:.3f}.")


import random
antall_kast = 1000
antall_kron = 0

for i in range (antall_kast):
    kast = random.randint(0,1)
    if kast == 1:
        antall_kron +=1

print(f"Det ble {antall_kron} kron og {antall_kast - antall_kron} mynt på {antall_kast} kast.")


import random
antall_kast = 1000
antall_en = 0
antall_to = 0
antall_tre = 0
antall_fire = 0
antall_fem = 0
antall_seks = 0

for i in range(antall_kast):
    kast = random.randint(1,6)
    if kast == 1:
        antall_en += 1
    elif kast == 2:
        antall_to += 1
    elif kast == 3:
        antall_tre += 1
    elif kast == 4:
        antall_fire += 1
    elif kast == 5:
        antall_fem += 1
    else:
        antall_seks += 1

print(f"Resultatet etter {antall_kast} kast:")
print("")
print(f"Antall enere:\t{antall_en}")
print(f"Antall toere:\t{antall_to}")
print(f"Antall treere:\t{antall_tre}")
print(f"Antall firere:\t{antall_fire}")
print(f"Antall femere:\t{antall_fem}")
print(f"Antall seksere:\t{antall_seks}")


import random

teoremer = ["Pythagoras setning", "Nullpunktssetningen", \
            "Setning om vinkelhalveringslinjer", "Analysens fundamentalsetning",\
            "Første logaritmesetning", "Andre logaritmesetning", \
            "Tredje logaritmesetning", "Første kvadratsetning", \
            "Andre kvadratsetning", "Konjugatsetningen"]

print(random.sample(teoremer, 3))


import numpy as np

def f(x):
    return np.sqrt(x**2 + 3*x)

deltax = 0.01
x_0 = 3

derivert = (f(x_0 + deltax) - f(x_0))/deltax

print(derivert)


import numpy as np
import matplotlib.pyplot as plt

def f(x):
    return np.sqrt(x**2 + 3*x)

def derivert(f, x, deltax):
    return (f(x + deltax) - f(x))/deltax

xstart = 0.1
xslutt = 10
deltax = 0.01

x = np.arange(xstart, xslutt, .1)
y1 = f(x)
y2 = derivert(f,x,deltax)

plt.plot(x, y1)
plt.plot(x, y2)


import numpy as np

xstart = 1
xslutt = 3
antall_partisjoner = 10000
delta_x = (xslutt - xstart)/antall_partisjoner

def f(x):
    return np.sin(x)

xverdier = np.linspace(xstart,xslutt,antall_partisjoner)
integral = 0

for x in xverdier[:-1]:
    integral += f(x)*delta_x

print(f"{integral:.3f}")

Som over, men bytter ut grensene med \(0\) og \(5\) og funksjonen med «np.exp(2*x)».

Som over, men bytter ut grensene med \(-2\) og \(5\) og funksjonen med «x**2 + 3».


import numpy as np

xstart = 1
xslutt = 3
antall_partisjoner = 10000
delta_x = (xslutt - xstart)/antall_partisjoner

def f(x):
    return np.sin(x)

xverdier = np.linspace(xstart,xslutt,antall_partisjoner)
integral = 0

for x in xverdier[:-1]:
    integral += f(x + delta_x)*delta_x

print(f"{integral:.3f}")


import numpy as np

xstart = 1
xslutt = 3
antall_partisjoner = 10000
delta_x = (xslutt - xstart)/antall_partisjoner

def f(x):
    return np.sin(x)

xverdier = np.linspace(xstart,xslutt,antall_partisjoner)
integral = 0

for x in xverdier[:-1]:
    integral += f(x + delta_x/2)*delta_x

print(f"{integral:.3f}")


import numpy as np

xstart = 1
xslutt = 3
antall_partisjoner = 10000
delta_x = (xslutt - xstart)/antall_partisjoner

def f(x):
    return np.sin(x)

xverdier = np.linspace(xstart,xslutt,antall_partisjoner)
integral = 0

for x in xverdier[:-1]:
    integral += (f(x + delta_x) + f(x))/2*delta_x

print(f"{integral:.3f}")


import numpy as np

x = [0,10,31,53]
y = [0,25,52,98]

astart = .5
aslutt = 3
deltaa = .01
bestea = astart

minste_kvadratavvik = np.inf

for a in np.arange(astart,aslutt,deltaa):
    kvadratavvik = 0
    for i in range(len(x)):
        observert_y = y[i]
        utregnet_y = a * x[i]
        kvadratavvik += (observert_y - utregnet_y)**2
    if kvadratavvik < minste_kvadratavvik:
        minste_kvadratavvik = kvadratavvik
        bestea = a

print(f'Svar: y = {bestea:.2f}x')


import numpy as np
import matplotlib.pyplot as plt

x = [0,10,31,53]
y = [0,25,52,98]

astart = .5
aslutt = 2
deltaa = .1

bstart = -2
bslutt = 3
deltab = .1

bestea = astart
besteb = bstart

minste_kvadratavvik = np.inf

for a in np.arange(astart,aslutt,deltaa):
    for b in np.arange(bstart,bslutt,deltab):
        kvadratavvik = 0
        for i in range(len(x)):
           observert_y = y[i]
           utregnet_y = a * x[i] + b
           kvadratavvik += (observert_y - utregnet_y)**2
        if kvadratavvik < minste_kvadratavvik:
           minste_kvadratavvik = kvadratavvik
           bestea = a
           besteb = b
plt.plot(x,y,'o')
t1 = np.arange(0,x[-1],0.01)
t2 = bestea*t1 + besteb
plt.plot(t1,t2,label = f"y = {bestea:.1f}x + {besteb:.1f}")
plt.legend()


import matplotlib.pyplot as plt
import numpy as np

x_0 = 0
y_0 = 0
deltax = .01

xstart = x_0
xslutt = 10

antall_punkter = int((xslutt - xstart)/deltax) + 1
x = np.zeros(antall_punkter)
x[0] = x_0

y = np.zeros(antall_punkter)
y[0] = y_0

for i in range(len(x)-1):
    x[i+1] = x[i] + deltax
    y[i+1] = y[i] + deltax * (3*x[i]**2 + 1)

plt.plot(x,y)


import matplotlib.pyplot as plt
import numpy as np

x_0 = 1
y_0 = 3
deltax = .01

xstart = x_0
xslutt = 10

antall_punkter = int((xslutt - xstart)/deltax) + 1
x = np.zeros(antall_punkter)
x[0] = x_0

y = np.zeros(antall_punkter)
y[0] = y_0

for i in range(len(x)-1):
    x[i+1] = x[i] + deltax
    y[i+1] = y[i] + deltax * ((1/x[i])*y[i] - 3/(x[i]**3))

plt.plot(x,y)


import matplotlib.pyplot as plt
import numpy as np

x_0 = 0
y_0 = 0
deltax = .01

xstart = x_0
xslutt = 10

antall_punkter = int((xslutt - xstart)/deltax) + 1
x = np.zeros(antall_punkter)
x[0] = x_0

y = np.zeros(antall_punkter)
y[0] = y_0

for i in range(len(x)-1):
    x[i+1] = x[i] + deltax
    y[i+1] = y[i] + deltax * (2*y[i] + 4*np.exp(2*x[i]))

plt.plot(x,y)