定積分
「被積分関数、区間、分割する数」を引数もった、定積分を計算する関数integralを構成する。
コード例1.
#include <stdio.h> #include <math.h> double integral(double (*f)(double),double a,double b, int N); double g(double x); int main() { printf("%f\n",integral(g,0,1.0,1000) ); return 0; } double integral(double (*f)(double), double a,double b, int N){ double sum=0; int i; for(i=0;i < N;i++){ double x1 = a + (b-a)*i/N; double x2 = a + (b-a)*(i+1)/N; sum += (f(x1)+f(x2))*(b-a)/(2*N); } return sum; } double g(double x){ return sin(x)+x; }
実行結果. 0.959698
解説
integral(f,a,b,N)で計算したいものは
\[\int_a^b f(x) \, dx \]
の近似値であり「台形公式」を利用している。Nは台形公式において区間を分割する数で、この値が大きいほど精度が良いと期待できる。
実際の定積分はmain関数内で行うのであるが、外部関数のgを被積分関数として利用している。定義は次の通り。
\[g(x) = \sin(x) + x\]
main関数内のprintf("%f\n",integral(g,0,1.0,1000));において
\[\int_0^1 (\sin(x)+x)\, dx \]
の値を近似計算し表示している。
関数を引数にとるために「関数ポインタ」を利用しているが、typedefを使用して可読性を少し改善したのが次の例。
コード例2.(typedefを利用)
#include <stdio.h> #include <math.h> typedef double (*F)(double); double integral(F f,double a,double b,int N); double g(double x); int main() { printf("%f\n",integral(g,0,1.0,1000) ); return 0; } double integral(F f,double a,double b,int N){ double sum=0; int i; for(i=0; i < N;i++){ double x1 = a + (b-a)*i/N; double x2 = a + (b-a)*(i+1)/N; sum += (f(x1)+f(x2))*(b-a)/(2*N); } return sum; } double g(double x){ return sin(x)+x; }
実行結果. 0.959698