Oppgave 1 a) Ved numerisk metode er det løst en differensiallikning av et objekt som faller mot jorden. Da verdier av er kjent gjennom resultater i form av,, kan vi vi finne en tilnærming av akselerasjonen. Da vi ikke kjenner funksjonen ønsker vi å løse punktvis med numerisk derivasjon. En tilnærmingen av objektets akselerasjon er derfor følgende: b) Videre ønsker vi også å finne en tilnærming for objektets høyde over havet. Da vi vet at må vi integrere. Med numerisk integrasjon er det mulig å løse for punktvis. Det kan også nevnes at arealet under grafen (her punkter) tilsvarer høyden med respekt til tid. Dersom en ser på en tilfeldig grafe, kan en finne høyden på 5 ved å regne ut arealet under grafen mellom 0 og 5,. I denne oppgaven ønsker vi å bruke sammen fremgangsmåte, men her med numerisk integrasjon. En tilnærming av objektets høyde over havet vil derfor bli følgende: Det vil også være mulig å tilpasse trapesmetoden for en mer nøyaktig løsning., hvor 1
Oppgave 2 a) Vi kan løse for arealet under en ukjent funksjon ved hjelp av trapesmetoden. Først ønsker vi å forklare hvordan vi får den såkalte trapesmetoden. Da arealet for et delintervall i intervallet, er gitt ved, hvor Vet vi at arealet for intervallet, blir summen av delintervallene. Altså Herfra kan vi manipulere uttrykket slik at vi får det ønskede uttrykket. Vi kan fra dette se sammenheng med trapesmetoden., Vi har med dette vist hvordan dette gir den såkalte trapesmetoden. Forskjellen her er at intervallene her deles opp i 2 like delintervaller, mens den tradisjonelle trapesmetoden deler delintervallene opp i like delintervaller. 2
b) Dersom vi ser på funksjonsverdiene, vil vi se at 2 like delintervaller. Dette betyr at intervallet, vil bli delt opp på følgende måte: 2 delintervall 2 delintervaller 2 delintervaller 2 delintervaller Nedenfor har vi tegnet delintervallene, og gitt hver funksjonsverdi et navn n. 1 1 2 3 1 2 3 4 5 6 7 Fra dette ser vi at de funksjonsverdier som i er gitt et partall er funksjonsverdier som vi finner igjen i. 3
c) Det er også mulig å manipulere utrykket på en slik at måte at det tar i bruk for å regne ut nye verdier. Først ønsker vi å se etter et mønster i utregnelser av med forskjelige verdier for. deles på 2 da intervallantallet multipliseres med 2. Med andre ord:. 23 2 3 Fra dette kan vi anta følgende: 2 1 2 1 2 1 Vi har med dette vist hvordan 2 4
d) Nedenfor finnes en ny utgave av trapes.py import time from math import * def f(x): return cos(x) def iterativ_trapes(f,a,b,eps,m): j = 0 n = 1 I =(0.5*(f(a)+f(b)))*(b-a) abserr = abs(i) while j<m and abserr>=eps*abs(i): j += 1 Ip = I n = 2*n h = (b-a)/n sum = 0.0 for i in range(1,n/2+1): x = a + (2*i-1)*h sum = sum + f(x) I = 0.5*Ip + h*sum abserr = abs(i-ip) return(i, abserr, j) a = 0.0; b = 1.0; eps = 1.0e-12 [I,err,K] = iterativ_trapes(f,a,b,eps,40) print "Integral: %1.14f, estimert relativ feil: %e, iterasjoner: %i" %(I, err, K) print "\neksakt verdi=%1.14f, eksakt feil=%e" %(sin(b),abs(sin(b)-i)/abs(sin(b))) print "Det hele tok %1.2f sekunder" %time.clock() nicolai@acg-v0101:~/documents$ python trapes_new.py Integral: 0.84147098480764, estimert relativ feil: 7.627232e-13, iterasjoner: 19 Eksakt verdi=0.84147098480790, eksakt feil=3.035902e-13 Det hele tok 0.62 sekunder nicolai@ace-v0101:~/documents$ python trapes.py Integral: 0.84147098480766, estimert relativ feil: 7.831513e-13, iterasjoner: 20 Eksakt verdi=0.84147098480790, eksakt feil=2.807648e-13 Det hele tok 1.17 sekunder Ved å bytte til en alternativ metode har vi spart 0.55 sekunder. 5
Oppgave 3 a) 1, 0 1 Vi løser for på følgende måte: 1 1 1 tan tan Deretter setter vi inn for 0 1 for å finne konstanten. tan 1 0 c tan 1 tan 6
b) Deretter ønsker vi å løse likningen numerisk på intervallet [0, 0.6] med Eulers metode. Dette kan gjøres med et program: from math import * # From x(0) = 1 h = 0.1; xp = 1.0; tp = 0.0 # Define f(t, x) def f(x): return x**2.0 + 1.0 # Solve for x' = f(t, x) for k in range(0, 6): xn = xp + h*f(xp) tn = 0.0 + (k+1)*h print tn, xn tp=tn xp=xn nicolai@acg-v0101:~$ python 3b.py 0.1 1.2 0.2 1.444 0.3 1.7525136 0.4 2.15964399182 0.5 2.72605020896 0.6 3.56918518313 Nå ønsker vi å plotte verdiene sammen med verdiene for den eksakte løsningene for. De eksakte løsningene for i intervallet 0.0, 0.6 er følgende: 0.1 tan0.1 1.22304888045 0.2 tan0.2 1.50849764712 0.3 tan0.3 1.89576512285 0.4 tan0.4 2.46496275672 0.5 tan0.5 3.40822344234 0.6 tan0.6 5.33185522346 7
c) Nå vil vi bruke Eulers midpunktmetode i stedenfor Eulers metode. På samme måte som i forrige oppgave, lager vi et program som regner ut verdiene for oss. from math import * # From x(0) = 1 h = 0.1; xp = 1.0; tp = 0.0 # Define f(t, x) def f(x): return x**2.0 + 1.0 # Solve for x' = f(t, x) for k in range(0, 6): xpn = xp + (h*f(xp))/2.0 xn = xp + h*f(xpn) tn = 0.0 + (k+1)*h print tn, xn tp=tn xp=xn nicolai@acg-v0101:~$ python 3c.py 0.1 1.221 0.2 1.50204834083 0.3 1.87922282489 0.4 2.42266081851 0.5 3.28780562019 0.6 4.89191810712 Dersom vi plotter disse verdiene i samme grafe ser vi at dette gir en mer nøyaktig tilnærming til den eksakte løsningen enn det Eulers metode ga. 8
d) Formelen kan løses numerisk med følgende program så lenge 1 2 0. Dersom dette er mindre enn null vil vi få problemer med imaginære tall. from math import * # From x(0) = 1 h = 0.1; xp = 1.0; tp = 0.0 # Define f(t, x) def f(x): return x**2.0 + 1.0 # Solve for x' = f(x) for k in range(0, 6): xn = (2-h*xp-2*sqrt(1-h**2-2*xp*h))/h tn = 0.0 + (k+1)*h print tn, xn tp=tn xp=xn nicolai@acg-v0101:~$ python 3d.py 0.1 1.22361116537 0.2 1.5104945117 0.3 1.90154482209 0.4 2.48191221114 0.5 3.46650342592 0.6 5.63947408805 Plotter vi alle grafene sammen ser vi disse verdiene ligger over de eksakte verdiene. Her ser vi at den alternative metoden ligger nærmest de eksakte verdiene for. Herfra kunne vi kanskje brukt de to beste tilnærmelsene på hver sin side, bedre tilnærmelse av. E, for å få en 9