数値微分(4)

Pythonにはpartialという関数がある。


from functools import partial

def f(x, y):
return x - y

g = partial(f, 3)
print g(2) # 1

マハリクマハリタ」って呪文をかけると、f(x, y)がg(x) = f(3, x)という関数になる。カリー化っていうやつですね。こうすると、


from functools import partial

def f(x, y):
return x - y

h = partial(f, y = 3)
print h(2) # -1

固定する変数を指定できて、h(x) = f(x, 3)とできる。
これを使うと、


Map(f, [ a1, a2, a3, ... ]) = [ f(a1), f(a2), f(a3), ...]

と定義されるMapが使える。


def Map(f, l):
while True:
yield f(l.next())



from math import *
from functools import partial

def Repeat(f, a):
yield a
while True:
a = f(a)
yield a

def Map(f, l):
while True:
yield f(l.next())

def halve(x):
return x / 2

def easydiff(f, x, h):
return (f(x + h) - f(x)) / h

def differentiate(h0, f, x):
return Map(partial(easydiff, f, x), Repeat(halve, h0))

def within(eps, l):
b = l.next()
while True:
a = b
b = l.next()
if abs(a - b) <= eps:
return b

def diff(eps, f, x):
return within(eps, differentiate(1.0, f, x))

def f(x):
return sqrt(x * x + x + 1)

x = 1.0
eps = 1e-7
print diff(eps, f, x)
print sqrt(3) / 2 # reference