問題設定

一次関数$y=sin(x)$について、二次のテイラー展開を行え。

実装

In [1]:
import theano
import theano.tensor as T
import matplotlib.pyplot as plt
%matplotlib inline
In [2]:
x = T.dscalar('x')
y = T.sin(x)
a = T.dscalar('a')
c0 = y
c1 = T.grad(cost=y, wrt=x)
c2 = T.grad(cost=c1, wrt=x)/2
#c2 = -T.sin(x)/2
In [3]:
taylor = c0 + c1*(x-a) + c2*((x-a)**2)
In [4]:
f = theano.function(inputs=[x, a], outputs=taylor)
In [5]:
f_orig = theano.function(inputs=[x], outputs=y)
In [6]:
import numpy as np
In [7]:
input = np.linspace(-5, 5, 1000)
In [9]:
a = 2
output = [f(input[i], a) for i in range(len(input))]
plt.plot(input, output)
output_orig = [f_orig(input[i]) for i in range(len(input))]
plt.plot(input, output_orig)
print("f(a):{}, orig(a):{}".format(f(a, a), f_orig(a)))
plt.show()
f(a):0.9092974268256817, orig(a):0.9092974268256817

結論

x=aのあたりだとうまく近似できてそう。 これがテイラー展開