Programmeringskurs: 4.1 Halveringsmetoden
Gjette seg frem til nullpunkt
Å finne nullpunkter til en funksjon er en viktig del av matematikken. Nå skal vi lære å finne nullpunkter ved å bruke kode. Vi tar utgangspunkt i funksjonen:
#f(x)=1,4x-4,9#
Du har sikkert lært å finne nullpunktet ved å løse likningen #f(x)=0#. Det gjør vi slik:
Finn nullpunktet til funksjonen #f(x)=1,4x-4,9#
LØSNING:
#f(x)=0#
#1,4x-4,9=0#
#x=\frac{4,9}{1,4}#
#\dunderline{x=3,5}#
Funksjonen #f# har altså nullpunktet #x=3,5#.
For hvert steg i eksemplet manipulerte vi likningen slik at vi for hvert steg kom nærmere svaret. Vi gikk analytisk til verks og vurderte hva som var riktig metode for å finne verdien til #x#. Å lage programmer som gjøre slike analytiske vurderinger er ikke lett. Men systemer slik som CAS (Computer Algebra System) kan gjøre slikt.
Vi skal heller fokusere på den egenskapen som datamaskiner er best på – den kan gjøre veldig mange utregninger på kort tid.
Når vi skal finne nullpunkter numerisk kan vi forenklet si at vi lar datamaskinen velge en #x#-verdi og regne ut hva funksjonsverdien blir. Hvis dette svaret ikke er nært nok null, lar vi datamaskinen velge en ny verdi for #x#. Slik fortsetter vi helt til vi finner en #x#-verdi som er god nok.
Dersom vi lar datamaskinen velge #x#-verdier helt tilfeldig, blir ikke programmet vårt veldig effektivt for å finne nullpunkter. Derfor bør vi helst sørge for at #x-#verdiene blir nærmere og nærmere nullpunktet. Det er slike metoder vi vil fokusere mest på i dette kapittelet.
Men først ser vi på en metode for å lete etter nullpunkter ved å regne ut mange verdier uten særlig systematisk tilnærming.
Denne oppgaven ble brukt som eksempeloppgave for eksamen i matematikk 1T.
Monica har laget programmet nedenfor. Hun har lagt inn kommentarer som viser hva programmet vil gjøre i linje 1, i linje 3, i linje 6 og i linje 8.
<> | Kodeeditor | |
1 | from numpy import linspace #\text{#}# Henter linspace fra numpy | |
2 | ||
3 | def f(x): #\text{#}# Definerer funksjonen f(x) = x#^2#-2 | |
4 | #\quad# return x**2 - 2 | |
5 | ||
6 | X = linspace(-2, 2, 400) #\text{#}# Liste med 400 x-verdier fordelt i intervallet [-2, 2] | |
7 | ||
8 | Y = f(X) #\text{#}# Lager liste med de 400 tilhørende y-verdiene | |
9 | ||
10 | for i in range(0,399): | |
11 | #\quad# if Y[i] * Y[i + 1] <= 0: | |
12 | #\quad \quad# print("Jeg har funnet et nullpunkt") |
a) Forklar hva resultatet blir når Monica kjører programmet.
Begrunn hvorfor resultatet vil bli slik.
b) Utvid programmet slik at det skriver ut tilnærmede verdier for eventuelle nullpunkter.
LØSNING:
a) Programmet til Monica bruker lister over x-verdier og y-verdier til funksjonen
#f(x)=x^2-2#
I hver liste (#\texttt{X}# og #\texttt{Y}#) er det 400 verdier. Det svarer med andre ord til en (svært stor) verditabell med #y#-verdier for #x#-verdier fra og med -2 til og med 2. Begynnelsen på verditabellen ville sett slik ut:
#x# | #-2# | #-1.98997494# | #-1.97994987# | ... |
#y# | #2# | #1.96000025# | #1.92020151# | ... |
Med #\texttt{for}#-løkka går hun gjennom alle #y#-punktene i lista og sjekker med #\texttt{if}#-setningen om produktet av to #y#-verdier etter hverandre i verditabellen er negativ eller lik null. Når dette er tilfellet skriver programmet ut #\texttt{Jeg har funnet et nullpunkt}#. Dette vil skje to ganger ettersom #f# har to nullpunkter i intervallet #[-2, 2]#.
Dette blir riktig fordi #y#-verdien til funksjonen har positivt fortegn på den ene siden av nullpunktet, og negativt på den andre siden. Dermed blir produktet av de to #y#-verdiene negativt.
Ved å forenkle litt ser vi dette tydeligere. Nedenfor er verditabellen for #f# når #x# er i intervallet #[-2, 2]#. Men her har vi bare tatt med 5 (og ikke 400) verdier.
#x# | #-2# | #-1# | #0# | #1# | #2# |
#y# | #2# | #-1# | #-2# | #-1# | #2# |
Vi ser at #y#-veriden skifter fortegn når #x# går fra #-2# til #-1#. Fra dette kan vi konkludere med at funksjonen #f# har ett nullpunkt mellom #x=-2# og #x=-1#.
Dessuten ser vi at #y#-verdien skifter fortegn når #x#-verdien går fra #1# til #2#. Med andre ord har #f# også et nullpunkt mellom #x=1# og #x=2#.
b) Vi kan utvide programmet slik. Som tilnærmet verdi for nullpunktet bruker vi gjennomsnittsverdien til de to #x#-verdiene som vi finner nullpunktet mellom. Det er det samme som verdien midt mellom disse punktene. Vi skriver ut denne verdien sammen med setning #\texttt{Jeg har funnet et nullpunkt}# i #\texttt{for}#-løkka. Koden blir da slik: