静かなる名辞

pythonとプログラミングのこと


指数関数を二次多項式で近似してみる

はじめに

 指数関数って右半分の形だけなら、二次関数になんとなく似ていますよね。二次多項式を持ってくれば近似的にできそうな気ができるので、やってみましょう。

  y=e^x y=a + bx + cx^2はだいたい同じようなものじゃないの? という話です。

プログラム

 pythonのscipyを使います。コードを載せますが、読み流して頂いても構いません。

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

def exp_f(x):
    return np.exp(x)

def pow_f(x, a, b, c):
    return a + b * x + c * x ** 2

def main():
    np.random.seed(0)
    x = np.arange(0, 3, 0.05)
    y = exp_f(x) + np.random.normal(scale=1, size=x.shape)

    params, cov = curve_fit(pow_f, x, y)
    plt.scatter(x, y, c="b", alpha=0.2)

    plot_x = np.arange(0, 4, 0.1)
    plt.plot(plot_x, exp_f(plot_x), color="b", label="y=exp(x)")
    plt.plot(plot_x, pow_f(plot_x, *params), color="r", 
             label="y={0:.2f}+{1:.2f}x+{2:.2f}x^2".format(*params))
    plt.legend()
    plt.savefig("result.png")

if __name__ == "__main__":
    main()

result.png
result.png

 内挿で見るとぱっと見なんとなくフィットしているような気もしますが、外挿は案の定だめです。

 でも、限られた区間であればこれでいいような気も・・・

できる理由

 指数関数をテイラー展開すると、多項式になるからです。更に、低い次数のものほど係数が大きい多項式なので、低次の多項式でけっこううまく近似できます。有名な話ですね。

テイラー展開(exp)

 こちらのページでぽちぽち動かしてみると実感できます。