题目

编写程序,使用复合梯形数值求积公式 <code>trapz()</code> 计算定积分 $\int_0^\pi \sin(x) dx$(理论值为 2.0),观察不同网格密度下的积分精度收敛情况。

输入格式:无需外部输入。

输出格式:分别展示 5 个网格点与 100 个网格点下的数值积分结果及与真值 2.0 的相对误差。

数据范围与约定:数值求积。

思路与算法

1. trapz 函数原理
trapz(x, y) 将相邻采样点区间视作梯形求面积并累加:$I = \sum \frac{y_i + y_{i+1}}{2} (x_{i+1} - x_i)$。

2. 等距与非等距
trapz(x, y) 完美支持非等间距采样网格,比单纯累加更精确。

3. 收敛阶数
梯形公式具有二阶截断误差 $O(h^2)$,网格点翻倍,误差减小到四分之一。

完整程序

% Octave / MATLAB 第87题:梯形数值积分 trapz
% 1. 粗网格 (N=5 点)
x_coarse = linspace(0, pi, 5);
y_coarse = sin(x_coarse);
res_coarse = trapz(x_coarse, y_coarse);

% 2. 细网格 (N=100 点)
x_fine = linspace(0, pi, 100);
y_fine = sin(x_fine);
res_fine = trapz(x_fine, y_fine);

exact_val = 2.0;

fprintf("计算定积分: int_0^pi sin(x) dx (理论真值 = 2.000000)\n");
fprintf("粗网格 (5 点)   积分结果: %.6f (绝对误差: %.4f)\n", res_coarse, abs(res_coarse - exact_val));
fprintf("细网格 (100 点) 积分结果: %.6f (绝对误差: %.4f)\n", res_fine, abs(res_fine - exact_val));

运行示例

输出:

计算定积分: int_0^pi sin(x) dx (理论真值 = 2.000000)
粗网格 (5 点)   积分结果: 1.896119 (绝对误差: 0.1039)
细网格 (100 点) 积分结果: 1.999832 (绝对误差: 0.0002)