【C言語】定積分の計算

【C言語】定積分の計算

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

定積分とは

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

I=abf(x)dx

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

台形則による数値積分

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

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

Ii=1Nf(xi)+f(xi+1)2Δ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Δx3i=0N/2[f(x2i)+4f(x2i+1)+f(x2i+2)]

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(ba)1Ni=1Nf(xi)

以下に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言語を用いた定積分の計算には様々な手法があり、用途に応じて適切なものを選択することが重要です。

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