Hopp til innhold
Bokmål
Oppgave

Hvordan bestemme den deriverte i et punkt numerisk

Her finner du oppgaver for å øve på å finne den deriverte numerisk. Nederst på siden kan du laste ned oppgavene som Word- og pdf-dokumenter.

Oppgave 1

a) Utvid programmet fra teorisiden slik at en bruker kan legge inn en selvvalgt x-verdi.

Løsning
Python
1import numpy as np
2
3def f(x):
4    return np.exp(x)+np.log(x)          #definerer funksjonen
5def derivert(x,h):
6    return (f(x+h)-f(x))/h              #definerer tilnærming til den deriverte
7
8x = float(input("Hvor vil du finne den deriverte?"))
9                      #punktet der vi skal finne den deriverte
10                      
11h = 1                 #startverdi for h 
12na = 0.0001           #hvor nøyaktig vi krever at tilnærmingen skal være 
13forrige = h+1
14ny = 1
15
16while abs(forrige - ny) > na:          #vilkåret for at løkka skal kjøre
17    forrige = ny                       #flytter verdien for siste tilnærming
18    ny = derivert(x,h)                 #legger nyeste tilnærming inn 
19    h = h/2                            #halverer h
20
21print(f'Den deriverte der x = {x} er omtrent {derivert(x,h):.2f}.')

b) Endre programmet slik at en bruker kan legge inn en vilkårlig andregradsfunksjon og en selvvalgt x-verdi.

Løsning
Python
1import numpy as np
2
3def f(a,b,c,x):
4    return a*x**2+b*x+c                  #definerer funksjonen
5def derivert(a,b,c,x,h):
6    return (f(a,b,c,x+h)-f(a,b,c,x))/h   #definerer tilnærming til den deriverte
7
8a = float(input("Hva er a i andregradsfunksjonen din?"))
9b = float(input("Hva er b i andregradsfunksjonen din?"))
10c = float(input("Hva er c i andregradsfunksjonen din?"))
11x = float(input("Hvor vil du finne den deriverte?"))
12                      #punktet der vi skal finne den deriverte
13                      
14h = 1                 #startverdi for h 
15na = 0.0001           #hvor nøyaktig vi krever at tilnærmingen skal være 
16forrige = h+1
17ny = 1
18
19while abs(forrige - ny) > na:          #vilkåret for at løkka skal kjøre
20    forrige = ny                       #flytter verdien for siste tilnærming
21    ny = derivert(a,b,c,x,h)           #legger nyeste tilnærming inn 
22    h = h/2                            #halverer h
23
24print(f'Den deriverte der x = {x} er omtrent {derivert(a,b,c,x,h):.2f}.')

c) Prøv å kjøre programmet i løsningen til b) for a=1, b=0, c=0 og x=0. Du vil oppdage at programmet gir det svaret "Den deriverte der x = 0 er omtrent 0.50.". Forklar hva det er som gjør at programmet feiler her.

Løsning

Hvis vi regner på hva som skjer første gangen løkka kjører, ser vi at både "forrige" og "ny" får verdien 1. Variabelen h blir halvert. Dermed slutter løkka, og programmet returnerer f0+12-f012=f1212=12.

Her ser vi et vanlig problem med numeriske metoder – startpunktene våre gjør at løkka enten slutter for tidlig slik som her, aldri kommer i gang eller kan gå evig eller i feil retning. Derfor må vi alltid teste programmene nøye.

Oppgave 2

Vi tar for oss funksjonen f(x)=x3+4x2-x. Vi skal finne en tilnærmingsverdi til den deriverte der x=1. Det skal vi gjøre ved å regne på gjennomsnittet av stigningstallene til sekanter på hver sin side av tangenten gjennom punktet 1, f1 (punkt A på figuren under).

Vi plasserer punkter med lik avstand til punktet 1,f1 på hver side av x=1 (punkt B og C på figuren). Vi tegner så sekantene BA og AC og finner stigningstallene til disse. Nå kan vi lage et program som flytter punktene B og C nærmere og nærmere A for å finne en tilnærmingsverdi til den deriverte. Bildet viser startpunktet for programmet med tangenten og de to sekantene tegnet inn med sine stigningstall:

a) Lag en algoritme som kan ligge til grunn for koden.

Løsning
  1. Først definerer vi funksjonen.

  2. Vi definerer x-verdien til punktet der vi skal finne den deriverte.

  3. Vi setter startverdien for avstand fra B og C til A.

  4. Vi setter nøyaktigheten for tilnærmingen til h.

  5. Vi setter startverdien for den deriverte til tangent.

  6. Vi setter startverdien til forskjellen mellom to påfølgende tilnærminger til  h+1.

  7. Vi starter ei løkke som skal gå så lenge forskjellen mellom to påfølgende tilnærminger er større enn h.

  8. Vi regner ut stigningstallene til de to sekantene.

  9. Vi regner ut gjennomsnittet av stigningstallet til de to sekantene.

  10. Vi regner ut forskjellen mellom de to sekantene.

  11. Vi legger den siste tilnærmingen inn i variabelen tangent.

  12. Vi halverer avstanden og starter løkka på nytt.

  13. Vi må skrive ut tilnærmingen når vi har kommet langt nok.

b) Skriv koden.

Løsning
Python
1def f(x):
2    return x**3+4*x**2-x
3
4x = 1                #punktet vi skal finne den deriverte i
5avstand = 1          #hvor langt vi skal gå til hver side
6h = 0.0001           #hvor nøyaktig vi krever at tilnærmingen skal være
7
8
9tangent = 20         #startverdi for den deriverte
10
11forskjell = h+1      #startverdi for while-løkka
12
13
14while abs(forskjell) > h:                  #vilkåret for løkka er at forskjellen mellom  
15                                           #denne og forrige tilnærming er større enn h
16    sek_v = (f(x)-f(x-avstand))/avstand    #stigningstallet til venstre sekant
17    sek_h = (f(x+avstand)-f(x))/avstand    #stigningstallet til høyre sekant
18    tangent_2 = (sek_v + sek_h)/2          #gjennomsnittet til de to stigningstallene
19    forskjell = tangent_2 - tangent        #forskjellen mellom denne og forrige tilnærming
20    tangent = tangent_2                    #legger den siste tilnærmingen inn i 
21                                           #plassholderen "tangent"
22    avstand = avstand/2                    #halverer avstanden til punktet x = 1
23
24print(f"Den deriverte i {x} er tilnærmet lik {tangent:.4f}.")
25

c) Utvid programmet fra oppgave b) slik at en bruker kan legge inn et valgfritt punkt der hen skal finne den deriverte.

Løsning
Python
1def f(x):
2    return x**3+4*x**2-x
3
4x = float(input("I hvilket punkt vil du finne den deriverte?"))                 
5                     #innhenter det punktet vi skal finne den deriverte i
6avstand = 1          #hvor langt vi skal gå til hver side
7h = 0.0001           #hvor nøyaktig vi krever at tilnærmingen skal være
8
9
10tangent = 20         #startverdi for den deriverte
11
12forskjell = h+1      #startverdi for while-løkka
13
14
15while abs(forskjell) > h:                  #vilkåret for løkka er at forskjellen mellom  
16                                           #denne og forrige tilnærming er større enn h
17    sek_v = (f(x)-f(x-avstand))/avstand    #stigningstallet til venstre sekant
18    sek_h = (f(x+avstand)-f(x))/avstand    #stigningstallet til høyre sekant
19    tangent_2 = (sek_v + sek_h)/2          #gjennomsnittet til de to stigningstallene
20    forskjell = tangent_2 - tangent        #forskjellen mellom denne og forrige tilnærming
21    tangent = tangent_2                    #legger den siste tilnærmingen inn i 
22                                           #plassholderen "tangent"
23    avstand = avstand/2                    #halverer avstanden til punktet x = 1
24
25print(f"Den deriverte i {x} er tilnærmet lik {tangent:.4f}.")
26

Oppgave 3

Ta utgangspunkt i funksjonen f(x)=2x3+x2-2x. Nå skal du finne tilnærmingsverdier til den deriverte i et valgfritt punkt ved hjelp av en sekant som går gjennom to punkter på hver side av dette punktet.

a) Skriv en algoritme som du kan bruke som utgangspunkt for dette programmet.

Løsning
  1. Først definerer vi funksjonen.

  2. Vi må innhente x-verdien fra brukeren.

  3. Vi må ha en variabel for hvor langt fra x punkt B og C skal ligge, vi starter med 1.

  4. Vi må ha ei grense for hvor nøyaktig tilnærmingen skal være.

  5. Vi må ha startverdi for stigningstallet til sekanten gjennom B og C.

  6. Vi må ha en variabel for forskjellen mellom to påfølgende tilnærminger.

  7. Vi må lage ei løkke som halverer avstanden fra punkt B og C til A så lenge forskjellen på to påfølgende tilnærminger er større enn den grensa vi valgte i punkt 4.

  8. Vi må skrive ut tilnærmingen når vi har kommet langt nok.

b) Lag programmet.

Løsning
Python
1def f(x):
2    return 2*x**3+x**2-2*x
3
4#definerer funksjonen
5
6x = float(input("I hvilket punkt vil du finne den deriverte?")) 
7#innhenter det punktet vi skal finne den deriverte i
8avstand = 1 #lager en variabel som gir avstanden fra (x,f(x))
9h = 0.0001 #lager ei grense for hvor nøyaktig tilnærmingen skal være
10
11
12
13tangent = abs((f(x+avstand)-f(x-avstand))/(2*avstand)) + 2
14#lager en variabel for første tilnærming og legger til 2 for å være sikker 
15#på at vilkåret i løkka ikke oppfylles i første ledd 
16
17forskjell = h+1
18#lager en variabel for forskjellen mellom to påfølgende tilnærminger
19
20while abs(forskjell) > h:
21    
22    sek = (f(x+avstand)-f(x-avstand))/(2*avstand)
23    forskjell = sek - tangent
24    #finner forskjellen mellom de to tilnærmingene
25    tangent = sek 
26    #tilordner tangentverdien til den foreløpig siste tilnærmingen
27    avstand = avstand/2 #halverer forskjellen for å gå nærmere
28
29print(f"Den deriverte i {x} er tilnærmet lik {tangent:.4f}.")

c) Utvid programmet så du kan legge inn en valgfri tredjegradsfunksjon.

Løsning
Python
1def f(a,b,c,d,x):
2    return a*x**3+b*x**2-c*x+d
3
4#definerer funksjonen
5
6a = float(input("Hva er a i din tredjegradsfunksjon?"))
7b = float(input("Hva er b i din tredjegradsfunksjon?"))
8c = float(input("Hva er c i din tredjegradsfunksjon?"))
9d = float(input("Hva er d i din tredjegradsfunksjon?"))
10#henter inn koeffisientene i tredjegradsfunksjonen
11
12x = float(input("I hvilket punkt vil du finne den deriverte?")) 
13#innhenter det punktet vi skal finne den deriverte i
14avstand = 1 #lager en variabel som gir avstanden fra (1,f(1))
15h = 0.0001 #lager ei grense for hvor nøyaktig tilnærmingen skal være
16
17
18tangent = abs((f(a,b,c,d,x+avstand)-f(a,b,c,d,x-avstand))/(2*avstand)) + 2
19#lager en variabel for første tilnærming og legger til 2 for å være sikker 
20#på at vilkåret i løkka ikke oppfylles i første ledd 
21
22forskjell = h+1
23#lager en variabel for forskjellen mellom to påfølgende tilnærminger
24
25while abs(forskjell) > h:
26    
27    sek = (f(a,b,c,d,x+avstand)-f(a,b,c,d,x-avstand))/(2*avstand)
28    forskjell = sek - tangent
29    #finner forskjellen mellom de to tilnærmingene
30    tangent = sek 
31    #tilordner tangentverdien til den foreløpig siste tilnærmingen
32    avstand = avstand/2 #halverer forskjellen for å gå nærmere
33
34print(f"Den deriverte i {x} er tilnærmet lik {tangent:.4f}.")

d) Vis ved regning at tilnærmingene i oppgave 2 og oppgave 3 egentlig blir den samme.

Løsning

Hvis vi forenkler uttrykket for gjennomsnittet i oppgave 2, får vi

12fx+h-fxh+fx-fx-hh =12fx+h-fx+fx-fx-hh= fx+h-fx-h)2h

Dette er det samme uttrykket vi regner ut direkte i oppgave 3.

Nedlastbare filer

Her kan du laste ned oppgavene som Word- og pdf-dokumenter.

Skrevet av Tove Annette Holter.
Sist oppdatert 01.11.2021