打印近似导数
在这一步中,我们将扩展我们的导数近似程序,以便将数值近似与解析导数进行比较,并以更具信息性的方式打印结果。
更新 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
值如何导致更精确的近似值