C 言語で点における導関数の近似

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

はじめに

この実験では、C プログラミング言語を使用して、特定の点における関数の導関数を近似する方法を学びます。まず、単純な 2 次関数 (quadratic function) を定義し、小さな値 h を使用して差分法により数値的な導関数 (numerical derivative) を計算します。最後に、近似的な導関数を出力します。この実験は、微積分および解析幾何学における基本的な概念である導関数近似の実際的な理解を提供することを目的としています。

関数 f(x) の定義

このステップでは、導関数の近似を示すために、C プログラミングで数学関数 f(x) を定義します。概念を分かりやすくするために、単純な 2 次関数を使用します。

まず、~/project ディレクトリに新しい C ファイルを作成します。

cd ~/project
nano derivative_approximation.c

次に、関数の初期コードを記述します。

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

// 2 次関数 f(x) = x^2 + 2x + 1 を定義
double f(double x) {
    return x * x + 2 * x + 1;
}

int main() {
    double x = 2.0;  // 導関数を近似する点
    printf("関数 f(x) = x^2 + 2x + 1\n");
    printf("x = %.2f で評価:f(x) = %.2f\n", x, f(x));

    return 0;
}

コードをコンパイルして実行し、関数の動作を確認します。

gcc derivative_approximation.c -o derivative_approximation -lm
./derivative_approximation

出力例:

関数 f(x) = x^2 + 2x + 1
x = 2.00 で評価: f(x) = 9.00
コードの説明
  • 2 次関数 f(x) = x^2 + 2x + 1 を定義しています。
  • 関数は double 型の入力 x を受け取り、double 型の結果を返します。
  • main() 関数では、x = 2 で関数を評価しています。
  • printf() を使用して、関数とその値を表示しています。

小さな h を用いて (f(x+h)-f(x))/h を計算する

このステップでは、差分法を用いて導関数を近似するために、前のコードを修正します。小さな値 h を使用して数値的な導関数を求めます。

derivative_approximation.c ファイルを更新します。

nano ~/project/derivative_approximation.c

前の main() 関数を以下のコードに置き換えます。

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

// 2 次関数 f(x) = x^2 + 2x + 1
double f(double x) {
    return x * x + 2 * x + 1;
}

// 差分法を用いた導関数の近似
double approximate_derivative(double x, double h) {
    return (f(x + h) - f(x)) / h;
}

int main() {
    double x = 2.0;  // 導関数を近似する点
    double h = 0.0001;  // 差分法のための小さな値

    double approx_derivative = approximate_derivative(x, h);

    printf("関数:f(x) = x^2 + 2x + 1\n");
    printf("x = %.2f での導関数の近似\n", x);
    printf("ステップサイズ h = %.6f\n", h);
    printf("近似的な導関数:%.4f\n", approx_derivative);

    return 0;
}

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

gcc derivative_approximation.c -o derivative_approximation -lm
./derivative_approximation

出力例:

関数: f(x) = x^2 + 2x + 1
x = 2.00 での導関数の近似
ステップサイズ h = 0.000100
近似的な導関数: 5.0001
コードの説明
  • 差分法を用いて導関数を求める新しい関数 approximate_derivative() を導入しています。
  • h は、瞬間的な変化率を近似するのに役立つ小さな値 (0.0001) です。
  • (f(x+h) - f(x)) / h は、点 x における導関数を近似しています。
  • 近似された導関数の値を出力しています。

近似導関数の出力

このステップでは、数値的な近似導関数と解析的な導関数を比較し、より情報的な方法で結果を出力するように、導関数近似プログラムを拡張します。

derivative_approximation.c ファイルを更新します。

nano ~/project/derivative_approximation.c

前のコードを以下のコードに置き換えます。

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

// 2 次関数 f(x) = x^2 + 2x + 1
double f(double x) {
    return x * x + 2 * x + 1;
}

// f(x) の解析的導関数
double analytical_derivative(double x) {
    return 2 * x + 2;
}

// 差分法を用いた導関数の近似
double approximate_derivative(double x, double h) {
    return (f(x + h) - f(x)) / h;
}

int main() {
    double x = 2.0;  // 導関数を近似する点
    double h_values[] = {1e-1, 1e-2, 1e-3, 1e-4, 1e-5};
    int num_h = sizeof(h_values) / sizeof(h_values[0]);

    double true_derivative = analytical_derivative(x);

    printf("関数:f(x) = x^2 + 2x + 1\n");
    printf("導関数点:x = %.2f\n", x);
    printf("解析的導関数:%.4f\n\n", true_derivative);

    printf("導関数近似結果:\n");
    printf("-----------------------------------\n");
    printf("ステップサイズ (h)   近似導関数   誤差\n");
    printf("-----------------------------------\n");

    for (int i = 0; i < num_h; i++) {
        double h = h_values[i];
        double approx_derivative = approximate_derivative(x, h);
        double error = fabs(true_derivative - approx_derivative);

        printf("%.1e             %.4f               %.6f\n",
               h, approx_derivative, error);
    }

    return 0;
}

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

gcc derivative_approximation.c -o derivative_approximation -lm
./derivative_approximation

出力例:

関数: f(x) = x^2 + 2x + 1
導関数点: x = 2.00
解析的導関数: 6.0000

導関数近似結果:
-----------------------------------
ステップサイズ (h)   近似導関数   誤差
-----------------------------------
1.0e-01             6.2000               0.200000
1.0e-02             6.0200               0.020000
1.0e-03             6.0020               0.002000
1.0e-04             6.0002               0.000200
1.0e-05             6.0000               0.000020
コードの説明
  • 真の導関数を求める analytical_derivative() 関数を追加しました。
  • 収束を示すために、さまざまなステップサイズ h の配列を作成しました。
  • ループを使用して、さまざまなステップサイズでの近似値を出力しました。
  • 解析的導関数と数値的導関数の誤差を計算して表示しました。
  • より小さな h の値がより正確な近似につながることを示しています。

まとめ

この実験では、最初に C プログラミングで 2 次関数 f(x) = x^2 + 2x + 1 を定義しました。次に、差分法 (f(x+h)-f(x))/h を用いて、関数の導関数を近似するために小さな値 h を導入しました。最後に、近似的な導関数の値を出力しました。