補間
補間(ほかん)または内挿(ないそう)とは、ある数値データ列が既知である時、そのデータ列の各区間の範囲内を埋める関数や具体的な数値を与えることを言います。その中で、今回は「ラグランジュ補間」に取り組んでみましょう。
ラグランジュ補間
$n$ 個のデータ列 $(x_1, y_1), (x_2, y_2), ... (x_n, y_n)$ がある時、その全ての点を通る $n-1$ 次式 $y=f(x)$ は、
f(x) = \sum_{i=1}^{n} \frac{\prod_{j = 1, j \ne i}^{n} (x - x_j)}{\prod_{j = 1, j \ne i}^{n} (x_i - x_j)} y_i\\
たとえば $n=3$ のとき、
f(x) = \frac{(x-x_2)(x-x_3)}{(x_1-x_2)(x_1-x_3)}y_1 + \frac{(x-x_1)(x-x_3)}{(x_2-x_1)(x_2-x_3)}y_2 + \frac{(x-x_1)(x-x_2)}{(x_3-x_1)(x_3-x_2)}y_3
となるので、
g(x) = (x-x_1)(x-x_2)(x-x_3) \\
d_1 = (x_1-x_2)(x_1-x_3)\\
d_2 = (x_2-x_1)(x_2-x_3)\\
d_3 = (x_3-x_1)(x_3-x_2)\\
を使って
f(x) = \Bigl(\frac{y_1}{(x-x_1)d_1} + \frac{y_2}{(x-x_2)d_2} + \frac{y_3}{(x-x_3)d_3}\Bigr)g(x)
と書けます。
ラグランジュ補間は、与えられたデータポイントの値から直接式を描き下せるという利点がありますが、データポイントを増やすと初めから計算し直しになる欠点、多項式の次数が高くなりすぎる欠点、データポイントによっては振動曲線になってしまう欠点などがあります。
課題78:ラグランジュ補間
以下のように、それぞれ3つの関数 $y = f(x)$, $y = g(x)$, $y = h(x)$ に基づいた3つの現象が存在するものとします。ただし、$y = f(x)$, $y = g(x)$, $y = h(x)$ は未知であるとします。それを観測するための実験は、下記の x_observed
で示された11個の観測点でしか行えず、得られた観測値をそれぞれ fx_observed
, hx_observed
, gx_observed
とします。
import numpy as np
f = lambda x: 1/(1 + np.exp(-x))
g = lambda x: 1.0/(1.0+x**2)
h = lambda x: np.sin(x)
x_observed = np.linspace(-10, 10, 11) # 観測点
fx_observed = f(x_observed) # f(x) の観測値
gx_observed = g(x_observed) # g(x) の観測値
hx_observed = h(x_observed) # h(x) の観測値
ラグランジュ補間を用いて、 $y = f(x)$, $y = g(x)$, $y = h(x)$ を補間してください。ただし、 Scipy
は用いないものとします(答え合わせに使うのは良い)。
課題提出方法
-
基本的にGoogle Colaboratoryを用いてプログラミングしてください。どうしても Google Colaboratory を用いることができない場合のみ、Jupyter Notebook または Jupyter Lab を用いてください。
-
課題1つごとに、ノートブックを新規作成してください。1つのノートブックで複数の課題を解かないでください。
-
ノートブックを新規作成すると「Untitled.ipynb」のような名前になりますが、それを「学籍番号・氏名・課題番号」のような名前に変更してください。
-
質問・感想・要望などございましたらぜひ書き込んでください。
-
もし課題を解くにあたって参考になったウェブサイトがあれば、それについても触れてください。
-
課題を計算し終わった ipynb ファイルを提出するときは、指定したメールアドレスに Google Drive で共有する形で授業担当者に提出してください。