Clenshawのアルゴリズム

Clenshawのアルゴリズム(Chebyshev補間のある点での関数値の評価)を説明して、実装する。

いま $n$ 次のチェビシェフ多項式で展開された関数の $x$ における値

$$ S_n=\sum_{r=0}^n a_rP_r(x) = a_0P_0(x) + a_1P_1(x) + \dots + a_nP_n(x) $$

の計算することを考える。ここで $\{P_r(x)\}$ はチェビシェフ多項式(第1〜4種)である。この $S_n$ は

$$ S_n=\mathbf{a}^{T}\mathbf{p} $$

と表すことができ、

$$ \mathbf{a}^{T}=(a_0,a_1,\dots,a_n),\quad\mathbf{p}=(P_0(x),\dots,P_n(x))^T. $$

それぞれ多項式は次のような再帰的関係式が成り立つ。

$$ P_r(x)-2xP_{r-1}(x)+P_{r-2}(x)=0,\quad r=2,3,\dots$$

それぞれ、

$$ P_0(x)=1,\quad P_1(x)=\begin{cases}T_1(x)=x & (\mbox{第1種チェビシェフ多項式})\\ U_1(x)=2x& (\mbox{第2種チェビシェフ多項式})\\ V_1(x)=2x-1& (\mbox{第3種チェビシェフ多項式})\\ W_1(x)=2x+1& (\mbox{第4種チェビシェフ多項式}). \end{cases}$$

上の関係式は以下のように行列表記で表される。

$$ %\left( \begin{pmatrix}%{cccccccc} 1 & & & & & & \\ -2 x & 1 & & & & & \\ 1 & -2 x & 1 & & & & \\ & 1 & -2 x & 1 & & & \\ & & \ddots & \ddots & \ddots & & \\ & & & 1 & -2 x & 1 & \\ & & & & 1 & -2 x & 1 \end{pmatrix}\begin{pmatrix} P_0(x)\\P_1(x)\\P_2(x)\\P_3(x)\\\vdots\\P_{n-1}(x)\\P_n(x) \end{pmatrix}=\begin{pmatrix} 1\\X\\0\\0\\\vdots\\0\\0 \end{pmatrix}. % \right) $$

または、左辺の係数行列を $\mathbf{A}$ とすると次のようにも表記できる。

$$ \mathbf{A}\mathbf{p}=\mathbf{c},\quad \mathbf{c}= \begin{pmatrix} 1\\X\\0\\\vdots\\0 \end{pmatrix}. $$

ここでベクトル $\mathbf{c}$ 内の $X$ は、それぞれのチェビシェフ多項式(第1〜4種)に対応して $X=-x, 0, -1, 1$ である。さらに

$$ \mathbf{b}^T=(b_0,b_1,・・・,b_n) $$

は以下をみたすベクトルであるとする。

$$ %\left( (b_0,b_1,...,b_n) \begin{pmatrix}%{cccccccc} 1 & & & & & & \\ -2 x & 1 & & & & & \\ 1 & -2 x & 1 & & & & \\ & 1 & -2 x & 1 & & & \\ & & \ddots & \ddots & \ddots & & \\ & & & 1 & -2 x & 1 & \\ & & & & 1 & -2 x & 1 \end{pmatrix}=(a_0,a_1,...,a_n) % \right) $$

これは次のようにも書ける。

$$ \mathbf{b}^{T}\mathbf{A}=\mathbf{a}^T. $$

よって、

$$ S_n=\mathbf{a}^{T}\mathbf{p}=\mathbf{b}^{T}\mathbf{A}\mathbf{p}=\mathbf{b}^{T}\mathbf{c}=b_0+b_{1}X. $$

このとき各 $b_r$ は $b_{n+1}=b_{n+2}=0$ を仮定すると、上の式から次の漸化式をみたす。

$$ b_r-2xb_{r+1}+b_{r+2}=a_r,\quad r=n,\dots,1,0. $$

よって、$b_{n+1}=b_{n+2}=0$を仮定し漸化式を逐次的に計算することで $S_n$ は計算できる。

$$ S_n=b_0+b_1X $$

これをClenshawのアルゴリズムという。

ClenshawのアルゴリズムをJuliaで実装し、区間演算と組み合わせてチェビシェフ補間の関数値の精度保証付き数値計算を実行する。まず、上で説明した逐次的な反復計算を実行すると

上図は $f(x)=\exp\left(-(x-0.1)^2\right)$ の $x=0.3$ における値をプロットしている。

さらに反復計算の工夫により、反復回数を約半分にしたコードによってClenshawのアルゴリズムを実装する。

実際に、$x=0.3, 0.5$ における関数値をClenshawのアルゴリズムとJuliaの関数値で計算すると同程度の値が計算されている。

一方で、第1種チェビシェフ多項式の定義

$$ T_n(x):=\cos(n\theta),\quad x=\cos(\theta) $$

から、以下のように関数値を計算する方法も実装できる。

これらの実装を計算時間の観点から比べてみる。はじめに多くの点(100万点)で関数値を計算すると、

計算の実行時間で約40倍clenshawのアルゴリズムが早いことが分かる。次に区間演算を用いて計算した関数値を区間で包含する計算時間を比べると

こちらもclenshawのアルゴリズムの実装の方が計算時間が早い。

一方で、チェビシェフ補間の項数が多くなってくるとclenshawのアルゴリズム内で区間演算を実行する回数が多くなり、区間の幅が増大することが観測される。

したがって、これらの計測から分かる区間演算を利用した関数値の包含に対するベストプラクティスはチェビシェフ補間の項数が少ない場合(大体20項程度まで)はClenshawのアルゴリズムによる評価を利用し、それ以降はeval_chebの計算方法を採用することが良いと思われる。

本資料は以下のような文献・Web ページ等を参考にこの文章は書いています。

参考文献

  1. J.C. Mason and D.C. Handscomb, Chebyshev Polynomials (1st ed.), Chapman and Hall/CRC, 2002.
    (2.4.1章にClenshawのアルゴリズムの説明があり、それのほぼ和訳になっている。この本はチェビシェフ多項式をもの凄く詳しく説明している教科書で辞書的に調べる使い方で無敵を誇る)
二平泰知, 高安亮紀,2022年8月4日