パソコンで数値計算

ラグランジュの補間法

ラグランジュの補間公式

ラグランジュの補間法は、ある区間において存在する離散的なデータを、多項式で近似する時に使われます。ラグランジュの補間法の公式は、以下のように書かれます。

プログラムソースコード例

以下は、ラグランジュの補間法を用いて、データから近似的多項式を求め、その結果求まった近似的曲線データをファイルに出力するプログラムソースコード例です。 プログラムには、データが書き込まれたファイル( 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 更新