Oblig 2 i MAT

Transcription

Oblig 2 i MAT
Oblig 2 i MAT-INF1100
Tor Hedin Brønner (torhbr)
1
Oppgave 1.
a) from numpy import ∗
def d(x ) :
””” Takes an array , x , o f l e n g t h n and p r o d u c e s
an array , dx , o f l e n g t h n−1 c o n s i s t i n g o f t he s i g n e d
i n t e r v a l l e n g t h s dx [ i ] = x [ i +1] − x [ i ] where i r a n g e s
from 0 t o n − 1 .
”””
return x [ 1 : ] − x[: −1]
d e f D( x , y ) : # u s i n g newton−q u o t i e n t s
dy = z e r o s ( l e n ( x ) )
dy [ : − 1 ] = d ( y ) / d ( x ) # f o r w a r d q u o t i e n t s a t x [ : − 1 ]
dy [ −1] = dy [ −2]
r e t u r n dy
Her får vi strengt tatt ikke en funksjon som kan ta en vilkårlig t. Vi
kan lage en slik funskjon ved å tilnærme f (t) når t ∈ (ti , ti+1 ) med yi +
yi+1 −yi
(t − ti ) (dvs. strekke rette linjer mellom punktene). En python
ti+1 −ti
implementasjon kan se slik ut:
d e f make f ( x , y ) :
dy = d ( y ) / d ( x )
def f ( t ) :
f o r i i n range ( l e n ( x ) ) :
i f t <= x [ i + 1 ] :
1
break
r e t u r n y [ i ] + dy [ i ] ∗ ( t − x [ i ] )
return f
Når vi plotter D(x, y) på gps-sporet får vi:
a
1.5
1.0
0.5
0.0
0.5
0
1000 2000 3000 4000 5000 6000
t
b) d e f I ( x , y ) : # Trapezoid method
tra = d(x )∗( y[: −1] + d(y )/2)
i = zeros ( len (x )) # i [ 0 ] = 0
f o r j i n range ( l e n ( t r a ) ) :
i [ j +1] = i [ j ] + t r a [ j ]
return i
Når vi plotter denne får vi:
2
2.0
×10
4
s
1.5
1.0
0.5
0.0 0
1000 2000 3000 4000 5000 6000
t
c) Kort skisse over koden til plottingen (se vedlegg for full kode):
from m a t p l o t l i b . pylab import ∗
f = open ( ’ running . txt ’ )
x , y = f l o a t ( [ l . s p l i t ( ’ , ’) for l in f ] ) .T # vector f l o a t
a , s = D( x , y ) , I ( x , y )
fg , ax = s u b p l o t s ( )
ax . p l o t ( x , a )
f g . s a v e f i g ( ’ a . pdf ’ )
fg , ax = s u b p l o t s ( )
ax . p l o t ( x , s )
f g . s a v e f i g ( ’ s . pdf ’ )
Som vi ser på grafen på grafene ovenfor er det to perioder, en lang og en
kort, der a-grafen har få punkter og s-grafen er slakere.
Hvis vi ser på running.txt ser vi dette:
4063 ,3.1667
4 56 3 , 0
4 56 4 , 0
4567 ,1.75
4569 ,2.1667
3
Gps-sporet stopper altså brått (ingen nedakselerasjon) og er borte i lang
tid. Her blir approksimasjonene av akselerasjon og strekning ubrukelige.
Det er snakk om en dx ≈ 500, i forhold til en median på dx = 6. Spesielt
for s-grafen får vi problemer, man får en slak linje, som blir helt feil hvis
løperen faktisk stoppet.
Alt i alt er dette et problem med data-grunnlaget. Vi må dermed fikse
det ved å analysere situasjonen manuelt. Vi ser at løperen er stille når
sporet starter opp igjen. Vi kan kanskje anta at hun stoppet gpsen for
så å stoppe selv. I så fall kan vi dele opp hele intervalet slik at vi ikke
inkluderer de intervalene der vi ikke har data. Hvis vi gjør dette med s
får vi:
20000
15000
10000
5000
00
1000 2000 3000 4000 5000 6000 7000
Det er også mulig at gpsen stoppet av seg selv. Løperen ser dermed ut til
å ha stoppet for å fikse problemet. I så fall kan vi anta at løperen bare
stoppet så lenge det tok å få i gang gpsen igjen. I dette tilfellet kunne
vi legge på noen punkter med snitthastigheten. Det ville nok vært lurt å
spørre løperen hva som skjedde, hvis man var interessert i få en nøyaktig
løpelengde.
4
2
Oppgave 2.
a) x0 − x2 = 1 ⇒
x0
=1⇒
1 + x2
Z
Z
x0
dt =
1 + x2
Z
dt ⇒
1
dx = t + C ⇒ arctan x = t + C ⇒
1 + x2
x = tan (t + C)
x(0) = tan (C) = 1 ⇒ C = π4 . Dermed er x(t) = tan (t + π4 ).
b) Her plotter vi en tilnærming til x(t) ved å bruke Eulers metode:
5
4
tan(t + π/4)
euler
3
2
10.0
0.1
0.2
0.3
0.4
0.5
Her har vi brukt denne implementasjonen av Eulers metode, der x0 = f (x)
bare avhenger x:
def euler ( f , x 0 , I , n ) :
dt = ( I [ 1 ] − I [ 0 ] ) / f l o a t ( n )
t s = arange ( I [ 0 ] , I [ 1 ] , dt )
x = z e r o s ( n+1)
x [0]= x 0
f o r i i n range ( n ) :
x [ i +1] = x [ i ] + f ( x [ i ] ) ∗ dt
return ts , x
Plottingen er gjort slik (se kode vedlegg for all kode):
5
et , ex = e u l e r ( lambda x : 1 + x ∗∗2 , 1 , ( 0 , 0 . 6 ) , 6 )
fg , a x e s = s u b p l o t s ( f i g s i z e =(5 , 2 . 5 ) )
ts = linspace (0 ,0.6)
a x e s . p l o t ( t s , tan ( p i /4 + a r r a y ( t s ) ) , l a b e l=r ’ $tan ( t+\p i / 4) $ ’ )
a x e s . p l o t ( et , ex , l a b e l=r ’ $ e u l e r $ ’ )
axes . a x i s ( ’ tight ’ )
a x e s . l e g e n d ( l o c =2)
c) Hvis vi bruker Eulers midtpunktmetode på x(t) får vi dette plottet:
5
4
3
tan(t + π/4)
euler
euler_mid
2
10.0
0.1
0.2
0.3
0.4
Her har vi brukt en lignende implementasjon som i b):
def euler mid ( f , x 0 , I , n ) :
dt = ( I [ 1 ] − I [ 0 ] ) / f l o a t ( n )
t s = [ I [ 0 ] + i ∗ dt f o r i i n range ( n +1)]
x = z e r o s ( n+1)
x [0]= x 0
f o r i i n range ( n ) :
x mid = x [ i ] + f ( x [ i ] ) ∗ dt /2
x [ i +1] = x [ i ] + f ( x mid )∗ dt
return ts , x
Plottingen er gjort på samme måte som i b).
d) Ved å plotte den alternative metoden får vi:
6
0.5
5
4
3
tan(t + π/4)
euler
euler_mid
mid
2
10.0
0.1
0.2
0.3
0.4
0.5
Eulers midtpunktmetode ser ut til å fungere litt bedre enn den alternative
metoden, men det er ganske jevnt. Eulers metode er klart dårligst. Den
alternative metoden er implementert slik:
d e f mid ( f , x 0 , I , n ) :
dt = ( I [ 1 ] − I [ 0 ] ) / f l o a t ( n )
t s = [ I [ 0 ] + i ∗ dt f o r i i n range ( n +1)]
x = z e r o s ( n+1)
x [0]= x 0
f o r i i n range ( n ) :
x [ i +1] = ( 2 − dt ∗x [ i ] − 2∗ s q r t ( 1 − dt ∗∗2 −2∗x [ i ] ∗ dt ) ) / dt
return ts , x
1 − h2 − 2xk h kan ikke være mindre enn 0. Når xk blir større må h bli
mindre. Hvis xk blir veldig stor kan det være at vi må bruke upraktiske
små h.
Løser vi denne ligningen får vi:
p
p
−2xk ± 2 x2k + 1
−2xk ± 4x2k + 4
=
h=
2
2
q
= −xk ±
0<
x2k + 1
p
x2k + 1 − xk → 0 når xk → ∞, så
7