C 言語で台形公式を用いた積分の近似計算

CBeginner
オンラインで実践に進む

はじめに

この実験では、C 言語を用いて台形公式を用いて積分を近似する方法を学びます。この実験は、以下の手順で構成されています:1) 関数 f(x) と区間 [a, b] を定義する、2) 区間を分割し、台形公式を用いて近似積分を計算する、3) 最終結果を出力する。この実験は、C プログラミング言語を用いた数値積分技術の実用的な理解を提供することを目的としています。

f(x) と区間 [a, b] の定義

このステップでは、C 言語を用いて台形公式による数値積分を行うために、数学関数 f(x) と区間 [a, b] を定義します。

まず、積分近似を実装するための新しい C ソースファイルを作成しましょう。

cd ~/project
nano integral_approximation.c

次に、関数と区間を定義する初期コードを記述します。

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

// 積分対象の関数 f(x) を定義
double f(double x) {
    // 例:f(x) = x^2
    return x * x;
}

int main() {
    // 区間 [a, b] を定義
    double a = 0.0;  // 下限
    double b = 1.0;  // 上限

    printf("積分近似\n");
    printf("関数:f(x) = x^2\n");
    printf("区間:[%.2f, %.2f]\n", a, b);

    return 0;
}

コンパイルして実行し、確認してみましょう。

gcc -o integral_approximation integral_approximation.c -lm
./integral_approximation

出力例:

積分近似
関数: f(x) = x^2
区間: [0.00, 1.00]

このコードでは、以下の内容を定義しています。

  • x^2 を返す関数 f(x)
  • 0 から 1 までの区間 [a, b]
  • 関数と区間の詳細を出力

f(x) 関数は、積分したい任意の数学関数に変更できます。

区間分割と台形公式の適用

このステップでは、区間を分割し、近似積分を計算することで、数値積分のための台形公式を実装するために、以前のコードを修正します。

以前のソースファイルを開き、コードを更新します。

cd ~/project
nano integral_approximation.c

以下の実装で内容を置き換えます。

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

// 積分対象の関数 f(x) を定義
double f(double x) {
    return x * x;
}

// 台形公式の実装
double trapezoidalRule(double a, double b, int n) {
    double h = (b - a) / n;  // 各台形の幅
    double sum = 0.5 * (f(a) + f(b));  // 最初と最後の点

    for (int i = 1; i < n; i++) {
        double x = a + i * h;
        sum += f(x);
    }

    return sum * h;
}

int main() {
    // 区間 [a, b] を定義
    double a = 0.0;  // 下限
    double b = 1.0;  // 上限
    int n = 100;     // 台形の個数

    double approximateIntegral = trapezoidalRule(a, b, n);

    printf("積分近似\n");
    printf("関数:f(x) = x^2\n");
    printf("区間:[%.2f, %.2f]\n", a, b);
    printf("台形の個数:%d\n", n);
    printf("近似積分:%.6f\n", approximateIntegral);

    return 0;
}

更新したコードをコンパイルして実行します。

gcc -o integral_approximation integral_approximation.c -lm
./integral_approximation

出力例:

積分近似
関数: f(x) = x^2
区間: [0.00, 1.00]
台形の個数: 100
近似積分: 0.333333

この実装における重要な点は以下のとおりです。

  • trapezoidalRule() 関数は近似積分を計算します
  • h は各台形の幅を表します
  • n は近似に使用する台形の個数を決定します
  • n を増やすことで、近似精度は向上します

近似積分の表示

このステップでは、より詳細な出力を追加し、数値結果を正確な積分値と比較することで、積分近似プログラムを強化します。

以前のソースファイルを開き、コードを更新します。

cd ~/project
nano integral_approximation.c

より包括的な出力を含めるようにコードを修正します。

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

// 積分対象の関数 f(x) を定義
double f(double x) {
    return x * x;
}

// x^2 の 0 から 1 までの正確な積分計算
double exactIntegral() {
    return 1.0 / 3.0;
}

// 台形公式の実装
double trapezoidalRule(double a, double b, int n) {
    double h = (b - a) / n;  // 各台形の幅
    double sum = 0.5 * (f(a) + f(b));  // 最初と最後の点

    for (int i = 1; i < n; i++) {
        double x = a + i * h;
        sum += f(x);
    }

    return sum * h;
}

int main() {
    // 区間 [a, b] を定義
    double a = 0.0;  // 下限
    double b = 1.0;  // 上限
    int n = 100;     // 台形の個数

    double approximateIntegral = trapezoidalRule(a, b, n);
    double exact = exactIntegral();
    double error = fabs(approximateIntegral - exact);
    double percentError = (error / exact) * 100.0;

    // 詳細な情報を含むフォーマットされた出力
    printf("積分近似結果\n");
    printf("------------------------------\n");
    printf("関数:f(x) = x^2\n");
    printf("区間:           [%.2f, %.2f]\n", a, b);
    printf("台形の個数:%d\n", n);
    printf("\n数値結果:\n");
    printf("近似積分:%.6f\n", approximateIntegral);
    printf("正確な積分:%.6f\n", exact);
    printf("\n誤差分析:\n");
    printf("絶対誤差:      %.6f\n", error);
    printf("相対誤差:       %.4f%%\n", percentError);

    return 0;
}

更新したコードをコンパイルして実行します。

gcc -o integral_approximation integral_approximation.c -lm
./integral_approximation

出力例:

積分近似結果
------------------------------
関数:            f(x) = x^2
区間:            [0.00, 1.00]
台形の個数: 100

数値結果:
近似積分: 0.333333
正確な積分: 0.333333

誤差分析:
絶対誤差:       0.000000
相対誤差:        0.0000%

このバージョンの主な改善点は以下のとおりです。

  • 数値結果を比較するために exactIntegral() 関数を追加
  • 絶対誤差と相対誤差を計算
  • より詳細でフォーマットされた出力を提供

まとめ

この実験では、C 言語を用いて台形公式を用いた積分の近似計算方法を学びました。最初に、数値積分を行うための数学関数 f(x) と区間 [a, b] を定義しました。次に、区間を分割し、台形公式を適用して近似積分を計算することで、台形公式を実装しました。最後に、積分近似の結果を出力しました。

この実験で重要なステップは、関数と区間を定義すること、区間を分割すること、そして台形公式を適用して近似積分を計算することでした。これらのステップに従うことで、C 言語でシンプルな効果的な数値積分手法を実装することができました。