a) Utvid programmet frå teorisida slik at ein brukar kan legge inn ein sjølvvald x-verdi.
LøysingPython
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("Kvar vil du finne den deriverte?"))9#punktet der vi skal finne den deriverte1011h =1#startverdi for h 12na =0.0001#kor nøyaktig vi krev at tilnærminga skal vere 13førre = h+114ny =11516whileabs(førre - ny)> na:#vilkåret for at lykkja skal køyre17 førre = ny #flyttar verdien for siste tilnærming18 ny = derivert(x,h)#legg nyaste 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 ein brukar kan legge inn ein vilkårleg andregradsfunksjon og ein sjølvvald x-verdi.
LøysingPython
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("Kva er a i andregradsfunksjonen din?"))9b =float(input("Kva er b i andregradsfunksjonen din?"))10c =float(input("Kva er c i andregradsfunksjonen din?"))11x =float(input("Kvar vil du finne den deriverte?"))12#punktet der vi skal finne den deriverte1314h =1#startverdi for h 15na =0.0001#kor nøyaktig vi krev at tilnærminga skal vere 16førre = h+117ny =11819whileabs(førre - ny)> na:#vilkåret for at lykkja skal køyre20 førre = ny #flyttar verdien for siste tilnærming21 ny = derivert(a,b,c,x,h)#legg nyaste 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 å køyre programmet i løysinga til b) for og . Du vil oppdage at programmet gir det svaret "Den deriverte der x = 0 er omtrent 0.50.". Forklar kva det er som gjer at programmet feilar her.
Løysing
Dersom vi reknar på kva som skjer første gongen lykkja køyrer, ser vi at både "førre" og "ny" får verdien 1. Variabelen h blir halvert. Dermed sluttar lykkja, og programmet returnerer .
Her ser vi eit vanleg problem med numeriske metodar – startpunkta våre gjer at lykkja anten sluttar for tidleg slik som her, aldri kjem i gong eller kan gå evig eller i feil retning. Derfor må vi alltid teste programma nøye.
Vi tek for oss funksjonen . Vi skal finne ein tilnærmingsverdi til den deriverte der . Det skal vi gjere ved å rekne på gjennomsnittet av stigningstala til sekantar på kvar si side av tangenten gjennom punktet (punkt på figuren under).
Vi plasserer punkt med lik avstand til punktet på kvar side av (punkt og på figuren). Vi teiknar så sekantane og og finn stigningstala til desse. No kan vi lage eit program som flyttar punkta og nærare og nærare for å finne ein tilnærmingsverdi til den deriverte. Biletet viser startpunktet for programmet med tangenten og dei to sekantane teikna inn med sine stigningstal:
a) Lag ein algoritme som kan ligge til grunn for koden.
Løysing
Først definerer vi funksjonen.
Vi definerer -verdien til punktet der vi skal finne den deriverte.
Vi set startverdien for avstand frå og til .
Vi set nøyaktigheita for tilnærminga til .
Vi set startverdien for den deriverte til tangent.
Vi set startverdien til forskjellen mellom to påfølgande tilnærmingar til .
Vi startar ei lykkje som skal gå så lenge forskjellen mellom to påfølgande tilnærmingar er større enn .
Vi reknar ut stigningstala til dei to sekantane.
Vi reknar ut gjennomsnittet av stigningstalet til dei to sekantane.
Vi reknar ut forskjellen mellom dei to sekantane.
Vi legg den siste tilnærminga inn i variabelen tangent.
Vi halverer avstanden og startar lykkja på nytt.
Vi må skrive ut tilnærminga når vi har komme langt nok.
b) Skriv koden.
LøysingPython
1deff(x):2return x**3+4*x**2-x
34x =1#punktet vi skal finne den deriverte i5avstand =1#kor langt vi skal gå til kvar side6h =0.0001#kor nøyaktig vi krev at tilnærminga skal vere789tangent =20#startverdi for den deriverte1011forskjell = h+1#startverdi for while-lykkja121314whileabs(forskjell)> h:#vilkåret for lykkja er at forskjellen mellom 15#denne og førre tilnærming er større enn h16 sek_v =(f(x)-f(x-avstand))/avstand #stigningstalet til venstre sekant17 sek_h =(f(x+avstand)-f(x))/avstand #stigningstalet til høgre sekant18 tangent_2 =(sek_v + sek_h)/2#gjennomsnittet til dei to stigningstala19 forskjell = tangent_2 - tangent #forskjellen mellom denne og førre tilnærming20 tangent = tangent_2 #legg den siste tilnærminga inn i 21#plasshaldaren "tangent"22 avstand = avstand/2#halverer avstanden til punktet x = 12324print(f"Den deriverte i {x} er tilnærma lik {tangent:.4f}.")25
c) Utvid programmet frå oppgåve b) slik at ein brukar kan legge inn eit valfritt punkt der hen skal finne den deriverte.
LøysingPython
1deff(x):2return x**3+4*x**2-x
34x =float(input("I kva for eit punkt vil du finne den deriverte?"))5#innhentar det punktet vi skal finne den deriverte i6avstand =1#kor langt vi skal gå til kvar side7h =0.0001#kor nøyaktig vi krev at tilnærminga skal vere8910tangent =20#startverdi for den deriverte1112forskjell = h+1#startverdi for while-lykkja131415whileabs(forskjell)> h:#vilkåret for lykkja er at forskjellen mellom 16#denne og førre tilnærming er større enn h17 sek_v =(f(x)-f(x-avstand))/avstand #stigningstalet til venstre sekant18 sek_h =(f(x+avstand)-f(x))/avstand #stigningstalet til høgre sekant19 tangent_2 =(sek_v + sek_h)/2#gjennomsnittet til dei to stigningstala20 forskjell = tangent_2 - tangent #forskjellen mellom denne og førre tilnærming21 tangent = tangent_2 #legg den siste tilnærminga inn i 22#plasshaldaren "tangent"23 avstand = avstand/2#halverer avstanden til punktet x = 12425print(f"Den deriverte i {x} er tilnærma lik {tangent:.4f}.")26
Ta utgangspunkt i funksjonen . No skal du finne tilnærmingsverdiar til den deriverte i eit valfritt punkt ved hjelp av ein sekant som går gjennom to punkt på kvar side av dette punktet.
a) Skriv ein algoritme som du kan bruke som utgangspunkt for dette programmet.
Løysing
Først definerer vi funksjonen.
Vi må innhente x-verdien frå brukaren.
Vi må ha ein variabel for kor langt frå x punkt B og C skal ligge, vi startar med 1.
Vi må ha ei grense for kor nøyaktig tilnærminga skal vere.
Vi må ha startverdi for stigningstalet til sekanten gjennom B og C.
Vi må ha ein variabel for forskjellen mellom to påfølgande tilnærmingar.
Vi må lage ei lykkje som halverer avstanden frå punkt B og C til A så lenge forskjellen på to påfølgande tilnærmingar er større enn den grensa vi valde i punkt 4.
Vi må skrive ut tilnærminga når vi har komme langt nok.
b) Lag programmet.
LøysingPython
1deff(x):2return2*x**3+x**2-2*x
34#definerer funksjonen56x =float(input("I kva for eit punkt vil du finne den deriverte?"))7#innhentar det punktet vi skal finne den deriverte i8avstand =1#lagar ein variabel som gir avstanden frå (x,f(x))9h =0.0001#lager ei grense for kor nøyaktig tilnærminga skal vere10111213tangent =abs((f(x+avstand)-f(x-avstand))/(2*avstand))+214#lagar ein variabel for første tilnærming og legg til 2 for å vere sikker 15#på at vilkåret i lykkja ikkje blir oppfylt i første ledd 1617forskjell = h+118#lagar ein variabel for forskjellen mellom to påfølgande tilnærmingar1920whileabs(forskjell)> h:2122 sek =(f(x+avstand)-f(x-avstand))/(2*avstand)23 forskjell = sek - tangent
24#finn forskjellen mellom dei to tilnærmingane25 tangent = sek
26#tilordnar tangentverdien til den foreløpig siste tilnærminga27 avstand = avstand/2#halverer forskjellen for å gå nærare2829print(f"Den deriverte i {x} er tilnærma lik {tangent:.4f}.")
c) Utvid programmet så du kan legge inn ein valfri tredjegradsfunksjon.
LøysingPython
1deff(a,b,c,d,x):2return a*x**3+b*x**2-c*x+d
34#definerer funksjonen56a =float(input("Kva er a i tredjegradsfunksjonen din?"))7b =float(input("Kva er b i tredjegradsfunksjonen din?"))8c =float(input("Kva er c i tredjegradsfunksjonen din?"))9d =float(input("Kva er d i tredjegradsfunksjonen din?"))10#hentar inn koeffisientane i tredjegradsfunksjonen1112x =float(input("I kva for eit punkt vil du finne den deriverte?"))13#innhentar det punktet vi skal finne den deriverte i14avstand =1#lagar ein variabel som gir avstanden frå (1,f(1))15h =0.0001#lagar ei grense for kor nøyaktig tilnærminga skal vere161718tangent =abs((f(a,b,c,d,x+avstand)-f(a,b,c,d,x-avstand))/(2*avstand))+219#lagar ein variabel for første tilnærming og legg til 2 for å vere sikker 20#på at vilkåret i lykkja ikkje blir oppfylt i første ledd 2122forskjell = h+123#lagar ein variabel for forskjellen mellom to påfølgande tilnærmingar2425whileabs(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#finn forskjellen mellom dei to tilnærmingane30 tangent = sek
31#tilordnar tangentverdien til den foreløpig siste tilnærminga32 avstand = avstand/2#halverer forskjellen for å gå nærare3334print(f"Den deriverte i {x} er tilnærma lik {tangent:.4f}.")
d) Vis ved rekning at tilnærmingane i oppgåve 2 og oppgåve 3 eigentleg blir den same.
Løysing
Dersom vi forenklar uttrykket for gjennomsnittet i oppgåve 2, får vi
Dette er det same uttrykket vi reknar ut direkte i oppgåve 3.