在 C 语言中近似某点的导数

CCBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,我们将学习如何使用C编程语言在特定点近似函数的导数。我们将首先定义一个简单的二次函数,然后使用一个小值 h 通过差分法计算数值导数。最后,我们将打印近似导数。本实验旨在提供对导数近似的实际理解,这是微积分和解析几何中的一个基本概念。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/BasicsGroup(["Basics"]) c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/BasicsGroup -.-> c/variables("Variables") c/BasicsGroup -.-> c/operators("Operators") c/FunctionsGroup -.-> c/math_functions("Math Functions") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/variables -.-> lab-435130{{"在 C 语言中近似某点的导数"}} c/operators -.-> lab-435130{{"在 C 语言中近似某点的导数"}} c/math_functions -.-> lab-435130{{"在 C 语言中近似某点的导数"}} c/output -.-> lab-435130{{"在 C 语言中近似某点的导数"}} end

定义函数 f(x)

在这一步中,我们将在C编程中定义一个数学函数 f(x),用于演示导数近似。我们将创建一个简单的二次函数来说明这个概念。

首先,让我们在 ~/project 目录中创建一个新的C文件:

cd ~/project
nano derivative_approximation.c

现在,让我们编写函数的初始代码:

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

// 定义二次函数 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
代码解释
  • 我们定义了一个二次函数 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>

// 二次函数 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>

// 二次函数 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.200000               0.200000
1.0e-02             6.020000               0.020000
1.0e-03             6.002000               0.002000
1.0e-04             6.000200               0.000200
1.0e-05             6.000020               0.000020
代码解释
  • 添加了 analytical_derivative() 函数来计算真实导数
  • 创建了一个不同步长 h 的数组来演示收敛性
  • 使用循环打印不同步长的近似值
  • 计算并显示解析导数和数值导数之间的误差
  • 展示了较小的 h 值如何导致更精确的近似值

总结

在本实验中,我们首先在C编程中定义了一个二次函数 f(x) = x^2 + 2x + 1。然后,我们引入了一个小值 h,使用差分法 (f(x+h)-f(x))/h 来近似该函数的导数。最后,我们打印了近似导数的值。