题目
编写程序,使用复合梯形数值求积公式 <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)