C++でラグランジュ補間を実装する方法
ラグランジュ補間とは、既知の複数のデータ点をすべて通る多項式を求めるための補間手法の一つです。このチュートリアルでは、ラグランジュの補間公式を使って、任意の点における値を計算するC++プログラムを作成します。
複雑なロジックを考える必要はありません。公式をそのままコードに変換するだけで実装できます。それでは、コードを見ていきましょう。
ラグランジュ補間の公式
n個のデータ点 (x₀, y₀), (x₁, y₁), …, (xₙ₋₁, yₙ₋₁) が与えられたとき、点 x における y の値は次の公式で求められます。
P(x) = Σᵢ [ yᵢ × Πⱼ≠ᵢ ( (x − xⱼ) / (xᵢ − xⱼ) ) ]
各データ点ごとに「その点以外のすべての点を使った積」を計算し、y値を掛けて、最後にすべてを合計します。
実装例
#include<bits/stdc++.h>
using namespace std;
struct Data {
int x, y;
};
double interpolate(Data function[], int xi, int n) {
double result = 0;
for (int i = 0; i < n; i++) {
double term = function[i].y;
for (int j = 0; j < n; j++) {
if (j != i) {
term = term * (xi - function[j].x) / double(function[i].x - function[j].x);
}
}
result += term;
}
return result;
}
int main() {
Data function[] = {{0,3}, {1,2}, {6,9}, {10,17}};
cout << interpolate(function, 3, 4) << endl;
return 0;
}
出力
上記のコードを実行すると、次の結果が得られます。
3
コードの解説
プログラムの流れは以下のとおりです。
- interpolate関数: データ点の配列、求めたいx座標(xi)、データ点の個数(n)を引数として受け取ります。
- 外側のループ: 各データ点 i に対して、その点のy値を初期値とする項(term)を作成します。
- 内側のループ: i 以外のすべての点 j について、(xi − xⱼ) / (xᵢ − xⱼ) を順に掛けていきます。これは公式の積(Π)の部分に相当します。
- 合計: すべての項を足し合わせたものが、求める補間値となります。
まとめ
このチュートリアルでは、C++でラグランジュ補間を実装する方法を解説しました。数値解析やデータ補間の基礎となる重要な手法なので、ぜひマスターしておきましょう。チュートリアルについて質問がある場合は、コメント欄でお知らせください。
-
C++の識別子とは?命名ルールと具体例をわかりやすく解説
C++における識別子(identifier)とは、変数、関数、クラス、モジュールなど、プログラマが定義するさまざまな要素に名前を付けて識別するために使われる名称です。識別子の命名には以下のルールがあります。先頭は半角アルファベットの大文字(A〜Z)、小文字(a〜z)、またはアンダースコア(_)で始める必要があります。2文字目以降は、英字・数字(0〜9)・アンダースコアを自由に組み合わせられます。識別子の中に「@」「$」「%」などの記号(句読点・特殊文字)を使うことはできません。大文字と小文字は区別されるC++は大文字と小文字を厳密に区別するプログラミング言語です。そのため、「Manpower」
-
Linux向けC++開発に最適なIDEのおすすめ6選
大規模なプロジェクトをテキストエディタだけで管理するのは容易ではありません。そうしたケースではIDE(統合開発環境)を活用することで、生産性が向上し、フラストレーションも大幅に軽減されるでしょう。IDEにはさまざまな種類があり、自分のニーズに合ったものを選ぶことが重要です。「Linux上のC++開発において唯一のベスト」と呼べるIDEは存在せず、賢くツールを見極める必要があります。ここでは、人気が高く、編集部のおすすめでもあるLinux向けIDEを紹介します。Linuxで使えるC++向けIDE おすすめ6選1. NetBeansNetBeansは、C/C++をはじめ多くのプログラミング言語に対