スプライン補間
スプライン補間では、データ列から構成されるそれぞれの区間ごとに3次式を当てはめ、全体として全てのデータポイントを通り、かつ1階・2階の微分係数がそれらの点で一致するようにすることで、滑らかな補間曲線を得ます。
基本的な関係式は、
\left\{
\begin{array}{ll}
f_i(x_i) = y_i \\
f_i(x_{x+1}) = y_{i+1}\\
f'_i(x_{i+1}) = f'_{i+1}(x_{i+1})\\
f''_i(x_{i+1}) = f''_{i+1}(x_{i+1})
\end{array}
\right.
$f_i(x) = a_i x^3 + b_i x^2 + c_i x + d_i$ とおくと、基本的な関係式から
\left\{
\begin{array}{ll}
a_i x_i^3 + b_i x_i^2 + c_i x_i + d_i = y_i \\
a_i x_{i+1}^3 + b_i x_{i+1}^2 + c_i x_{i+1} + d_i = y_{x+1}\\
3 a_i x_{i+1}^2 + 2 b_i x_{i+1} + c_i = 3 a_{i+1} x_{i+1}^2 + 2 b_{i+1} x_{i+1} + c_{i+1} \\
6 a_i x_{i+1} + 2 b_i = 6 a_{i+1} x_{i+1} + 2 b_{i+1} & (i = 1, ..., n-1)
\end{array}
\right.
\left\{
\begin{array}{ll}
a_n x_n^3 + b_n x_n^2 + c_n x_n + d_n = y_n \\
a_n x_{n+1}^3 + b_n x_{n+1}^2 + c_n x_{n+1} + d_n = y_{n+1} \\
6 a_1 x_1 + 2 b_1 = 0 \\
6 a_n x_{n+1} + 2 b_n = 0
\end{array}
\right.
変数が $4n$ 個、式の数が $4n$ 個の連立方程式を解けば、各区間の3次式の係数が求められます。
スプライン補間には、ラグランジュ補間のような振動が起こらず自然な曲がり方をするという利点がありますが、全区間を1つの多項式で表したい時には適さないという欠点があります。
課題79:スプライン補間
以下のように、それぞれ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 で共有する形で授業担当者に提出してください。