ここ最近、個人的に"Numerical Recipies in C"1 という、C言語の数値計算の本の一部をRustで書き直すことにハマっています。久しぶりに積分のコードを実装し、その際に補間・補外の章を読むことになりました。この記事では、その際に理解に詰まったNevilleのアルゴリズムについて自分なりにまとめています。
Nevilleのアルゴリズムとは?
互いに異なるN個の点が与えられているとき、それらの点を通るLagrange補間多項式を計算し、任意のxにおける補間多項式の値を返すアルゴリズムです。
文字や式の説明は後に回しますが、次の漸化式がNevilleのアルゴリズムの鍵になります:
Pi(i+1)⋯(i+m)=xi−xi+m(x−xi+m)Pi(i+1)⋯(i+m−1)−(xi−x)Pi(i+1)⋯(i+m)
Lagrange補間多項式
N個の点{(x1,y1),…,(xN,yN)}が与えられているとき、Lagrange補間多項式は
P(x)=(x1−x2)(x1−x3)⋯(x1−xN)(x−x2)(x−x3)⋯(x−xN)y1+(x2−x1)(x2−x3)⋯(x2−xN)(x−x1)(x−x3)⋯(x−xN)y2+⋯+(xN−x1)(xN−x2)⋯(xN−xN−1)(x−x1)(x−x2)⋯(x−xN−1)yN
で与えられます。これは一意的です。
Li(x)を
Li(x)=j=1(j=i)∏(xi−xj)(x−xj)
のように表現しておけば、これはLi(xj)=δij(δijはKroneckerのデルタ)を満たします。
よって、P(x)=∑iLiyiのように書くこともできますね。
例:4点の場合でイメージをつかむ
残念ながら私は数式だけであまりイメージができなかったので、まずは簡単な場合を考えて意味ます。
フリーレンも言っていますね。
魔法はイメージの世界だ

帰納的な図(Nevilleの三角表)
x1:x2:x3:x4:y1=P1y2=P2y3=P3y4=P4P12P23P34P123P234P1234
今、{(x1,y1),(x2,y2),(x3,y3),(x4,y4)}の4点について考えていみましょう。まずは0次の補間は定数で、P1=y1,P2=y2,P3=y3,P4=y4となります。さてそれぞれの隣り合う点同士の1次の補間関数は例えば、
P12(x)=(x1−x2)(x−x2)y1+(x2−x1)(x−x1)y2
となります。明らかに1次関数であり、P12(x1)=y1とP12(x2)=y2を満たすので、(x1,y1),(x2,y2)を通る直線を想像できるでしょう。
このセンスで、P12(x1)とP23(x3)を通る2次曲線も構築できるでしょう。つまり、
P123(x)=(x1−x3)(x−x3)P12(x)+(x3−x1)(x−x1)P23(x)
ということです。新しくできた2次関数(1次関数にさらにxの項をかけているので)は明らかにP123(x1)=y1,P123(x2)=y3です。
もちろんP123(x2)のときも
P123(x2)=(x1−x3)(x2−x3)P12(x2)+(x3−x1)(x2−x1)P23(x2)=(x1−x3)(x2−x3)y2−(x2−x1)y2=y2
です。
このようにして、1次補間を何度も繰り返すことで、4次の補完関数まで求めることができます。
