a) Utvid programmet fra teorisiden slik at en bruker kan legge inn en selvvalgt x-verdi.
LøsningPython
1import numpy as np
23deff(x):4return np.exp(x)+np.log(x)#definerer funksjonen5defderivert(x,h):6return(f(x+h)-f(x))/h #definerer tilnærming til den deriverte78x =float(input("Hvor vil du finne den deriverte?"))9#punktet der vi skal finne den deriverte1011h =1#startverdi for h 12na =0.0001#hvor nøyaktig vi krever at tilnærmingen skal være 13forrige = h+114ny =11516whileabs(forrige - ny)> na:#vilkåret for at løkka skal kjøre17 forrige = ny #flytter verdien for siste tilnærming18 ny = derivert(x,h)#legger nyeste tilnærming inn 19 h = h/2#halverer h2021print(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øsningPython
1import numpy as np
23deff(a,b,c,x):4return a*x**2+b*x+c #definerer funksjonen5defderivert(a,b,c,x,h):6return(f(a,b,c,x+h)-f(a,b,c,x))/h #definerer tilnærming til den deriverte78a =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 deriverte1314h =1#startverdi for h 15na =0.0001#hvor nøyaktig vi krever at tilnærmingen skal være 16forrige = h+117ny =11819whileabs(forrige - ny)> na:#vilkåret for at løkka skal kjøre20 forrige = ny #flytter verdien for siste tilnærming21 ny = derivert(a,b,c,x,h)#legger nyeste tilnærming inn 22 h = h/2#halverer h2324print(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 og . 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 .
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.
Vi tar for oss funksjonen . Vi skal finne en tilnærmingsverdi til den deriverte der . Det skal vi gjøre ved å regne på gjennomsnittet av stigningstallene til sekanter på hver sin side av tangenten gjennom punktet (punkt på figuren under).
Vi plasserer punkter med lik avstand til punktet på hver side av (punkt og på figuren). Vi tegner så sekantene og og finner stigningstallene til disse. Nå kan vi lage et program som flytter punktene og nærmere og nærmere 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
Først definerer vi funksjonen.
Vi definerer -verdien til punktet der vi skal finne den deriverte.
Vi setter startverdien for avstand fra og til .
Vi setter nøyaktigheten for tilnærmingen til .
Vi setter startverdien for den deriverte til tangent.
Vi setter startverdien til forskjellen mellom to påfølgende tilnærminger til .
Vi starter ei løkke som skal gå så lenge forskjellen mellom to påfølgende tilnærminger er større enn .
Vi regner ut stigningstallene til de to sekantene.
Vi regner ut gjennomsnittet av stigningstallet til de to sekantene.
Vi regner ut forskjellen mellom de to sekantene.
Vi legger den siste tilnærmingen inn i variabelen tangent.
Vi halverer avstanden og starter løkka på nytt.
Vi må skrive ut tilnærmingen når vi har kommet langt nok.
b) Skriv koden.
LøsningPython
1deff(x):2return x**3+4*x**2-x
34x =1#punktet vi skal finne den deriverte i5avstand =1#hvor langt vi skal gå til hver side6h =0.0001#hvor nøyaktig vi krever at tilnærmingen skal være789tangent =20#startverdi for den deriverte1011forskjell = h+1#startverdi for while-løkka121314whileabs(forskjell)> h:#vilkåret for løkka er at forskjellen mellom 15#denne og forrige tilnærming er større enn h16 sek_v =(f(x)-f(x-avstand))/avstand #stigningstallet til venstre sekant17 sek_h =(f(x+avstand)-f(x))/avstand #stigningstallet til høyre sekant18 tangent_2 =(sek_v + sek_h)/2#gjennomsnittet til de to stigningstallene19 forskjell = tangent_2 - tangent #forskjellen mellom denne og forrige tilnærming20 tangent = tangent_2 #legger den siste tilnærmingen inn i 21#plassholderen "tangent"22 avstand = avstand/2#halverer avstanden til punktet x = 12324print(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øsningPython
1deff(x):2return x**3+4*x**2-x
34x =float(input("I hvilket punkt vil du finne den deriverte?"))5#innhenter det punktet vi skal finne den deriverte i6avstand =1#hvor langt vi skal gå til hver side7h =0.0001#hvor nøyaktig vi krever at tilnærmingen skal være8910tangent =20#startverdi for den deriverte1112forskjell = h+1#startverdi for while-løkka131415whileabs(forskjell)> h:#vilkåret for løkka er at forskjellen mellom 16#denne og forrige tilnærming er større enn h17 sek_v =(f(x)-f(x-avstand))/avstand #stigningstallet til venstre sekant18 sek_h =(f(x+avstand)-f(x))/avstand #stigningstallet til høyre sekant19 tangent_2 =(sek_v + sek_h)/2#gjennomsnittet til de to stigningstallene20 forskjell = tangent_2 - tangent #forskjellen mellom denne og forrige tilnærming21 tangent = tangent_2 #legger den siste tilnærmingen inn i 22#plassholderen "tangent"23 avstand = avstand/2#halverer avstanden til punktet x = 12425print(f"Den deriverte i {x} er tilnærmet lik {tangent:.4f}.")26
Ta utgangspunkt i funksjonen . 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
Først definerer vi funksjonen.
Vi må innhente x-verdien fra brukeren.
Vi må ha en variabel for hvor langt fra x punkt B og C skal ligge, vi starter med 1.
Vi må ha ei grense for hvor nøyaktig tilnærmingen skal være.
Vi må ha startverdi for stigningstallet til sekanten gjennom B og C.
Vi må ha en variabel for forskjellen mellom to påfølgende tilnærminger.
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.
Vi må skrive ut tilnærmingen når vi har kommet langt nok.
b) Lag programmet.
LøsningPython
1deff(x):2return2*x**3+x**2-2*x
34#definerer funksjonen56x =float(input("I hvilket punkt vil du finne den deriverte?"))7#innhenter det punktet vi skal finne den deriverte i8avstand =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ære10111213tangent =abs((f(x+avstand)-f(x-avstand))/(2*avstand))+214#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 1617forskjell = h+118#lager en variabel for forskjellen mellom to påfølgende tilnærminger1920whileabs(forskjell)> h:2122 sek =(f(x+avstand)-f(x-avstand))/(2*avstand)23 forskjell = sek - tangent
24#finner forskjellen mellom de to tilnærmingene25 tangent = sek
26#tilordner tangentverdien til den foreløpig siste tilnærmingen27 avstand = avstand/2#halverer forskjellen for å gå nærmere2829print(f"Den deriverte i {x} er tilnærmet lik {tangent:.4f}.")
c) Utvid programmet så du kan legge inn en valgfri tredjegradsfunksjon.
LøsningPython
1deff(a,b,c,d,x):2return a*x**3+b*x**2-c*x+d
34#definerer funksjonen56a =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 tredjegradsfunksjonen1112x =float(input("I hvilket punkt vil du finne den deriverte?"))13#innhenter det punktet vi skal finne den deriverte i14avstand =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ære161718tangent =abs((f(a,b,c,d,x+avstand)-f(a,b,c,d,x-avstand))/(2*avstand))+219#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 2122forskjell = h+123#lager en variabel for forskjellen mellom to påfølgende tilnærminger2425whileabs(forskjell)> h:2627 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ærmingene30 tangent = sek
31#tilordner tangentverdien til den foreløpig siste tilnærmingen32 avstand = avstand/2#halverer forskjellen for å gå nærmere3334print(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
Dette er det samme uttrykket vi regner ut direkte i oppgave 3.