数値計算
C言語
stmtkDay 2

C言語で学ぶ台形公式による積分の近似

台形公式とは

下の絵の青い線がが積分したい関数のグラフ、aからbまでを積分したい範囲(左の茶色の線から右茶色の線)だと思ってください。台形公式とは緑と黄色の部分の面積を積分した値だと考えることです。その値は

 \frac{(f(a) + f(b)) (b - a)}{2} 

になりますね
68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3130383731362f66613335663735312d356335352d663361642d313138322d6632366236306266373732332e706e67.png

しかし、図で見て分かる通り緑の部分が明らかに余計です。なので、$ a $と$ b $の間に$ c = \frac{a + b}{2} $という点を設けましょう。緑色と黄色の部分の面積の合計は

\frac{(f(a) + f(c)) (c - a) + (f(c) + f(b)) (b - c)}{ 2 }

になりますね。するとついさっきの図より緑色の部分が減っているのがわかります。これが台形公式です。$ a $と$ b $の間に点があればあるほど、その値は正確になります。
68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3130383731362f33303762303434352d636133352d306663622d386137362d3030663866383337303136392e706e67.png! Untitled.png

ソースコード

integral.c
#include <stdio.h>
#include <math.h>

#define EPS (1.0e-6)
#define f(x) ((x)*(x))

int main(){
    double a = 0, b = 2, sum = 0;
    for(double x = a; x < b; x += EPS){
        sum += (f(x) + f(x+EPS));
    }
    sum *= (EPS / 2);

    printf("%f\n", sum);
}