【C言語】積分するプログラムの書き方

この記事では、C言語で数値積分を行う方法について解説します。

台形則、シンプソン則、モンテカルロ法の3つの数値積分の手法を紹介し、それぞれの手法を使ったプログラムの作成方法を説明します。

目次から探す

数値積分の方法

数値積分は、数学的な関数の積分を近似的に求める手法です。

代表的な数値積分の方法として、台形則、シンプソン則、モンテカルロ法があります。

台形則

台形則は、積分区間を台形の面積として近似する方法です。

積分区間を複数の小区間に分割し、各小区間の面積を計算して足し合わせることで、全体の面積を求めます。

シンプソン則

シンプソン則は、積分区間を曲線の近似的な2次関数で表現する方法です。

積分区間を複数の小区間に分割し、各小区間の2次関数の面積を計算して足し合わせることで、全体の面積を求めます。

モンテカルロ法

モンテカルロ法は、乱数を用いて積分を近似する方法です。

乱数を生成し、その乱数に基づいて関数の値を求め、それらの平均値を用いて積分を求めます。

乱数の生成による近似のため、結果は確率的な性質を持ちますが、大量の乱数を用いることで精度を向上させることができます。

C言語での積分プログラムの作成

C言語を用いて数値積分を行うプログラムを作成することができます。

以下では、台形則、シンプソン則、モンテカルロ法を用いたプログラムの作成方法について説明します。

台形則を用いたプログラム

台形則を用いた積分プログラムでは、積分区間を分割し、各小区間の面積を計算して足し合わせることで積分を求めます。

以下に、C言語での台形則を用いた積分プログラムの例を示します。

#include <stdio.h>
double f(double x) {
    // 積分したい関数の定義
    return x * x;
}
double trapezoidal_rule(double a, double b, int n) {
    double h = (b - a) / n; // 小区間の幅
    double sum = 0.0;
    for (int i = 0; i <= n; i++) {
        double x = a + i * h;
        if (i == 0 || i == n) {
            sum += f(x) / 2.0;
        } else {
            sum += f(x);
        }
    }
    return sum * h;
}
int main() {
    double a = 0.0; // 積分区間の下限
    double b = 1.0; // 積分区間の上限
    int n = 100; // 分割数
    double result = trapezoidal_rule(a, b, n);
    printf("積分結果: %f\n", result);
    return 0;
}

上記のプログラムでは、f関数に積分したい関数を定義し、trapezoidal_rule関数で台形則を実装しています。

main関数では、積分区間の下限a、上限b、分割数nを指定し、trapezoidal_rule関数を呼び出して積分結果を求めています。

シンプソン則を用いたプログラム

シンプソン則を用いた積分プログラムでは、積分区間を分割し、各小区間の2次関数の面積を計算して足し合わせることで積分を求めます。

以下に、C言語でのシンプソン則を用いた積分プログラムの例を示します。

#include <stdio.h>
double f(double x) {
    // 積分したい関数の定義
    return x * x;
}
double simpson_rule(double a, double b, int n) {
    double h = (b - a) / n; // 小区間の幅
    double sum = f(a) + f(b);
    for (int i = 1; i < n; i++) {
        double x = a + i * h;
        if (i % 2 == 0) {
            sum += 2 * f(x);
        } else {
            sum += 4 * f(x);
        }
    }
    return sum * h / 3.0;
}
int main() {
    double a = 0.0; // 積分区間の下限
    double b = 1.0; // 積分区間の上限
    int n = 100; // 分割数
    double result = simpson_rule(a, b, n);
    printf("積分結果: %f\n", result);
    return 0;
}

上記のプログラムでは、f関数に積分したい関数を定義し、simpson_rule関数でシンプソン則を実装しています。

main関数では、積分区間の下限a、上限b、分割数nを指定し、simpson_rule関数を呼び出して積分結果を求めています。

モンテカルロ法を用いたプログラム

モンテカルロ法を用いた積分プログラムでは、乱数を生成し、その乱数に基づいて関数の値を求め、それらの平均値を用いて積分を求めます。

以下に、C言語でのモンテカルロ法を用いた積分プログラムの例を示します。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
double f(double x) {
    // 積分したい関数の定義
    return x * x;
}
double monte_carlo_integration(double a, double b, int n) {
    double sum = 0.0;
    double width = b - a;
    srand(time(NULL)); // 乱数の初期化
    for (int i = 0; i < n; i++) {
        double x = a + (double)rand() / RAND_MAX * width;
        sum += f(x);
    }
    return sum * width / n;
}
int main() {
    double a = 0.0; // 積分区間の下限
    double b = 1.0; // 積分区間の上限
    int n = 1000000; // 乱数の生成回数
    double result = monte_carlo_integration(a, b, n);
    printf("積分結果: %f\n", result);
    return 0;
}

上記のプログラムでは、f関数に積分したい関数を定義し、monte_carlo_integration関数でモンテカルロ法を実装しています。

main関数では、積分区間の下限a、上限b、乱数の生成回数nを指定し、monte_carlo_integration関数を呼び出して積分結果を求めています。

以上が、C言語での積分プログラムの作成方法についての説明です。

それぞれの方法の特徴や精度の違いを理解し、適切な方法を選択してプログラムを作成してください。

目次から探す