f(x, y, ...)
x
, y
, ...)ddxf(x)=limh→0f(x+h)−f(x)h
h
to approximate the derivativef(x)=x2
f′(2)=f(2+0.000001)−f(2)0.000001
f′(2)=2.0000012−220.000001
if
and while
statements, and intermediate variables are difficult to handlefrom ad import AD, sin
def f(x):
return (x + x) ** 3
def g(x):
return sin(((x + x) * x) ** 3)
print(f(AD(2))) # AD(x = 64, dx = 96)
print(g(AD(2))) # AD(x = 0.07951849401287635, dx = -1531.1360883428383)
def g(x):
return sin(((x + x) * x) ** 3)
def g(x):
a = x + x
return sin((a * x) ** 3)
def g(x):
a = x + x
b = a * x
return sin(b ** 3)
def g(x):
a = x + x
b = a * x
c = b ** 3
return sin(c)
def g(x):
a = x + x
b = a * x
c = b ** 3
return sin(c)
Derivative is:
dg/dx = cos(c) * ...
def g(x):
a = x + x
b = a * x
c = b ** 3
return sin(c)
Derivative is:
dg/dx = cos(c) * dc/dx
def g(x):
a = x + x
b = a * x
c = b ** 3
return sin(c)
Derivative is:
dc/dx = 3 * b**2 * db/dx
dg/dx = cos(c) * dc/dx
def g(x):
a = x + x
b = a * x
c = b ** 3
return sin(c)
Derivative is:
db/dx = a * dx/dx + x * da/dx
dc/dx = 3 * b**2 * db/dx
dg/dx = cos(c) * dc/dx
def g(x):
a = x + x
b = a * x
c = b ** 3
return sin(c)
Derivative is:
da/dx = dx/dx + dx/dx
db/dx = a * dx/dx + x * da/dx
dc/dx = 3 * b**2 * db/dx
dg/dx = cos(c) * dc/dx
def g(x):
a = x + x
b = a * x
c = b ** 3
return sin(c)
g(AD(2))
def g(x):
a = AD(2) + AD(2)
b = a * AD(2)
c = b ** 3
return sin(c)
class AD:
def __init__(self, x, dx = 1):
self.x = x
self.dx = dx
def g(x):
a = AD(2, 1) + AD(2, 1)
b = a * AD(2, 1)
c = b ** 3
return sin(c)
def g(x):
a = AD.add(AD(2, 1), AD(2, 1))
b = AD.mult(a, AD(2, 1))
c = AD.pow(b, 3)
return AD.sin(c)
def add(a, b):
x = a.x + b.x
dx = a.dx + b.dx
return AD(x, dx)
def g(x):
a = add(AD(2, 1), AD(2, 1))
b = mult(a, AD(2, 1))
c = pow(b, 3)
return sin(c)
def g(x):
a = AD(2 + 2, 1 + 1) # add(AD(2, 1), AD(2, 1))
b = mult(a, AD(2, 1))
c = pow(b, 3)
return sin(c)
def g(x):
a = AD(4, 2)
b = mult(a, AD(2, 1))
c = pow(b, 3)
return sin(c)
def g(x):
b = mult(AD(4, 2), AD(2, 1))
c = pow(b, 3)
return sin(c)
def mult(a, b):
x = a.x * b.x
dx = a.x * b.dx + b.x * a.dx
return AD(x, dx)
def g(x):
b = mult(AD(4, 2), AD(2, 1))
c = pow(b, 3)
return sin(c)
def g(x):
b = AD(4 * 2, 4 * 1 + 2 * 2) # mult(AD(4, 2), AD(2, 1))
c = pow(b, 3)
return sin(c)
def g(x):
b = AD(8, 8)
c = pow(b, 3)
return sin(c)
def g(x):
c = pow(AD(8, 8), 3)
return sin(c)
def pow(a, b):
x = a.x ** b
dx = b * a.x ** (b - 1) * a.dx
return AD(x, dx)
def g(x):
c = pow(AD(8, 8), 3)
return sin(c)
def g(x):
c = AD(8 ** 3, 3 * 8 ** 2 * 8) # pow(AD(8, 8), 3)
return sin(c)
def g(x):
c = AD(512, 1536)
return sin(c)
def g(x):
return sin(AD(512, 1536))
def sin(a):
x = math.sin(a.x)
dx = a.dx * math.cos(a.x)
return AD(x, dx)
def g(x):
return sin(AD(512, 1536))
def g(x):
return AD(math.sin(512), 1536 * math.cos(512)) # sin(AD(512, 1536))
def g(x):
return AD(0.07951849401287635, -1531.1360883428383)
autograd
packagetf.GradientTape