【C++】関数の積分を計算する

【C++】関数の積分を計算する

積分とは

積分は、関数の下の面積を求める数学的な操作です。定積分は以下のように表されます:

\[ I = \int_{a}^{b} f(x) \,dx \]

C++では、数値的な手法を用いてこの積分を計算することができます。代表的な方法として、台形則、シンプソン法、モンテカルロ法があります。

台形則

台形則は、関数を直線で近似し、台形の面積の総和として積分を求める方法です。


#include <iostream>
#include <cmath>

using namespace std;

double f(double x) {
    return sin(x);
}

double trapezoidal_rule(double a, double b, int n) {
    double h = (b - a) / n;
    double sum = 0.5 * (f(a) + f(b));
    for (int i = 1; i < n; i++) {
        sum += f(a + i * h);
    }
    return sum * h;
}

int main() {
    cout << "Integral: " << trapezoidal_rule(0, M_PI, 1000) << endl;
    return 0;
}
    

シンプソン法

シンプソン法は、関数を二次関数で近似してより精度の高い積分を求める方法です。


#include <iostream>
#include <cmath>

double f(double x) {
    return sin(x);
}

double simpson_rule(double a, double b, int n) {
    if (n % 2 == 1) n++;
    double h = (b - a) / n;
    double sum = f(a) + f(b);
    for (int i = 1; i < n; i += 2) {
        sum += 4 * f(a + i * h);
    }
    for (int i = 2; i < n - 1; i += 2) {
        sum += 2 * f(a + i * h);
    }
    return sum * h / 3.0;
}

int main() {
    std::cout << "Integral: " << simpson_rule(0, M_PI, 1000) << std::endl;
    return 0;
}
    

モンテカルロ法

モンテカルロ法は、ランダムサンプリングを利用して積分を近似する方法です。


#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>

double f(double x) {
    return sin(x);
}

double monte_carlo_integral(double a, double b, int n) {
    srand(time(0));
    double sum = 0.0;
    for (int i = 0; i < n; i++) {
        double x = a + (b - a) * rand() / RAND_MAX;
        sum += f(x);
    }
    return (b - a) * sum / n;
}

int main() {
    std::cout << "Integral: " << monte_carlo_integral(0, M_PI, 1000000) << std::endl;
    return 0;
}
    

まとめ

C++で関数の積分を計算する方法はいくつかあり、精度や計算速度を考慮して選ぶことが重要です。台形則とシンプソン法は比較的簡単に実装でき、モンテカルロ法は多次元積分にも応用可能です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です