数学
Julia

チェビシェフ多項式による関数近似:Juliaで眺めてみる。

チェビシェフ多項式を使って、関数を近似する方法をまとめる。
最後にデルタ関数を例にして近似された様子をJulia 0.6.2でgifアニメにした。

チェビシェフ多項式とは

チェビシェフ多項式とは、$-1 \le x \le 1$の範囲で
$$
T_{n}(x) = \cos (n \arccos x)
$$
で定義される関数である。もう少しわかりやすく書くと、$x = \cos t$
$$
T_{n}(x) = \cos (n t)
$$
と書くことができて、cosの加法定理を使ってバラバラにしていくとどんどん計算できる。
そして、この多項式は漸化式:
$$
T_0(x) = 1
$$
$$
T_1(x) = x
$$
$$
T_{n+1}(x) = 2 T_{n}(x) - T_{n-1}(x)
$$
に従う関数である。

チェビシェフ多項式の直交性

チェビシェフ多項式には、以下のような直交性がある
$$
\frac{2}{\pi (1 + \delta_{n0})}\int_{-1}^{1} T_n(x)T_m(x)\frac{dx}{\sqrt{1-x^2}} = \delta_{nm}
$$
この直交性を使うと、任意の$-1 \le x \le 1$の範囲にある関数を
$$
f(x) = \sum_{n=0}^{\infty} a_n T_{n}(x)
$$
とチェビシェフ多項式で展開することができる。
これは、この式の両辺に$\frac{2}{\pi (1 + \delta_{n0})} T_m(x)/\sqrt{1-x^2}$をかけて$x$で積分すれば確かめることができて、
$$
\frac{2}{\pi (1 + \delta_{m0})}\int_{-1}^{1} f(x)T_m(x)\frac{dx}{\sqrt{1-x^2}} = a_n
$$
という係数を用いれば良いことがわかる。

デルタ関数の展開

試しにデルタ関数を展開してみよう。展開係数は
$$
a_n = \frac{2}{\pi (1 + \delta_{m0})}\int_{-1}^{1} \delta(x)T_m(x)\frac{dx}{\sqrt{1-x^2}} = \frac{2T_{m}(0
)}{\pi (1 + \delta_{m0})}
$$
である。
これを使ってプロットしてみよう。
言語はJulia 0.6.2を用いる。
Juliaは高速で書きやすい言語で、
www.juliabox.com
で簡単に試すことができる。
デルタ関数のチェビシェフ多項式展開とそのカットオフ依存性のgifアニメを描画するJuliaコードは

chebyshev.rb
using Plots
gr()

function calc_f(nmax,x)
    f = 0.0
    ax = acos(x)
    Tn(n) = cos(n*π/2) 
    for n in 0:nmax
        an = 2*Tn(n)/(π*(1+ifelse(n==0,1,0)))
        f += cos(n*ax)*an
    end
    return f
end

L = 200
x = linspace(-1,1,L)

@gif for nmax in 1:100
    plot(x,calc_f.(nmax,x))
end

と書ける。これを実行すると、

tmp.gif

となる。