【C言語】定積分の計算

【C言語】定積分の計算

このページでは、C言語を用いた定積分の数値計算について解説します。

定積分とは

定積分とは、関数 \( f(x) \) を区間 \([a, b]\) で積分する操作のことを指します。数学的には次のように表されます。

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

解析的に求められる場合もありますが、多くの関数では解析解を求めることが困難なため、数値的な方法を用いることが一般的です。

台形則による数値積分

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

基本的な考え方は次のようになります:

\[ I \approx \sum_{i=1}^{N} \frac{f(x_i) + f(x_{i+1})}{2} \Delta x \]

C言語による実装例を示します。


#include <stdio.h>
#include <math.h>

// 被積分関数
double func(double x) {
    return x * x;
}

// 台形則による数値積分
double trapezoidal_rule(double a, double b, int n) {
    double h = (b - a) / n;
    double sum = (func(a) + func(b)) / 2.0;
    
    for (int i = 1; i < n; i++) {
        sum += func(a + i * h);
    }
    
    return sum * h;
}

int main() {
    double a = 0.0, b = 1.0;
    int n = 100;
    printf("積分値: %lf\n", trapezoidal_rule(a, b, n));
    return 0;
}

シンプソン則による数値積分

シンプソン則は、関数を二次関数で近似することで積分を求める方法です。

数式で表すと次のようになります:

\[ I \approx \frac{\Delta x}{3} \sum_{i=0}^{N/2} \left[ f(x_{2i}) + 4f(x_{2i+1}) + f(x_{2i+2}) \right] \]

C言語での実装例は以下の通りです。


#include <stdio.h>
#include <math.h>

// 被積分関数
double func(double x) {
    return sin(x);
}

// シンプソン則による数値積分
double simpsons_rule(double a, double b, int n) {
    if (n % 2 != 0) n++; // nが偶数であることを保証
    double h = (b - a) / n;
    double sum = func(a) + func(b);

    for (int i = 1; i < n; i += 2) {
        sum += 4 * func(a + i * h);
    }
    
    for (int i = 2; i < n-1; i += 2) {
        sum += 2 * func(a + i * h);
    }
    
    return sum * h / 3.0;
}

int main() {
    double a = 0.0, b = M_PI;
    int n = 100;
    printf("積分値: %lf\n", simpsons_rule(a, b, n));
    return 0;
}

モンテカルロ法による数値積分

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

基本的な考え方は次の通りです:

\[ I \approx (b – a) \frac{1}{N} \sum_{i=1}^{N} f(x_i) \]

以下にC言語での実装例を示します。


#include <stdio.h>
#include <stdlib.h>
#include <math.h>

// 被積分関数
double func(double x) {
    return exp(-x * x);
}

// モンテカルロ法による積分
double monte_carlo(double a, double b, int n) {
    double sum = 0.0;
    
    for (int i = 0; i < n; i++) {
        double x = a + (b - a) * rand() / RAND_MAX;
        sum += func(x);
    }
    
    return (b - a) * sum / n;
}

int main() {
    double a = 0.0, b = 1.0;
    int n = 10000;
    printf("積分値: %lf\n", monte_carlo(a, b, n));
    return 0;
}

実践的な計算例

ここでは、上記の3つの方法を用いて同じ関数の積分を求め、比較します。

  • 台形則: 二次関数の積分
  • シンプソン則: 三角関数の積分
  • モンテカルロ法: 指数関数の積分

一般的に、シンプソン則が最も精度が高く、モンテカルロ法は多次元積分に適しています。

このように、C言語を用いた定積分の計算には様々な手法があり、用途に応じて適切なものを選択することが重要です。

コメントは受け付けていません。