Halveringsmetoden

<div class="alert alert-block alert-danger">

Info til lærer

Dette er et opplegg der elevene skal lære halveringsmetoden. Opplegget er rimelig detaljert, men flere deler av det kan gjenomføres på andre måter som klasseromsdiskusjon, visning, gruppediskusjoner, osv. Grunnen til at det er detaljert er at det gir forslag til gjennomføring. Før opplegget gjennomføres er det fint hvis elevene kan litt om plotting av funksjoner, og har vært gjennom hvordan man finner nullpunkt til ulike funksjoner (se oppgave XX). Del gjerne elevene inn i grupper på 3-4.

<div class="alert alert-block alert-warning">

Kompetansemål i R1

Mål for opplæringen er at eleven skal kunne

  • forstå begrepene vekstfart, grenseverdi, derivasjon og kontinuitet, og bruke disse for å løse praktiske problemer
  • utforske, analysere og derivere ulike funksjoner og deres omvendte funksjoner, og gjøre rede for egenskaper til og sammenhenger mellom slike funksjoner
</div>

Nullpunkter

For å finne nullpunktet til en funksjon har vi hittil lært en del metoder for dette. Ulempen er at metoden ikke alltid den samme.

<div class="alert alert-block alert-info">

Oppgave 1

Diskuter med gruppen hvordan man finner nullpunktet til de ulike funksjonstypene under

<br>

a) Andregradsfunksjoner, for eksempel:

f(x)=2x2+3x2 f(x) = 2x^2 + 3x - 2
<br> b) Tredjegradsfunksjoner, for eksempel:
g(x)=x3+3x4 g(x) = x^3 + 3x - 4
<br> c) Rasjonale funksjoner, for eksempel:
h(x)=2x+33x h(x) = \frac{2x+3}{3-x}
<br> d) Eksponentialfunksjoner, for eksempel:
i(x)=e2x+11 i(x) = e^{2x+1}-1

Det er finnes flere funksjonstyper med tilhørende metoder for å finne nullpunktene, men metodene vi bruker varierer fra funksjonstype til funksjonstype. Vi skal her undersøke om vi kan finne én metode som kan benyttes på mange funksjoner som mulig, inkludert alle i oppgave 1. For å klare det må vi først undersøke hvilke egenskaper et nullpunkt har, se oppgave 2.

<div class="alert alert-block alert-info">

Oppgave 2

a) Diskuter med gruppen hvilke egenskaper alle nullpunkt har, og om det er noen egenskaper som kun noen nullpunkter har.

<br>

b) Tenk dere en maskin som for enhver xx-verdi du skriver inn vil gi deg en funksjonsverdi (yy-verdi) til en ukjent funksjon tilbake. Hvordan kan du systematisk bruke denne maskinen til å finne nullpunktet til den ukjente funksjonen? Diskuter med gruppen. Klarer dere å lage en strategi? <br>

Merk: Dere kan bruke figuren under som hjelp til å lage en strategi. Hvordan kan dere finne nullpunktet til denne funksjonen ved hjelp av maskinen?

Halveringsmetode_graf01.png

<div class="alert alert-block alert-danger">

Info til lærer

Her har læreren kopiert opp en del grafen på et ark der nullpunktet er markert med en rimelig høy nøyaktighet (3-4 desimaler). Se XXX for eksempel på grafer.

<div class="alert alert-block alert-info">

Oppgave 3

I hver gruppe bestemmer dere en som skal være maskinen fra oppgave 2. Maskineleven går opp og henter en bunke med grafer fra læreren som ikke skal vises til noen av de andre i gruppen, og velger en av grafene. Så skal resten av gruppen forsøke å finne nullpunktet slik:

  1. Gruppen gir maskineleven en xx-verdi.
  2. Maskineleven gir tilbake den tilhørende funksjonsverdien.

Gjenta dette til dere finner nullpunktet. <br><br>

Diskuter underveis: Kan dere finne en effektiv metode for å finne nullpunktet?

Halveringsmetoden

Hittil har vi sett på funksjoner som vi kunne funnet nullpunktet til ved kjente metoder, men det finnes også funksjoner der dette er vanskeligere.

<div class="alert alert-block alert-info">

Oppgave 4

Fra eksamensettet i R1 høsten 2017 ble følgende funksjon gitt:

f(x)=2ln(x4+4)12x f(x) = 2\ln{(x^4+4)}-\frac{1}{2}x

Prøv å finne nullpunktene til ff uten å bruke digitale verktøy. Hvor nærme klarer dere å komme?

Oppgaven over er vanskelig å løse fordi det ikke finnes en bestemt metode for å finne nullpunktet. Metoden GeoGebra eller andre digitale verktøy bruker for å løse denne typen funksjoner kalles en numerisk fremgangsmåte. Fremgangsmåten baserer seg på systematisk gjetting og innebærer at vi gir en startbetingelse for gjettene og deretter jobber programmet vårt inntil svaret er funnet eller har blitt nøyaktig nok. Vi skal her vise denne fremgangsmåten i flere steg.

Tegne grafen

For at det skal bli enklere å se hva som skjer starter vi med å tegne grafen fra oppgave 4 i et koordinatsystem. Husk at koden for den naturlige logaritmen i python er log().

<div class="alert alert-block alert-info">

Oppgave 5

Lag en kode som skriver ut figuren under. En start er gitt i kodecellen under.

<br>

Eksempel på løsning er gitt under figuren, men prøv selv først.

1 
2
3
4
5
6
7
# Løs oppgave 5 her

import numpy as np                       # Bibliotek for en del numeriske og matematiske funksjoner
import matplotlib.pyplot as plt          # Bibliotek for plotting av graf

x = np.linspace(-5, 80, 1000)            # Verdier for x

Halveringsmetode_graf02.png

[2]: 
1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Eksempelkode for løsning av oppgave 5

import numpy as np                       # Bibliotek for en del numeriske og matematiske funksjoner
import matplotlib.pyplot as plt          # Bibliotek for plotting av graf

x = np.linspace(-5, 80, 1000)            # Verdier for x

def f(x):                                # Funksjon som regner ut y-verdiene
    y = 2*np.log(x**4 + 4) - 0.5*x
    return y

y = f(x)                                 # Kaller på funksjonen over

plt.plot(x, y, 'g')                      # Plotter x og y
plt.grid()                               # Tegner rutenett
plt.ylim(-5, 15)                         # Intervallet langs y-aksen
plt.xlabel('x')                          # Navn x-akse
plt.ylabel('f(x)')                       # Navn y-akse
plt.axhline(y=0, color='k')              # Tegner x-akse
plt.axvline(x=0, color='k')              # Tegner y-akse
plt.show()                               # Viser grafen

Starte leting etter nullpunkt

Vi må først la programmet vite hvor det skal begynne å lete. Vi starter derfor med å spørre brukeren om hvor vi skal lete. Bruker her input()-kommandoen. Siden intervallet alltid er et tall legger vi på kommandoen float() slik at programmet skjønner at det er et tall vi oppgir.

<div class="alert alert-block alert-info">

Oppgave 6

a) Hva trenger programmet å vite om hvor vi skal lete? Bruk figuren over til å diskutere med gruppen om hvilket område det er fornuftig å lete etter nullpunktet i.

<br>

b) Lag en kodebit som ber brukeren om å skrive inn dette området og som blir lagret i passende navngitte variabler. Bruk kodevinduet under.

1 
2
# Svar på oppgave 6b her

<div class="alert alert-block alert-danger">

Info til lærer

Her kan man med fordel ta en diskusjon enten helklasse eller i grupper om hvorfor vi trenger en xx-verdi på hver side av nullpunktet og hvorfor vi trenger de tilhørende funksjonsverdiene. Dette også for å sikre at alle er med på tanken bak halveringsmetoden. Diskusjonsdelen av oppgave 6 og/eller 7 kan da endres eller fjernes.

Vi trenger også å finne ut funksjonsverdien til de to xx-verdiene som ble skrevet inn i forrige oppgave.

<div class="alert alert-block alert-info">

Oppgave 7

a) Hvorfor trenger vi også funksjonsverdiene? Hva er det de forteller oss om hvor nullpunktet befinner seg?

<br>

b) Lag en kodebit som finner funksjonsverdiene til de xx-verdiene som brukeren skrev inn i oppgave 6b. Bruk kodevinduet under.

[4]: 
1 
2
3
4
5
6
7
# Et forslag til løsning på oppgave 6b

xv = float(input("x-verdi til venstre for nullpunkt: "))
xh = float(input("x-verdi til høyre for nullpunkt: "))

# Svar på oppgave 7b her

x-verdi til venstre for nullpunkt: 60
x-verdi til høyre for nullpunkt: 80

Kan nå sjekke om programmet fungerer ved å teste for x=60x=60 og x=80x=80. Skal da få svaret:

Venstre side: f(60)=2.754757115060663f(60) = 2.754757115060663

Høyre side: f(80)=4.943786727296455f(80) = -4.943786727296455

For å pynte litt på dette kan vi legge til kommandoen round() slik at vi får ønsket antall desimaler i svaret. Se løsningforslag under der hele koden vi har laget hittil er limt inn.

[11]: 
1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import numpy as np                       # Bibliotek for en del numeriske og matematiske funksjoner
import matplotlib.pyplot as plt          # Bibliotek for plotting av graf

x = np.linspace(-5, 80, 1000)            # Verdier for x

def f(x):                                # Funksjon som regner ut y-verdiene
    y = 2*np.log(x**4 + 4) - 0.5*x
    return y

y = f(x)                                 # Kaller på funksjonen over

plt.plot(x, y, 'g')                      # Plotter x og y
plt.grid()                               # Tegner rutenett
plt.ylim(-5, 15)                         # Intervallet langs y-aksen
plt.xlabel('x')                          # Navn x-akse
plt.ylabel('f(x)')                       # Navn y-akse
plt.axhline(y=0, color='k')              # Tegner x-akse
plt.axvline(x=0, color='k')              # Tegner y-akse
plt.show()                               # Viser grafen

xv = float(input("x-verdi til venstre for nullpunkt: "))
xh = float(input("x-verdi til høyre for nullpunkt: "))

yv = f(xv)                               # Funksjonsverdien, venstre side
yh = f(xh)                               # Funksjonsverdien, høyre side

print()
print("Venstre side: f(", xv, ") =", round(yv, 3))     # Runder av svaret til 3 desimaler
print("Høyre side: f(", xh, ") =", round(yh, 3))
<div class="alert alert-block alert-info">

Oppgave 8

Prøv programmet for funksjonene under (eller andre du vil prøve selv), og sjekk at fortegnet på funksjonsuttrykket er ulikt på hver side av nullpunktet
<br>

a) f(x)=515xf(x) = 5 - \frac{1}{5}x

<br>

b) g(x)=0,1x24x+20g(x) = 0{,}1x^2 - 4x + 20

<br>

c) h(x)=e0,1x4h(x) = e^{0{,}1 x} - 4 <br> Merk at kommandoen for ee er np.exp()

<div class="alert alert-block alert-success">

Kodetips

En god metode for å teste/endre et program uten å slette det man allerede har skrevet er å sette en # foran. Da vil ikke programmet lese den delen av koden. Når man vil tilbake kan man bare ta vekk # igjen. Man kan også markere teksten man vil skal kommenteres og trykke Ctrl + * (Dette er kun med norsk tastatur i Jupyter Notebook, andre editorer/tastaturer har andre hurtigkommandoer)

Finne midtpunktet (halveringslinjen)

Etter å ha sjekket at f(xv)f(\text{xv}) og f(xh)f(\text{xh}) faktisk har forskjellig fortegn, sjekker vi funksjonsverdien til xx-verdien i midten av intervallet, f(xm)f(\text{xm}).

<div class="alert alert-block alert-info">

Oppgave 9

a) Hvorfor sjekker vi midtpunktet? Hva er det vi trenger vi å vite om midtpunktet? Diskuter med gruppen.

<br>

b) Hvordan finner vi midtpunktet? Diskuter med gruppen og utvid programmet med en kodebit som finner midtpunktet (både xx- og yy-verdien). Bruk kodevinduet under. Et løsningsforslag er gitt lengere ned.

1 
2
# Svar på oppgave 9b her.

Hvis du bruker x=60x=60 og x=80x=80 på funksjonen vi har brukt å langt blir svaret (70,1,012)(70, 1{,}012).

[15]: 
1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# Eksempel på kode så langt med løsningsforslag på oppgave 9b nederst

import numpy as np                       # Bibliotek for en del numeriske og matematiske funksjoner
import matplotlib.pyplot as plt          # Bibliotek for plotting av graf

x = np.linspace(-5, 80, 1000)            # Verdier for x

def f(x):                                # Funksjon som regner ut y-verdiene
    y = 2*np.log(x**4 + 4) - 0.5*x
    return y

y = f(x)                                 # Kaller på funksjonen over

plt.plot(x, y, 'g')                      # Plotter x og y
plt.grid()                               # Tegner rutenett
plt.ylim(-5, 15)                         # Intervallet langs y-aksen
plt.xlabel('x')                          # Navn x-akse
plt.ylabel('f(x)')                       # Navn y-akse
plt.axhline(y=0, color='k')              # Tegner x-akse
plt.axvline(x=0, color='k')              # Tegner y-akse
plt.show()                               # Viser grafen

xv = float(input("x-verdi til venstre for nullpunkt: "))
xh = float(input("x-verdi til høyre for nullpunkt: "))

yv = f(xv)                               # Funksjonsverdien, venstre side
yh = f(xh)                               # Funksjonsverdien, høyre side

print()
print("Venstre side: f(", xv, ") =", round(yv, 3))    # Runder av svaret til 3 desimaler
print("Høyre side: f(", xh, ") =", round(yh, 3))

xm = (xv + xh) / 2                                    # Regner ut x-verdien til midtpunktet
ym = f(xm)                                            # Regner ut den tilhørende funksjonsverdien

print("Midt imellom: f(", xm, ") =", round(ym, 3))    # Runder av svaret til 3 desimaler
x-verdi til venstre for nullpunkt: 60
x-verdi til høyre for nullpunkt: 80

Venstre side: f( 60.0 ) = 2.755
Høyre side: f( 80.0 ) = -4.944
Midt imellom: f( 70.0 ) = -1.012
<div class="alert alert-block alert-info">

Oppgave 10

Vi må nå tolke funksjonsverdien. Her er to påstander, der xm og ym er xx- og yy-verdiene i midtpunktet:

  • Hvis ym er negativ, vet vi at nullpunktet befinner seg mellom xv og xm.
  • Hvis ym er positiv, vet vi at nullpunktet befinner seg mellom xm og xh.

Diskuter med gruppen om disse påstandene er korrekte og begrunn hvorfor.

Sjekke fortegn med en if-setning

Vi har sjekket fortegnet til yv, ym, og yh, og vi må nå avklare om nullpunktet ligger i intervallet [xv,xm][\text{xv}, \text{xm}] eller [xm,xh][\text{xm}, \text{xh}]. Figuren under viser linjene x=60x=60, x=80x=80, og linjen midt imellom (markert med rødt) x=70x=70. Vi ser at fortegnet til f(80)f(80) er likt fortegnet til f(70)f(70), og dermed vet vi at nullpunktet ligger i intervallet [60,70][60, 70].

Halveringsmetode_graf03.png

<div class="alert alert-block alert-info">

Oppgave 11

Bruk figuren over til å diskutere med gruppen:

  • Hvis yv og ym har samme fortegn, vil nullpunktet ligge i intervallet [xm,xh][\text{xm}, \text{xh}]
  • Hvis yv og ym har ulikt fortegn, vil nullpunktet ligge i intervallet [xv,xm][\text{xv}, \text{xm}]

Vi ser at dette er en «hvis – så» prosedyre, så vi må oversette punktene over til en if-setning.

<div class="alert alert-block alert-info">

Oppgave 12

Hva er en rask måte å sjekke om to tall (her yv og yh) har samme eller motsatt fortegn ved hjelp av en if-setning? Diskuter med gruppen. Hvis dere har en ide kan dere prøve å lage en kodebit for å gjøre dette i vinduet under.

1 
2
3
4
5
6
7
8
9
10
11
# Løs oppgave 12 her

yv = 
yh = 

if <betingelse>:
    print("Noe her")
elif <betingelse>:
    print("Noe her")
else:
    print("Noe her")
<div class="alert alert-block alert-danger">

Info til lærer

Oppgave 12 kan tas felles i klassen. Dette er en fin diskusjon som alle har forutsetninger for å klare. En mulig start er å si at vi kunne selvsagt lagt en if-setning der vi sjekker alle mulighetene slik:

    a = 5
    b = -3
    if a > 0 and b > 0:
        print("De har samme fortegn")
    elif a > 0 and b < 0:
        print("De har motsatt fortegn")
    elif a < 0 and b > 0:
        print("De har motsatt fortegn")
    elif a < 0 and b < 0:     
        print("De har samme fortegn")    

Eller slik:

    a = 5
    b = -3
    if a > 0:
        if b > 0:
            print("De har samme fortegn")
        elif b < 0:
            print("De har motsatt fortegn")
    elif a < 0:
        if b > 0:
            print("De har motsatt fortegn")
        elif b < 0:     
            print("De har samme fortegn")    

Her vil de fleste være enig om at dette er mye å sjekke. Utfordringen vil da være om vi kan gjøre dette raskere ved å bruke enkel matematikk. Tidligere erfaring viser at elever ofte tenker altfor komplisert her, og da er det fint å kunne si at vi kan kun bruke en enkel matematisk operasjon for å finne ut av dette.

[1]: 
1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# Eksempel på kode så langt med løsningsforslag på oppgave 12 nederst

import numpy as np                       # Bibliotek for en del numeriske og matematiske funksjoner
import matplotlib.pyplot as plt          # Bibliotek for plotting av graf

x = np.linspace(-5, 80, 1000)            # Verdier for x

def f(x):                                # Funksjon som regner ut y-verdiene
    y = 2*np.log(x**4 + 4) - 0.5*x
    return y

y = f(x)                                 # Kaller på funksjonen over

plt.plot(x, y, 'g')                      # Plotter x og y
plt.grid()                               # Tegner rutenett
plt.ylim(-5, 15)                         # Intervallet langs y-aksen
plt.xlabel('x')                          # Navn x-akse
plt.ylabel('f(x)')                       # Navn y-akse
plt.axhline(y=0, color='k')              # Tegner x-akse
plt.axvline(x=0, color='k')              # Tegner y-akse
plt.show()                               # Viser grafen

xv = float(input("x-verdi til venstre for nullpunkt: "))
xh = float(input("x-verdi til høyre for nullpunkt: "))

yv = f(xv)                               # Funksjonsverdien, venstre side
yh = f(xh)                               # Funksjonsverdien, høyre side

print()
print("Venstre side: f(", xv, ") =", round(yv, 3))    # Runder av svaret til 3 desimaler
print("Høyre side: f(", xh, ") =", round(yh, 3))

xm = (xv + xh) / 2                                    # Regner ut x-verdien til midtpunktet
ym = f(xm)                                            # Regner ut den tilhørende funksjonsverdien

print("Midt imellom: f(", xm, ") =", round(ym, 3))    # Runder av svaret til 3 desimaler

if yv*ym < 0:
    print("Nullpunktet ligger mellom", xv, "og", xm)
elif yv*ym > 0:
    print("Nullpunktet ligger mellom", xm, "og", xh)
else:
    print("Nullpunktet er ved x =", xm)
<Figure size 640x480 with 1 Axes>
x-verdi til venstre for nullpunkt: 60
x-verdi til høyre for nullpunkt: 80

Venstre side: f( 60.0 ) = 2.755
Høyre side: f( 80.0 ) = -4.944
Midt imellom: f( 70.0 ) = -1.012
Nullpunktet ligger mellom 60.0 og 70.0
<div class="alert alert-block alert-info">

Oppgave 13

Diskuter med gruppen hvorfor vi kan vite nullpunktet hvis yvym=0\text{yv}\cdot \text{ym}=0?

Beskrivelse av halveringsmetoden

Skal her vise metoden på flere måter. Bruker eksemplet vi har kjørt i koden vår og beskriver fremgangsmåten.

<img style="float: right;" src="Halveringsmetode_graf07.png">

På figuren har vi valgt x-verdiene 60 og 80. Deretter har vi funnet verdien midt imellom, her 70. Vi sjekker mellom hvilke verdier nullpunktet ligger, og finner at det ligger mellom punktet til venstre og midtpunktet.

<br><br><br><br><br><br><br><br>

<img style="float: right;" src="Halveringsmetode_graf04.png">

På neste figur tegner vi inn de nye avgrensende intervallet med to linjer (sort) og det nye midtpunktet (rødt). Vi sjekker igjen mellom hvilke verdier nullpunktet ligger, og finner at det ligger til høyre for midtpunktet.

<br><br><br><br><br><br><br><br>

<img style="float: right;" src="Halveringsmetode_graf05.png">

Vi setter det nye intervallet vårt til linjene til høyre, og gjør prosessen om igjen.

<br><br><br><br><br><br><br><br>

<img style="float: right;" src="Halveringsmetode_graf06.png">

Hvis vi fortsetter med dette vil vi komme til et punkt som er veldig nærme nullpunktet. Vi kan selv bestemme nøyaktigheten, men vi kan begrense nøyaktigheten til innenfor 2 desimaler for eksempel. Kan øke denne senere hvis man ønsker.

<div class="alert alert-block alert-success">

Stegene over kan summeres opp som:

  • Finne midtpunkt i intervallet
  • Sjekke funksjonsverdien for midtpunktet
  • Kjøre if-setningen for å sjekke i hvilket av de to intervallene nullpunktet befinner seg
  • Sette et nytt intervall
  • Sjekke om vi er nærme nok ellers starte på nytt

Metoden kan vi kjøre om igjen helt til vi er fornøyd med svaret vårt.

Vi kan kalle nøyaktigheten på nullpunktet for ϵ\epsilon (epsilon). Vi kan også beskrive programmet vi straks skal fullføre med et flytskjema.

<img src="Halveringsmetode_flow01.png" style="float:" width="600"/>
<div class="alert alert-block alert-info">

Oppgave 14

Diskuter med gruppen alle stegene i flytskjemaet. Er det noe som er uklart? Hvorfor sjekker vi absoluttverdien i tredje siste steg?

<div class="alert alert-block alert-danger">

Info til lærer

Flytskjemaet og oppgaven over kan også med fordel brukes til gjennomgang av koden. Vi har brukt epsilon (ϵ\epsilon) som nøyaktigheten her noe som selvsagt kan endres hvis ønskelig.

Fullføre programmet

I oppgave 12 lagde vi en if-setning som fant ut intervallet vi skulle fortsette å lete i. Vi skal nå gjøre ferdig denne if-setningen og oppdatere intervallet. Ser på første del av if-setningen:

if yv*ym < 0:
    xh = xm         # Setter ny verdi for xh
elif ...
    
<div class="alert alert-block alert-info">

Oppgave 15

Bruk koden ovenfor som utgangspunkt og utvid programmet til å regne ut det nye intervallet. Bruk kodevinduet under.

1 
2
# Lim inn koden dere har så langt her og utvid med oppgave 15. Et forslag til kode er gitt under

1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# Eksempel på kode så langt med løsningsforslag på oppgave 15 nederst
# Merk at her er noe kode tatt vekk fordi vi ikke trenger all koden lenger

import numpy as np                       # Bibliotek for en del numeriske og matematiske funksjoner
import matplotlib.pyplot as plt          # Bibliotek for plotting av graf

x = np.linspace(-5, 80, 1000)            # Verdier for x

def f(x):                                # Funksjon som regner ut y-verdiene
    y = 2*np.log(x**4 + 4) - 0.5*x
    return y

y = f(x)                                 # Kaller på funksjonen over

plt.plot(x, y, 'g')                      # Plotter x og y
plt.grid()                               # Tegner rutenett
plt.ylim(-5, 15)                         # Intervallet langs y-aksen
plt.xlabel('x')                          # Navn x-akse
plt.ylabel('f(x)')                       # Navn y-akse
plt.axhline(y=0, color='k')              # Tegner x-akse
plt.axvline(x=0, color='k')              # Tegner y-akse
plt.show()                               # Viser grafen

xv = float(input("x-verdi til venstre for nullpunkt: "))
xh = float(input("x-verdi til høyre for nullpunkt: "))

yv = f(xv)                               # Funksjonsverdien, venstre side
yh = f(xh)                               # Funksjonsverdien, høyre side

xm = (xv + xh) / 2                       # Regner ut x-verdien til midtpunktet
ym = f(xm)                               # Regner ut den tilhørende funksjonsverdien

if yv*ym < 0:
    xh = xm                              # Setter ny verdi for xh
elif yv*ym > 0:
    xv = xm                              # Setter ny verdi for xv

Siste steg er å la programmet gjøre dette inntil vi har oppnådd ønsket nøyaktighet. Vi kan utvide progrmamet vårt med en while-løkke som kjører inntil vi har fått ønsker nøyaktighet. Vi bruker her variabelen epsilon for nøyaktighet.

<div class="alert alert-block alert-info">

Oppgave 16

Prøv å utvid programmet til å kjøre utregningen av midtpunktet og if-setningene inntil vi har nådd en ønsket nøyaktighet.

<div class="alert alert-block alert-danger">

Info til lærer

while-løkken kan være vanskelig for elevene, så oppgave 16 må vurderes. Det er viktigere at de gjør oppgavene etter for de er mer relatert til matematisk diskusjon.

[17]: 
1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# Løsningsforslag til halveringmetoden
    
import numpy as np                      # Bibliotek for en del numeriske og matematiske funksjoner
import matplotlib.pyplot as plt         # Bibliotek for plotting av graf

x = np.linspace(-5, 80, 1000)           # Verdier for x

def f(x):                               # Funksjon som regner ut y-verdiene
    y = 2*np.log(x**4 + 4) - 0.5*x
    return y

y = f(x)                                # Kaller på funksjonen over

plt.plot(x, y, 'g')                     # Plotter x og y
plt.grid()                              # Tegner rutenett
plt.ylim(-5, 15)                        # Intervallet langs y-aksen
plt.xlabel('x')                         # Navn x-akse
plt.ylabel('f(x)')                      # Navn y-akse
plt.axhline(y=0, color='k')             # Tegner x-akse
plt.axvline(x=0, color='k')             # Tegner y-akse
plt.show()                              # Viser grafen

xv = float(input("x-verdi til venstre for nullpunkt: "))
xh = float(input("x-verdi til høyre for nullpunkt: "))

yv = f(xv)                              # Funksjonsverdien, venstre side
yh = f(xh)                              # Funksjonsverdien, høyre side

epsilon = 0.001                         # Nøyaktigheten til nullpunktet

while abs(xh-xv) > epsilon:
    xm = (xv + xh) / 2                  # Regner ut x-verdien til midtpunktet
    ym = f(xm)                          # Regner ut den tilhørende funksjonsverdien
    yv = f(xv)                          # Ny funksjonsverdi, venstre side
    
    if yv*ym < 0:
        xh = xm                         # Setter ny verdi for xh
    elif yv*ym > 0:
        xv = xm                         # Setter ny verdi for xv

print("Nullpunktet er ved x =", round(xm, 2))
x-verdi til venstre for nullpunkt: 60
x-verdi til høyre for nullpunkt: 80
Nullpunktet er ved x = 67.36
<div class="alert alert-block alert-info">

Oppgave 17

Endre på ulike deler av programmet og se hva som skjer. Legg spesielt merke til hva som skjer når du endrer:

  • til andre funksjoner (linje 9 i løsningsforslaget over)
  • nøyaktigheten epsilon (linje 29 i løsningsforslaget over)

Når fungere dette ikke?

Helt til slutt er det viktig med en kort kommentar angående programmet vi nå har laget. Programmet vil ikke klare å finne nullpunkter der funksjonen har et topp- eller bunnpunkt i nullpunktet. Grunnen til dette er at funksjonsverdien ikke skifter fortegn når funksjonen krysser nullpunktet. Det er likevel metoder for å løse dette, se oppgave 18.

<div class="alert alert-block alert-info">

Oppgave 18

Diskutere med gruppen hvordan vi kan gå frem for å lage en metode som inkluderer å finne nullpunktene beskrevet over?