プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

ラグランジュ補間とは?公式・アルゴリズム・C++実装例を徹底解説

ラグランジュ補間とは

離散的に与えられた一連のデータ点の範囲内で、新たなデータ点を求める際には「補間(インターポレーション)」という手法が用いられます。ラグランジュ補間はその代表的な手法の一つであり、与えられたデータ点が等間隔に並んでいない場合でも適用できる点が大きな特徴です。

ラグランジュ補間では、すべての既知のデータ点を通る多項式 P(x) を構成します。このとき、次の式に従って計算を行います。

ラグランジュ補間とは?公式・アルゴリズム・C++実装例を徹底解説

ここでは、各データ点 (xi, f(xi)) ごとに「基底多項式」と呼ばれる項を作り、それらを f(xi) で重み付けして総和を取ることで、目的の点における関数値を求めます。i = j のとき分母が 0 になってしまうため、内側のループでは i ≠ j の場合のみ計算を行う点に注意してください。

入力と出力

Input:
x と f(x) の値のリスト。f(3.25) を求める
x: {0,1,2,3,4,5,6}
f(x): {0,1,8,27,64,125,216}
Output:
ラグランジュ補間後の結果 f(3.25) = 34.3281

アルゴリズム

lagrangeInterpolation(x: array, fx: array, x1)

入力 − 既知のデータを格納した x 配列と fx 配列、および値を求めたい点 x1。

出力: f(x1) の値。

Begin
    res := 0, tempSum := 0
    for i := 1 to n, do
        tempProd := 1
        for j := 1 to n, do
            if i ≠ j, then
                tempProd := tempProd * (x1 – x[j]) / (x[i] – x[j])
        done
        tempProd := tempProd * fx[i]
        res := res + tempProd
    done
    return res
End

C++による実装例

#include<iostream>
#define N 6
using namespace std;

double lagrange(double x[], double fx[], double x1) {
    double res = 0, tempSum = 0;

    for(int i = 1; i<=N; i++) {
        double tempProd = 1;              // 各ループごとに積を初期化
        for(int j = 1; j<=N; j++) {
            if(i != j) {                  // i = j の場合は分母が0になるため除外
                tempProd *= (x1 - x[j])/(x[i] - x[j]);   // 公式に従って各項を掛ける
            }
        }
        tempProd *= fx[i];                // f(xi) を掛ける
        res += tempProd;
    }
    return res;
}

main() {
    double x[N+1] = {0,1,2,3,4,5,6};
    double y[N+1] = {0,1,8,27,64,125,216};
    double x1 = 3.25;
    cout << "Result after lagrange interpolation f("<<x1<<") = " << lagrange(x, y, x1);
}

実行結果

Result after lagrange interpolation f(3.25) = 34.3281

まとめ

ラグランジュ補間は、不等間隔のデータ点にも柔軟に対応できる強力な補間手法です。一方で、データ点数 n に対して計算量が O(n²) となり、点数が多いほど高次の多項式による振動(ランゲ現象)が発生しやすくなる点には注意が必要です。少数の既知データから滑らかな近似値を得たい場面で、特に有効に機能します。

  1. Python Pandas入門:interpolate()メソッドでNaN値を補間して埋める方法

    はじめにPandasでは、interpolate()メソッドを使うことで、DataFrame内の欠損値(NaN)を補間によって効率的に埋めることができます。このメソッドは、前後の値をもとに線形補間を行い、データの流れを保ちながら自然な形で欠損値を推定します。ここでは、Microsoft Excelで開いた以下のようなCSVファイルを例に説明します。このデータには一部NaN値が含まれています。1. CSVファイルからデータを読み込むまず、read_csv()関数を使って、CSVファイルのデータをPandas DataFrameに読み込みます。dataFrame = pd.read_csv(C:\

  2. Matplotlibのpcolormeshでスムーズな補間を実現する方法

    Matplotlibのpcolormeshを使用する際に、滑らかな補間(スムージング)を得たい場合は、shading=gouraudオプションを指定します。デフォルトのフラットな塗り分けではなく、グーリョー(Gouraud)シェーディングによって色が隣接するセル間で自然になめらかに補間されます。実装手順図のサイズを設定し、サブプロット間および周囲の余白(パディング)を調整します。NumPyのmeshgridを使用して、データおよびx座標・y座標を作成します。pcolormesh()メソッドを使い、矩形グリッド上の擬似カラープロットを作成します。このときshading=gouraudを指定します