fast
cruising
0 sec 1 sec 2 sec
1 m
/s
2 m/s
time
distance
Slide 15
Slide 15 text
slow
cruising
0 sec 1 sec 2 sec
0.5 m/s
1 m
/s
2 m/s
time
distance
Slide 16
Slide 16 text
pulling away
0 sec 1 sec 2 sec
time
distance
Slide 17
Slide 17 text
pulling away
0 sec 1 sec 2 sec
time
distance
Slide 18
Slide 18 text
pulling away
0 sec 1 sec 2 sec
time
distance
Slide 19
Slide 19 text
distance(time) = …
speed(time) = ?
differentiate
Slide 20
Slide 20 text
Symbolic
differentiation
Slide 21
Slide 21 text
distance(time) = time
×
time
speed(time) = ?
Slide 22
Slide 22 text
No content
Slide 23
Slide 23 text
No content
Slide 24
Slide 24 text
No content
Slide 25
Slide 25 text
No content
Slide 26
Slide 26 text
distance(time) = time
×
time
speed(time) = ?
Slide 27
Slide 27 text
distance(time) = time
²
speed(time) = ?
Slide 28
Slide 28 text
No content
Slide 29
Slide 29 text
distance(time) = time
²
speed(time) = 2
×
time
¹
(by the elementary power rule)
Slide 30
Slide 30 text
time distance(time) speed(time)
0 seconds 0 metres 0 m/s
1 second 1 metre 2 m/s
2 seconds 4 metres 4 m/s
3 seconds 9 metres 6 m/s
4 seconds 16 metres 8 m/s
⋮ ⋮ ⋮
distance(time) = time
×
time
speed(time) = 2
×
time
time distance(time) speed(time)
0 seconds 0 metres 0.01 m/s
1 second 1 metre 2.01 m/s
2 seconds 4 metres 4.01 m/s
3 seconds 9 metres 6.01 m/s
4 seconds 16 metres 8.01 m/s
⋮ ⋮ ⋮
distance(time) = time
×
time
speed(time) = ?
Slide 41
Slide 41 text
Automatic
differentiation
Slide 42
Slide 42 text
Big idea:
calculate a function’s
rate of change and its
value all at once
Slide 43
Slide 43 text
distance
3 seconds 9 metres
1 s/s 6 m/s
distance(time) = time
×
time
Slide 44
Slide 44 text
i
a + b
COMPLEX NUMBERS
Slide 45
Slide 45 text
DUAL NUMBERS
ε
a + b
Slide 46
Slide 46 text
class DualNumber
attr_accessor :real, :dual
def initialize(real:, dual:)
self.real = real
self.dual = dual
end
def to_s
[real, (dual < 0 ? '-' : '+'), dual.abs, 'ε'].join
end
def inspect
"(#{to_s})"
end
end
Slide 47
Slide 47 text
module Kernel
def DualNumber(real, dual = 0)
case real
when DualNumber
real
else
DualNumber.new(real: real, dual: dual)
end
end
end
distance
3 seconds 3 metres
1 s/s 1 m/s
distance(time) = time
Slide 50
Slide 50 text
3 metres
1 m/s
distance(time) = time
×
time
distance
3 seconds 9
1 s/s ?
Slide 51
Slide 51 text
( i × i = -1 )
a + bi
Slide 52
Slide 52 text
= a + c + bi + di
= (a + c) + (b + d)i
(a + bi) + (c + di) =
Slide 53
Slide 53 text
(a + bi)
×
(c + di) =
= (a
×
c) + (a
×
di) + (bi ×
c) + (bi ×
di)
= ac + (ad + bc)i + bdi ²
= ac + (ad + bc)i + bd
×
-1
= ac + (ad + bc)i - bd
= (ac - bd) + (ad + bc)i
Slide 54
Slide 54 text
a + bε
( ε × ε = 0 )
Slide 55
Slide 55 text
= a + c + bε + dε
= (a + c) + (b + d)ε
(a + bε) + (c + dε) =
Slide 56
Slide 56 text
(a + bε)
×
(c + dε) =
= (a
×
c) + (a
×
dε) + (bε ×
c) + (bε ×
dε)
= ac + (ad + bc)ε + bdε²
= ac + (ad + bc)ε + bd
×
0
= ac + (ad + bc)ε
Slide 57
Slide 57 text
class DualNumber
def +(other)
DualNumber.new \
real: real + other.real,
dual: dual + other.dual
end
def *(other)
DualNumber.new \
real: real * other.real,
dual: real * other.dual + dual * other.real
end
end
Slide 58
Slide 58 text
>> x = DualNumber(1, 2)
=> (1+2ε)
>> y = DualNumber(3, 4)
=> (3+4ε)
>> x + y
=> (4+6ε)
>> x * y
=> (3+10ε)
Slide 59
Slide 59 text
def distance(time:)
time * time
end
>> time_now = DualNumber(3, 1)
=> (3+1ε)
>> distance_now = distance(time: time_now)
=> (9+6ε)
>> distance_now.real
=> 9
>> distance_now.dual
=> 6
Slide 60
Slide 60 text
distance
3 seconds 9 metres
1 s/s 6 m/s
distance(time) = time
×
time
Slide 61
Slide 61 text
>> x = DualNumber(1, 2)
=> (1+2ε)
>> (x + 3) * 4
NoMethodError: undefined method `dual' for 3:Fixnum
Slide 62
Slide 62 text
class DualNumber
def +(other)
other = DualNumber(other)
DualNumber.new \
real: real + other.real,
dual: dual + other.dual
end
def *(other)
other = DualNumber(other)
DualNumber.new \
real: real * other.real,
dual: real * other.dual + dual * other.real
end
end
Math.singleton_class.prepend Module.new {
def sin(x)
case x
when DualNumber
DualNumber.new \
real: sin(x.real),
dual: x.dual * cos(x.real)
else
super
end
end
def cos(x)
case x
when DualNumber
DualNumber.new \
real: cos(x.real),
dual: -x.dual * sin(x.real)
else
super
end
end
}