積分プログラム(台形積分)[C言語]
29/09/2023 15/10/2023
今回はプログラミングで最も基本的な積分方法である、台形積分の精度を評価してみます。
台形積分はまず、下図のように曲線を細かいdxで区切って、f(x)の値を算出します。
f(x)とf(x+dx)を台形の上底と下底とみなし、台形の面積を計算し、分割した領域を足し合わせていきます。

式で書くと、以下の通りです。
\[
S = \sum_{i=0}^{N} dx(f(x_{i}) + f(x_{i}+dx))/2
\]
台形積分は見てわかるように、曲線のカーブを直線で近似しているため、
分割数が荒いと、積分の数値計算精度が悪くなってしまいます。
C言語で行う場合のソースコードを以下に示します。
#include <stdio.h> #include <math.h> double fx1(double x1); double INT_TRAP(double (*fun1)(double x),double xi,double xe,int mesh); int main(void){ double x,xi,xe; int mesh; xi = 0.f; xe = 1.f; mesh = 10; printf("Integral Result=%lf ,mesh = %d\n",INT_TRAP(fx1,xi,xe,mesh),mesh); mesh = 100; printf("Integral Result=%lf ,mesh = %d\n",INT_TRAP(fx1,xi,xe,mesh),mesh); mesh = 1000; printf("Integral Result=%lf ,mesh = %d\n",INT_TRAP(fx1,xi,xe,mesh),mesh); mesh = 10000; printf("Integral Result=%lf ,mesh = %d\n",INT_TRAP(fx1,xi,xe,mesh),mesh); mesh = 100000; printf("Integral Result=%lf ,mesh = %d\n",INT_TRAP(fx1,xi,xe,mesh),mesh); mesh = 1000000; printf("Integral Result=%lf ,mesh = %d\n",INT_TRAP(fx1,xi,xe,mesh),mesh); return 0; } double fx1(double x1){ double fx1; fx1 = x1*x1; return fx1; } double INT_TRAP(double (*fun1)(double x1),double xi,double xe,int mesh){ double INT_TRAP; double dx; double S0; double pos; int id; S0 = 0.f; pos = xi; dx = (xe-xi)/(double)mesh; for (id = 1; id<= mesh-1;id= id + 1){ S0 = S0 + 0.5f*dx*(fun1(pos)+fun1(pos+dx)); pos = pos + dx; } INT_TRAP = S0; return INT_TRAP; }
計算結果を見てみます。結果はお分かりの通り、0.333333・・・が答えです。

分割数を大きくすると、結構使えそうな精度が出てきましたが、分割数が多いということは、
処理数も大きいため、処理時間を短縮しないのであれば、使えそうな気がします。
by さくらえび
関連記事:
<積分関連>
・積分プログラム(台形積分) [fortran] — 思い立ったら作ってみる (y-fam.com)
・積分プログラム(台形積分) — 思い立ったら作ってみる (y-fam.com)