補間法と最小二乗法(1)
実習課題

実習課題

注意:以下の課題については,完成したソースファイル,および,グラフを作成した .xlsx ファイルを提出すること.

課題1

Point2D points[N] =
  {{-3.5, -2.2},
   {-2.2, -0.3},
   {-1.0,  1.5},
   { 0.2,  1.9},
   { 2.3,  2.2} };

課題の準備で用いた上記の点群データ5点を用いて,各区間(計4区間)を通る 1 次関数を,式(1)を用いて求めよ.
計算結果として,$x^0$ および $x^1$ の係数(つまり「切片」と「傾き」)を画面に表示せよ. ソースファイルのみ提出すればよい.

可能であれば,計算結果が正しいかどうか,グラフ用紙上,またはExcelで検証すること.
(得られた切片と傾きから直線を書き,直線上に2点が存在するかを確認.)

実行結果(数値は例であり,正しいとは限らない)

        | 切片     傾き
--------+------------------
区間1   | 5.234    0.222
区間2   | 2.333    1.333
区間3   | -1.133   3.444
区間4   | 2.334    2.111

ソースファイル 153R000000-04-1.cpp を提出.

課題2

同様の5点の点群データを用いて,ラグランジュ補間を行ってみよう.
($N+1$ 個の点群から $N$ 次関数が決定できる.ここでは5点あるので,4次関数を決定する.)

上記の関数および下記を参考に,$x$ の値を -4.0 から 3.0 まで,0.1 ずつ増加させて,それぞれ $y$ を計算し,グラフを書け.
下記を参考に,完成したソースコードと,Excelで描いたグラフを含むファイル (.xlsx形式) を提出せよ.

ソースファイル 153R000000-04-2.cpp と,Excel(153R000000-04-2.xlsx) を提出.

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 の値を順次計算,出力 */

    return 0;
}

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

図1.補間結果.赤点が既知の制御点,黒丸が補間により求めた点群である.

ここでは,Excelの機能で,散布図として描画している. また,補間機能により,求めた点を線で接続している.

課題3

次に, スプライン補間は以下のソースコード(文字コードはUTF-8)および各種文献を参照すること.
153R000000-04-3.cpp

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

ソースファイル 153R000000-04-3.cpp,グラフ 153R000000-04-3.xlsx を提出.

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

図2.補間結果,図1のラグランジ補間とスプライン補間の比較.赤点が既知の制御点である.
どちらの補間法でも必ず制御点を通るが,それ以外では通過する位置が大きく異なる区間がある.