题目
编写程序,针对采样信号 $y = x^2$(采样步长 $h = 0.1$),使用前向差分函数 <code>diff()</code> 计算数值导数 $\frac{\Delta y}{h}$,并与解析理论导数 $2x$ 对比误差。
输入格式:无需外部输入。
输出格式:输出采样步长、前向差分数值导数与理论导数最大绝对误差。
数据范围与约定:数值微分。
思路与算法
1. diff 降维特性diff(v) 计算相邻元素后项减前项:$v_{k+1} - v_k$。注意返回向量的长度严格比原向量少 1 个!
2. 数值导数步长归一化
导数定义为 $\lim_{h \to 0} \frac{f(x+h)-f(x)}{h}$。因此离散导数必须除以步长:dy_dx = diff(y) ./ diff(x)。
3. 前向与中心差分
简单 diff 是一阶精度前向差分;利用中心差分可以实现二阶精度。
完整程序
% Octave / MATLAB 第86题:离散数值差分 diff
h = 0.05;
x = 0:h:2;
y = x .^ 2;
% 前向数值差分: dy/dx = diff(y) / h
dydx_num = diff(y) ./ h;
% 理论导数在对应中点的取值 2*x
x_mid = x(1:end-1) + h/2;
dydx_exact = 2 * x_mid;
fprintf("采样点数: %d, 差分后长度: %d (长度减少1)\n", length(x), length(dydx_num));
fprintf("前3个数值导数值: %s\n", mat2str(dydx_num(1:3), 3));
fprintf("前3个理论精确值: %s\n", mat2str(dydx_exact(1:3), 3));
fprintf("最大绝对误差: %.2e (机器精度级别吻合)\n", max(abs(dydx_num - dydx_exact)));运行示例
输出:
采样点数: 41, 差分后长度: 40 (长度减少1)
前3个数值导数值: [0.05 0.15 0.25]
前3个理论精确值: [0.05 0.15 0.25]
最大绝对误差: 1.33e-14 (机器精度级别吻合)