Tolk og fiks program som finner bunnpunkt
Funksjonen er gitt ved
Egil ønsker å lage et program som regner ut koordinatene til bunnpunktet på grafen til . Han har skrevet koden nedenfor.
def f(x):
return 2*x**2 - 9*x - 2
def df(x,h):
return (f(x+h) - f(x))/h
h = 0.001
a = 0
while df(a,h) < 0:
a = a + 1
print("Bunnpunktet er", (a, f(a)))
Programmet gir utskriften Bunnpunktet er (3, -11)
Forklar hvilken strategi Egil har brukt.
Svaret han får, er ikke riktig.
Foreslå en endring i koden som vil gi Egil et riktigere svar.
Fasit
Egil sjekker om grafen synker ved å beregne tilnærmet stigningstall. Løkken stopper ved , og programmet printer .
Endre a = a + 1 til a = a + 0.01
Løsningsforslag
Funksjonen df(x, h) beregner et tilnærmet stigningstall (den deriverte) i punktet :
Egils strategi er å starte i og flytte seg til høyre i steg på 1. Så lenge df(a, h) < 0 synker grafen — man har altså ikke nådd bunnpunktet ennå. Når stigningstallet ikke lenger er negativt (grafen har sluttet å synke), betyr det at bunnpunktet er passert, og løkken stopper.
Det ekte bunnpunktet ligger i . Siden øker fra 0 i heltallssteg, er verdiene som testes . Ved er df(2, 0.001) , så løkken fortsetter. Ved er df(3, 0.001) , og betingelsen df(a, h) < 0 er usann — løkken stopper.
Programmet printer derfor , selv om det ekte bunnpunktet er .
Problemet er at steglengden er for stor — programmet «hopper over» bunnpunktet. Ved å bruke et mindre steg vil komme mye nærmere når løkken stopper.
Endre linje 8 fra
a = a + 1
til
a = a + 0.01
Da stopper løkken ved og programmet printer et bunnpunkt som er langt nærmere det ekte svaret .
Sensorveiledning
Kandidaten trenger ikke å forklare hver linje for å få full uttelling. Kandidater som er upresise i forklaringen kan gi 1 poeng.
Forslag til endring i koden uten begrunnelse, kan gi 1 poeng.