第4回 補間とスプライン(2)


課題1

先週の課題1と同じ5点の点群データを用いて,ラグランジュ補間を行ってみよう.
n+1 点の点群から n次関数が決定できる.ここでは5点があるので,4次関数を決定する.)

上記の関数および下記を参考に,x の値を -4.0 から 3.0 まで,0.1 ずつ増加させてそれぞれ y を計算し,グラフを書け.
下記を参考に,ソースコードおよびExcelファイルを提出せよ.


struct Point2D
{
    double x;
    double y;
};
	
int main()
{
    const int N = 5;
	Point2D points[N] = {
        {-3.5, -2.2},
        {-2.2, -0.3},
        {-1.0,  1.5},
        { 0.2,  1.9},
        { 2.3,  2.2}
    };
	
    /* xの値を変化させながら LagrangeInterp 関数により y の値を順次計算,出力 */
}

以下に計算結果の一例を示す.

interp1.png
図1.補間結果.赤点が既知の制御点,黒丸が補間により求めた点群である.
Excelの機能で,補間により求めた点を線で接続している.

Excelでのグラフ作成法

参考までに,以下の手順でグラフを作成すると良い.
詳しくは各自でExcelのオンラインヘルプを参照のこと.

  1. (x,y) の数値データをプログラムからcsv形式でファイルに書き出す.
  2. A列にxの値,B列にyの値が格納されているとする.A,B列を選択状態にして,グラフで,散布図を作成する.
  3. 制御点を表示したければ,制御点に相当する行のC列にB列の値を5箇所,コピーした上で,A,B,C列を選択して同様に散布図を書く.マーカーの色や大きさを適宜調整して,計算結果と,与えた制御点を区別し,見やすいグラフにする.
  4. もちろん工学グラフにふさわしい体裁に変更すること.(Excelの標準の書式のままでは ×)


課題2

スプライン補間の詳細なアルゴリズムは以下のソースコードおよび各種文献を参照すること.
153R000000?04?2.cpp

このソースコードを使用して,課題1と同様に5点の補間を行い,x の値を -4.0 から 3.0 まで,0.1 ずつ増加させてそれぞれ y を計算し,グラフを書け.
下記を参考に,ソースコードおよびExcelファイルを提出せよ.

また,ラグランジュ補間の結果と比較せよ.


以下に計算結果の一例を示す.

spline.png
図2.補間結果,図1のラグランジ補間とスプライン補間の比較.赤点が既知の制御点である.
補間法により,通過する位置が大きく異なる区間がある.


発展的内容

以下は提出課題としては必須ではないが,補間法についてより深く勉強したい諸君のために,関連する課題を示しておく.

  1. 補間法において,制御点を追加すると曲線がどのように変化するだろうか.例えば(3,1)などを追加した場合,既存の関数形状がどう変化する.ラグランジュ補間とスプライン補間では,どのような差が生ずるか.
  2. 3次の補間が広く使われている理由はなんだろうか.
  3. B-スプライン,ベジェ,エルミート補間など,他の補間法についても調べてみよう.

解説

1.

補間法の基本は点群(制御点)の各点を必ず通過し,かつ制御点間はカーブを描くように

2.

点群をカーブで結ぶためには最低3点が必要であるが,3点だけであれば2次でよい.4点以上の点群において任意の3点を選択しつつ滑らかに保管するためには

3.

前後の点群

点群同士が影響しあい