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