定積分

「被積分関数、区間、分割する数」を引数もった、定積分を計算する関数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