Hopp til innhold

Oppgave

Programmering av nullpunkt med halveringsmetoden

Vi lager et program som kan finne et nullpunkt til en funksjon ved hjelp av halveringsmetoden.

LK20

Innledning

Grafen til tredjegradsfunksjonen f av x er lik en tredjedels x i tredje pluss en halv x i andre minus x minus 1 tegnet i et koordinatsystem og med markering av toppunktet, bunnpunktet, nullpunktene og skjæringspunktet med andreaksen. Skjermutklipp.

Du bør ha vært gjennom siden "Nullpunkt med manuell bruk av halveringsmetoden" før du går videre (se lenke nederst på denne siden). På den siden går vi gjennom hvordan vi kan "halvere" oss fram til en god tilnærmingsverdi for nullpunktet ved  x=1,6  til funksjonen

fx=13x3+12x2-x-1

Se figuren.

På siden nevnt ovenfor fant vi ut at vi kunne sjekke om den x-verdien vi gjettet på var større eller mindre enn nullpunktet ved å se om grafen til funksjonen lå over eller under x-aksen for denne x-verdien. Dersom grafen lå over x-aksen, var x-verdien større enn nullpunktet og motsatt. Dette var fordi at grafen var stigende rundt dette nullpunktet.

Dersom vi skal finne et nullpunkt der grafen er synkende i stedet for stigende, blir dette snudd på hodet. Slik er det for eksempel for det nullpunktet som ligger ved  x=-0,8.

Diskuter

Hvordan kan vi finne en test til å avgjøre om den x-verdien vi gjetter på er større eller mindre enn nullpunktet uavhengig av om funksjonen er stigende eller synkende i området rundt nullpunktet?

Tips 1

På siden "Nullpunkt med manuell bruk av halveringsmetoden" starter vi med [1.5, 2] som intervall for nullpunktet. Så gjetter vi på gjennomsnittsverdien 1,75. I stedet for å se om grafen er over eller under x-aksen for denne verdien, kan vi se om grafen ligger på den samme siden av x-aksen for denne verdien som for ett av endepunktene for intervallet, for eksempel det venstre, som er 1,5.

Tips 2

Prøv å forklare hvordan du kan bruke fortegnet til produktet f(1,5)·f(1,75) til å finne ut om 1,75 er større eller mindre enn nullpunktet – uten å vite om funksjonen er stigende eller synkende rundt nullpunktet.

Løsning

Prøv å overbevise deg selv om at produktet av f(1,5)·f(1,75) er større enn null dersom 1,75 er mindre enn nullpunktet og mindre enn null dersom 1,75 er større enn nullpunktet.

Forsøk på forklaring:

  • Det nedre endepunktet 1.5 for intervallet er alltid mindre enn det virkelige nullpunktet.
  • Dersom 1,75 er mindre enn nullpunktet, ligger 1,75 på den samme siden av nullpunktet som 1.5. Da vil grafen til funksjonen for disse to verdiene ligge på den samme siden av x-aksen. Enten ligger grafen over x-aksen for begge disse verdiene eller under for begge.
  • Funksjonsverdiene f(1,5) og f(1,75) vil derfor ha det samme fortegnet. Multipliserer vi disse to funksjonsverdiene, vil produktet alltid bli positivt, men bare dersom de to verdiene 1,5 og 1,75 ligger på den samme siden av nullpunktet.
  • Dersom 1,75 er større enn det verkelege nullpunktet (slik det er i tilfellet vårt), vil produktet av disse to funksjonsverdiene alltid bli negativt siden den ene vil være negativ og den andre positiv fordi de ligger på hver sin side av nullpunktet.

Nedenfor har vi sjekket dette med CAS i GeoGebra:

fx:=13x3+12x2-x-11 fx:=13x3+12x2-x-1  f1.5·f1.752 -0.14

Algoritme for programmet "Nullpunkt 1.0"

Nå må vi prøve å lage en algoritme for et program som finner en god tilnærmingsverdi for nullpunktene til funksjonen vår for oss. Vi kaller programmet "Nullpunkt 1.0".

Først noen avklaringer. Følgende gjelder for versjon 1.0:

  • Vi ser bare på funksjonen  fx=13x3+12x2-x-1.
  • Vi bestemmer oss for at programmet alltid skal kjøre 6 halveringer. (Av og til er dette ikke nok.)
  • Programmet skal ta imot fra brukeren nedre og øvre grense for et intervall der vi er sikre på at nullpunktet finnes.
  • Det må bare være ett nullpunkt i dette intervallet. (Hva er grunnen til det?)

Oppgave: algoritme

Skriv en algoritme for "Nullpunkt 1.0". Det lønner seg å lage funksjonen f(x) som en egendefinert funksjon (her kalt f).

Løsningsforslag

Algoritme til den egendefinerte funksjonen f:

  • Ta imot en x-verdi.
  • Regn ut følgende:  13x3+12x2-x-1
  • Returner svaret.

Algoritme til programmet

  • Skriv til skjermen "Dette programmet finner en tilnærmet verdi for et nullpunkt som ligger i et bestemt intervall.".
  • Skriv til skjermen "Skriv inn nedre grense i dette intervallet:".
  • Ta imot verdien fra brukeren, og lagre den i variabelen under.
  • Skriv til skjermen "Skriv inn øvre grense i dette intervallet:".
  • Ta imot verdien fra brukeren, og lagre den i variabelen over.
  • Gjør 6 ganger:
    • Regn ut midtpunktet av intervallet, og sett resultatet lik variabelen x_verdi.
    • Dersom produktet av funder og f(x_verdi)er mindre enn null, sett x_verdi som ny øvre grense for intervallet.
    • Dersom dette ikke er oppfylt, sett x_verdi som ny nedre grense av intervallet.
  • Skriv til skjermen "Nullpunktet er x = <x_verdi>.".

Oppgave: koding

Skriv koden til programmet. Test programmet, og se om du kan finne alle de tre nullpunktene til funksjonen.

Tips dersom svaret programmet gir, er feil

Dersom programmet gir feil svar, kan det lønne seg å legge inn i koden en utskrift av variabelen x_verdi for hver gang det skal halveres.

Løsningsforslag

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Definerer funksjonen f
def f(x):
    return 1/3*x**3+1/2*x**2-x-1
# Selve hovedprogrammet
print("Dette programmet finner en tilnærmet verdi "
"for et nullpunkt som ligger i et bestemt intervall.")
under = float(input("Skriv inn nedre grense i dette intervallet: "))
over = float(input("Skriv inn øvre grense i dette intervallet: "))

for i in range(1,7):
    x_verdi = (under + over)/2
    print(x_verdi)
    if f(under)*f(x_verdi) < 0:
        over = x_verdi
    else:
        under = x_verdi

print("Nullpunktet er x =", x_verdi)

Oppgave: vurdering

Finn nullpunktene til funksjonen med GeoGebra. Gå til innstillinger i programmet, og velg 4 desimaler. Vurder om svarene programmet ditt gir, er nøyaktige nok. Er nok å kjøre 6 halveringer?

Vurdering

Med 4 desimaler gir GeoGebra svaret 1,5855 for nullpunktet lengst til høyre, mens programmet over gir 1,5859. Begge gir med dette svaret 1,586 om vi runder av til tre desimaler. Det er nøyaktig nok – for dette nullpunktet. Det er ikke sikkert det er nok for alle nullpunkter i alle funksjoner.

Oppgave: koding

Test programmet på andre funksjoner, og se om det fungerer. Dersom du har lagd den matematiske funksjonen i programmet som en egendefinert funksjon, er det bare denne du trenger å endre. Husk å sjekke at programmet gir rett svar ved for eksempel å tegne funksjonen i GeoGebra og/eller bruke CAS.

Oppgave

Hvordan kan vi bruke programmet til å løse vanlige ligninger?

Tips

Programmet vårt løser allerede en likning, nemlig likningen

f(x)=013x3+12x2-x-1=0

Forklaring

Dersom vi i en likning flytter alt over på venstre side, står det "= 0" på høyre side. Da kan vi se på det som står på venstre side som funksjonen vår f(x) som vi skal finne nullpunktene til.

Test om programmet kan løse en "vanlig" likning som du kan finne på en av sidene om likninger.

Nullpunkt 2.0

Det er tre ting vi kan prøve å lage bedre i programmet vårt.

  • Brukeren må kunne skrive inn en valgfri funksjon. Her bør vi avgrense oss til polynomfunksjoner av maksimalt tredje grad.
  • Programmet må kjøre så mange halveringer som er nødvendig.
  • Det hadde vært supert om programmet kunne tegne funksjonen i det intervallet som brukeren oppgir og markere nullpunktet på grafen.

Oppgave: algoritme

Skriv en ny algoritme der du prøver å trekke inn disse tre punktene.

Tips

For å bestemme når det er gjort nok halveringer, kan du stoppe når forskjellen mellom nedre og øvre grense for intervallet blir mindre enn for eksempel 0,0001.

Oppgave: koding

Skriv ny kode, og test programmet.

Sist oppdatert 25.05.2020
Skrevet av Bjarne Skurdal

Læringsressurser

Samling av programmeringsoppgaver