数学のブログ

ルンゲ現象 多項式補間 ラグランジュ補間 kashiさん( @mkashi )、黒木玄さん(Gen Kuroki、 @genkuroki )のツイートより

黒木玄さんがJulia言語で描画しているのをみて、Wolfram言語でも書いてみたくなったから書いてみた。せっかくだから、動きも描いてみた。

コード(Wolfram Language, Jupyter)

f[x_] := 1/(1+25x^2)
xs[n_] := Table[-1+(i-1)2/n, {i, 1, n + 1, 1}]
ys[n_] := Table[f[x], {x, xs[n]}]
lj[x_, j_, n_] := Product[(x-xs[n][[m]]) / (xs[n][[j]] - xs[n][[m]]),
                      {m, Join[Table[m, {m, 1, j-1}],
                               Table[m, {m, j+1, n + 1}]]}]
l[x_, n_] := Sum[ys[n][[j]] lj[x, j, n], {j, 1, n + 1}]
Plot[Evaluate[Join[{f[x]}, Table[Simplify[l[x, n]], {n, 5, 15, 2}]]],
     {x, -1, 1},
     PlotLegends -> Join[{f[x]}, Table[StringJoin["n = ", ToString[n]], {n, 5, 15, 2}]]
]
Output
Manipulate[
    Plot[{f[x], Evaluate[l[x, n]]}, {x, -1, 1}, PlotRange -> {-1, 2}],
    {n, 5, 15, 2},
    SaveDefinitions -> True
]
Output

ルンゲ現象についての詳細

多項式補間はファンデルモンド以外の解法のラグランジュ補間を利用。

確かに原点で近似が良くなっていくと端点の1、-1では近似が誤差が大きくなり、また、端点で誤差が小さくなると、原点での誤差が大きくなることを確認できた。