ラグランジュの補間法
ラグランジュの補間公式
ラグランジュの補間法は、ある区間において存在する離散的なデータを、多項式で近似する時に使われます。ラグランジュの補間法の公式は、以下のように書かれます。
プログラムソースコード例
以下は、ラグランジュの補間法を用いて、データから近似的多項式を求め、その結果求まった近似的曲線データをファイルに出力するプログラムソースコード例です。
プログラムには、データが書き込まれたファイル( input.dat )が必要となります。今回は、適当に値を決めた input.dat を用います。
#include <stdio.h> #include <stdlib.h> #define NMAX 100 /* 配列最大要素数 */ double lambda(int, int, double, double *); /* λ(x)を求める関数 */ int main(void) { int i; int n; /* データの個数 */ double x; /* x */ double f; /* f(x) */ double data_x[NMAX]; /* データのx */ double data_f[NMAX]; /* データのf(x) */ FILE *input; FILE *output; /* ファイルオープン処理 */ input = fopen("input.dat", "r"); output = fopen("output.dat", "w"); /* 配列初期化 */ for(i = 0 ; i < NMAX ; i++) { data_x[i] = 0.0; data_f[i] = 0.0; } i = 0; /* 一度使ったiを0に初期化 */ /* ファイルからデータを取得 */ while(fscanf(input, "%lf%lf", &data_x[i], &data_f[i]) != EOF) { i++; /* 次のデータを、次の配列要素に入れるためにインクルメント */ n = i; /* データの個数を代入 */ } /* ラグランジュの補間公式に基づく処理 */ for(x = data_x[0] ; x < data_x[n-1] ; x += 0.1) { f = 0.0; for(i = 0 ; i < n ; i++) { f += data_f[i] * lambda(i, n, x, data_x); } fprintf(output, "%f %f\n", x, f); /* ファイルへ書き込み */ } fclose(input); /* ファイルを閉じる */ fclose(output); /* ファイルを閉じる */ return 0; } /* λ(x)を求める関数 */ double lambda(int i, int n, double x, double data_x[]) { int j; double lam = 1.0; for(j = 0 ; j < n ; j++) { if(i != j) { lam *= (x - data_x[j])/(data_x[i] - data_x[j]); } } return lam; }
数値計算実行結果
プログラムが正しく実行されると、output.dat ファイルができます。そのファイル内に近似的に求められた曲線データが書かれていますので、それを gnuplot で出力すると、以下の図のようになります。赤い5つの点は、input.dat をプロットしたものです。緑色の曲線は、ラグランジュの補間法を用いて、近似的に求めた曲線です。その曲線を見ると、データ間が上手く補間されているのがわかります。
2009/05/10 更新