Programmering av nullpunkt med halveringsmetoden - Elektroniske krinsar og nettverk (EL-ELE vg1) - NDLA

Hopp til innhald
Oppgave

Programmering av nullpunkt med halveringsmetoden

Vi lagar eit program som kan finne eit nullpunkt til ein funksjon ved hjelp av halveringsmetoden.

Innleiing

Du bør ha vore gjennom sida "Nullpunkt med manuell bruk av halveringsmetoden" før du går vidare (sjå lenkje lengst nede på denne sida). På den sida går vi gjennom korleis vi kan "halvere" oss fram til ein god tilnærmingsverdi for nullpunktet ved  x=1,6  til funksjonen

fx=13x3+12x2-x-1

Sjå figuren.

På sida nemnd ovanfor fann vi ut at vi kunne sjekke om den x-verdien vi gjetta på, var større eller mindre enn nullpunktet ved å sjå om grafen til funksjonen låg over eller under x-aksen for denne x-verdien. Dersom grafen låg over x-aksen, var x-verdien større enn nullpunktet, og motsett. Dette kom av at grafen var stigande rundt dette nullpunktet.

Dersom vi skal finne eit nullpunkt der grafen er søkkande i staden for stigande, blir dette snudd på hovudet. Slik er det til dømes for det nullpunktet som ligg ved  x=-0,8.

Diskuter

Korleis kan vi finne ein test til å avgjere om den x-verdien vi gjettar på er større eller mindre enn nullpunktet, uavhengig av om funksjonen er stigande eller søkkande i området rundt nullpunktet?

Tips 1

På sida "Nullpunkt med manuell bruk av halveringsmetoden" startar vi med [1.5, 2] som intervall for nullpunktet. Så gjettar vi på gjennomsnittsverdien 1,75. I staden for å sjå om grafen er over eller under x-aksen for denne verdien, kan vi sjå om grafen ligg på den same sida av x-aksen for denne verdien som for eitt av endepunkta for intervallet, til dømes det venstre, som er 1,5.

Tips 2

Prøv å forklare korleis du kan bruke forteiknet til produktet f(1,5)·f(1,75) til å finne ut om 1,75 er større eller mindre enn nullpunktet – utan å vite om funksjonen er stigande eller søkkande rundt nullpunktet.

Løysing

Prøv å overtyde deg sjølv 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 verkelege nullpunktet.
  • Dersom 1,75 er mindre enn nullpunktet, ligg 1,75 på den same sida av nullpunktet som 1.5. Då vil grafen til funksjonen for desse to verdiane liggje på den same sida av x-aksen. Anten ligg grafen over x-aksen for begge desse verdiane eller under for begge.
  • Funksjonsverdiane f(1,5) og f(1,75) vil derfor ha det same forteiknet. Multipliserer vi desse to funksjonsverdiane, vil produktet alltid bli positivt, men berre dersom dei to verdiane 1,5 og 1,75 ligg på den same sida av nullpunktet.
  • Dersom 1,75 er større enn det verkelege nullpunktet (slik det er i tilfellet vårt), vil produktet av desse to funksjonsverdiane alltid bli negativt sidan den eine vil vere negativ og den andre positiv fordi dei ligg på kvar si side av nullpunktet.

Nedanfor har vi sjekka 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"

No må vi prøve å lage ein algoritme for eit program som finn ein god tilnærmingsverdi for nullpunkta til funksjonen vår for oss. Vi kallar programmet "Nullpunkt 1.0".

Først nokre avklaringar. Følgjande gjeld for versjon 1.0:

  • Vi ser berre på funksjonen  fx=13x3+12x2-x-1.
  • Vi bestemmer oss for at programmet alltid skal køyre 6 halveringar. (Av og til er dette ikkje nok.)
  • Programmet skal ta imot frå brukaren nedre og øvre grense for eit intervall der vi er sikre på at nullpunktet finst.
  • Det må berre vere eitt nullpunkt i dette intervallet. (Kva er grunnen til det?)

Oppgåve: algoritme

Skriv ein algoritme for "Nullpunkt 1.0". Det lønner seg å lage funksjonen f(x) som ein eigendefinert funksjon (her kalla f).

Løysingsforslag

Algoritme til den eigendefinerte funksjonen f:

  • Ta imot ein x-verdi.
  • Rekn ut følgjande:  13x3+12x2-x-1
  • Returner svaret.

Algoritme til programmet

  • Skriv til skjermen "Dette programmet finn ein tilnærma verdi for eit nullpunkt som ligg i eit bestemt intervall.".
  • Skriv til skjermen "Skriv inn nedre grense i dette intervallet:".
  • Ta imot verdien frå brukaren, og lagre han i variabelen under.
  • Skriv til skjermen "Skriv inn øvre grense i dette intervallet:".
  • Ta imot verdien frå brukaren, og lagre han i variabelen over.
  • Gjer 6 gonger:

    • Rekn ut midtpunktet av intervallet, og set resultatet lik variabelen x_verdi.
    • Dersom produktet av funder og f(x_verdi)er mindre enn null, set x_verdi som ny øvre grense for intervallet.
    • Dersom dette ikkje er oppfylt, set x_verdi som ny nedre grense av intervallet.
  • Skriv til skjermen "Nullpunktet er x = <x_verdi>.".

Oppgåve: koding

Skriv koden til programmet. Test programmet, og sjå om du kan finne alle dei tre nullpunkta til funksjonen.

Tips dersom svaret programmet gir, er feil

Dersom programmet gir feil svar, kan det lønne seg å leggje inn i koden ei utskrift av variabelen x_verdi for kvar gong det skal halverast.

Løysingsforslag
Python
1# Definerer funksjonen f
2def f(x):
3    return 1/3*x**3+1/2*x**2-x-1
4# Sjølve hovudprogrammet
5print("Dette programmet finn ein tilnærma verdi "
6"for eit nullpunkt som ligg i eit bestemt intervall.")
7under = float(input("Skriv inn nedre grense i dette intervallet: "))
8over = float(input("Skriv inn øvre grense i dette intervallet: "))
9
10for i in range(1,7):
11    x_verdi = (under + over)/2
12    print(x_verdi)
13    if f(under)*f(x_verdi) < 0:
14        over = x_verdi
15    else:
16        under = x_verdi
17
18print("Nullpunktet er x =", x_verdi)

Oppgåve: vurdering

Finn nullpunkta til funksjonen med GeoGebra. Gå til innstillingar i programmet, og vel 4 desimalar. Vurder om svara programmet ditt gir, er nøyaktige nok. Er nok å køyre 6 halveringar?

Vurdering

Med 4 desimalar gir GeoGebra svaret 1,5855 for nullpunktet lengst til høgre, mens programmet over gir 1,5859. Begge gir med dette svaret 1,586 om vi rundar av til tre desimalar. Det er nøyaktig nok – for dette nullpunktet. Det er ikkje sikkert det er nok for alle nullpunkt i alle funksjonar.

Oppgåve: koding

Test programmet på andre funksjonar, og sjå om det fungerer. Dersom du har laga den matematiske funksjonen i programmet som ein eigendefinert funksjon, er det berre denne du treng å endre. Hugs å sjekke at programmet gir rett svar ved til dømes å teikne funksjonen i GeoGebra og/eller bruke CAS.

Oppgåve

Korleis kan vi bruke programmet til å løyse vanlege likningar?

Tips

Programmet vårt løyser allereie ei likning, nemleg likninga

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

Forklaring

Dersom vi i ei likning flyttar alt over på venstre side, står det "= 0" på høgre side. Då kan vi sjå på det som står på venstre side som funksjonen vår f(x) som vi skal finne nullpunkta til.

Test om programmet kan løyse ei "vanleg" likning som du kan finne på ei av sidene om likningar.

Nullpunkt 2.0

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

  • Brukaren må kunne skrive inn ein valfri funksjon. Her bør vi avgrense oss til polynomfunksjonar av maksimalt tredje grad.
  • Programmet må køyre så mange halveringar som er naudsynt.
  • Det hadde vore supert om programmet kunne teikne funksjonen i det intervallet som brukaren oppgir og markere nullpunktet på grafen.

Oppgåve: algoritme

Skriv ein ny algoritme der du prøver å trekkje inn desse tre punkta.

Tips

For å bestemme når det er gjort nok halveringar, kan du stoppe når skilnaden mellom nedre og øvre grense for intervallet blir mindre enn til dømes 0,0001.

Oppgåve: koding

Skriv ny kode, og test programmet.

Relatert innhald

Skrive av Bjarne Skurdal.
Sist fagleg oppdatert 25.05.2020