テイラー展開 / 微分だけできるようにする

ひとまず自前で微分できるようにする。

import numpy as np
import matplotlib.pyplot as plt

def differential(func, start, stop, dx, order=1):
    # 差分で微分を計算するので微分するたびにxの範囲が両端からdx/2ずつ狭くなる。
    # その狭くなる分を最初に補っておく。
    MARGIN = order * dx / 2.0
    START = start - MARGIN
    STOP = stop + MARGIN
    x_list = np.arange(START, STOP + dx/10.0, dx) # 両端が含まれるようにするため、stopパラメーターに少しだけ足しておく。
    
    y_list = func(x_list)
    for _ in range(order):
        y_list = np.diff(y_list) / dx

    # order回の差分計算によってずれた分を補正する。
    x_list += order * dx / 2.0
    x_list = x_list[:len(y_list)]
    
    return x_list, y_list

##########################################################
func = np.sin
start = -np.pi
stop = np.pi
dx = (stop - start) / 36.0

for i in range(4):
    plt.plot(*differential(func, start, stop, dx, i))

plt.grid()
plt.show()

実行結果:
水色がsin
それを微分したのがオレンジ(cos)。
さらにそれを微分したのが緑(-sin)。
さらにそれを微分したのが赤(-cos)。
微分するたびに位相がpi/2ずつ進む。