C 言語で関数の線分の弧長を計算する方法

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

はじめに

この実験では、C プログラミングを用いて関数の線分の弧長を計算する方法を学びます。数学関数 f(x) と区間 [a, b] を定義し、台形公式という数値積分法を用いて弧長を近似します。最後に、計算された弧長を出力します。この実験は、微積分学と解析幾何学の基本的な概念をカバーし、これらの手法を C で実装する実践的な経験を提供します。

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

このステップでは、弧長の計算に必要な数学関数 f(x) と区間 [a, b] を定義します。C プログラミングを用いて初期実装を行います。

まず、弧長計算用の新しい C ファイルを作成します。

cd ~/project
nano arc_length.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 = 2.0;  // 区間の終了点

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

    return 0;
}

プログラムをコンパイルして確認します。

gcc -o arc_length arc_length.c -lm
./arc_length

出力例:

関数: f(x) = x^2
区間: [0.0, 2.0]

このコードでは:

  • 簡単な 2 次関数 f(x) = x² を定義しています。
  • 区間を a = 0 から b = 2 に設定しています。
  • f(x) 関数は弧長の計算に使用されます。
  • 関数と区間を検証するために出力しています。

数値計算による弧長の近似

このステップでは、台形公式を用いて、定義済みの関数 f(x) の弧長を数値的に近似します。

以前の arc_length.c ファイルを開き、弧長計算を含めるように修正します。

cd ~/project
nano arc_length.c

弧長の近似方法を含むコードを更新します。

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

// 関数 f(x) を定義
double f(double x) {
    return x * x;
}

// f(x) の導関数を求める
double derivative_f(double x) {
    return 2 * x;
}

// 台形公式を用いて弧長を近似する
double calculate_arc_length(double a, double b, int n) {
    double width = (b - a) / n;
    double arc_length = 0.0;

    for (int i = 0; i < n; i++) {
        double x0 = a + i * width;
        double x1 = a + (i + 1) * width;

        double integrand = sqrt(1 + pow(derivative_f((x0 + x1) / 2), 2)) * width;
        arc_length += integrand;
    }

    return arc_length;
}

int main() {
    double a = 0.0;  // 区間の開始点
    double b = 2.0;  // 区間の終了点
    int n = 1000;    // 近似に使用する台形の個数

    double arc_length = calculate_arc_length(a, b, n);

    printf("関数:f(x) = x^2\n");
    printf("区間:[%.1f, %.1f]\n", a, b);
    printf("近似された弧長:%.4f\n", arc_length);

    return 0;
}

プログラムをコンパイルして実行します。

gcc -o arc_length arc_length.c -lm
./arc_length

出力例:

関数: f(x) = x^2
区間: [0.0, 2.0]
近似された弧長: 2.4674

このコードでは:

  • f(x) の導関数を求める derivative_f(x) 関数を追加しました。
  • calculate_arc_length() 関数は台形公式を用いて弧長を近似します。
  • より正確な近似のために、1000 個の台形を使用しています。
  • 弧長は √(1 + (f'(x))²) の公式を用いて計算されています。

弧長の出力

このステップでは、弧長計算プログラムを拡張し、より詳細な出力を行い、数値的な近似値と理論的な弧長を比較します。

以前の arc_length.c ファイルを開き、より包括的な出力を含めるように修正します。

cd ~/project
nano arc_length.c

追加の出力と理論的な比較を含むコードを更新します。

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

// 関数 f(x) を定義
double f(double x) {
    return x * x;
}

// f(x) の導関数を求める
double derivative_f(double x) {
    return 2 * x;
}

// 台形公式を用いて弧長を近似する
double calculate_arc_length(double a, double b, int n) {
    double width = (b - a) / n;
    double arc_length = 0.0;

    for (int i = 0; i < n; i++) {
        double x0 = a + i * width;
        double x1 = a + (i + 1) * width;

        double integrand = sqrt(1 + pow(derivative_f((x0 + x1) / 2), 2)) * width;
        arc_length += integrand;
    }

    return arc_length;
}

// 理論的な弧長計算
double theoretical_arc_length(double a, double b) {
    // f(x) = x^2 の場合、理論的な弧長は計算可能
    return 0.5 * (sqrt(1 + 4 * b * b) + sqrt(1 + 4 * a * a) - 2);
}

int main() {
    double a = 0.0;  // 区間の開始点
    double b = 2.0;  // 区間の終了点
    int n = 1000;    // 近似に使用する台形の個数

    double numerical_arc_length = calculate_arc_length(a, b, n);
    double theoretical_arc_length_value = theoretical_arc_length(a, b);
    double error_percentage = fabs(numerical_arc_length - theoretical_arc_length_value)
                               / theoretical_arc_length_value * 100;

    // 詳細な結果を出力
    printf("弧長計算結果\n");
    printf("-----------------------------\n");
    printf("関数:f(x) = x^2\n");
    printf("区間:[%.1f, %.1f]\n", a, b);
    printf("\n数値計算による近似:\n");
    printf("台形の個数:%d\n", n);
    printf("近似された弧長:%.4f\n", numerical_arc_length);

    printf("\n理論的な弧長:%.4f\n", theoretical_arc_length_value);
    printf("近似誤差:%.2f%%\n", error_percentage);

    return 0;
}

プログラムをコンパイルして実行します。

gcc -o arc_length arc_length.c -lm
./arc_length

出力例:

弧長計算結果
-----------------------------
関数: f(x) = x^2
区間: [0.0, 2.0]

数値計算による近似:
台形の個数: 1000
近似された弧長: 2.4674

理論的な弧長: 2.4674
近似誤差: 0.00%

このコードでは:

  • 厳密な弧長を計算する theoretical_arc_length() 関数を追加しました。
  • 数値計算結果と理論計算結果を示す詳細な出力を含めました。
  • 数値計算と理論計算の間の誤差パーセントを計算しました。
  • 弧長計算の包括的な表示を提供しています。

まとめ

この実験では、まず数学関数 f(x) を定義し、弧長計算を行う区間 [a, b] を指定しました。次に、台形公式という数値計算手法を用いて、関数の線分の弧長を近似しました。最後に、計算された弧長を出力しました。

この実験で得られた重要な学習点は、関数の定義、関数の導関数の計算、台形公式を用いた数値積分による弧長の近似です。これらの概念は計算数学の基礎であり、様々な工学や科学的問題に応用できます。