### 数值逼近课程设计——Runge现象分析
#### 一、Runge现象简介
在数值分析领域,Runge现象是一个非常重要的概念,特别是在讨论多项式插值的过程中。它揭示了在进行多项式插值时可能出现的一些问题,尤其是当插值节点增加到一定程度时,插值多项式的误差可能会在某些区间内变得异常大。
#### 二、Runge函数及实验背景
**Runge函数**定义为\( f(x) = \frac{1}{1 + 25x^2} \),定义域为\([-1, 1]\)。该函数的特点是在\([-1, 1]\)区间内的中心处平缓,两端陡峭。通过观察不同数量节点下的多项式插值结果,可以直观地发现Runge现象的存在。
#### 三、实验目的
本实验旨在通过编程实现Runge函数的不同节点数的多项式插值,并通过绘制插值函数与原始函数的图像对比,直观地展示Runge现象。具体目标包括:
1. **理解Runge现象**: 通过实验加深对Runge现象的理解。
2. **编程实现**: 使用MATLAB编写程序,实现不同节点数的多项式插值。
3. **数据分析**: 分析不同节点数下插值结果的变化趋势,探讨其背后的原因。
#### 四、程序设计与实现
本实验使用MATLAB语言实现。主要分为两个部分:`lagrange.m`用于实现拉格朗日插值方法,`runge.m`则用于调用`lagrange.m`并展示插值结果。
**1. `lagrange.m`: 拉格朗日插值**
```matlab
function y = lagrange(x0, y0, x)
ii = 1:length(x0);
y = zeros(size(x));
for i = ii
ij = find(ii ~= i);
y1 = 1;
for j = 1:length(ij)
y1 = y1 * (x - x0(ij(j)));
end
y = y + y1 * y0(i) / prod(x0(i) - x0(ij));
end
end
```
**2. `runge.m`: 插值与绘图**
```matlab
function runge(m1, m2, m3)
x1 = -1 + 2 * [0:m1] / m1;
y1 = 1 ./ (1 + 25 * x1.^2);
% 对于不同的节点数m1, m2, m3进行插值
x = -1:0.01:1;
y4 = lagrange(x1, y1, x);
x2 = -1 + 2 * [0:m2] / m2;
y2 = 1 ./ (1 + 25 * x2.^2);
y5 = lagrange(x2, y2, x);
x3 = -1 + 2 * [0:m3] / m3;
y3 = 1 ./ (1 + 25 * x3.^2);
y6 = lagrange(x3, y3, x);
% 原始函数
y = 1 ./ (1 + 25 * x.^2);
% 绘制图像
plot(x, y, 'k-', x, y4, 'r--', x, y5, 'b-.', x, y6, 'm:');
legend('原函数', 'n=4', 'n=8', 'n=12');
end
```
#### 五、运行结果分析
**1. 运行过程**:通过调用`runge(4, 8, 12)`命令,可以看到不同节点数下的多项式插值结果。
**2. 结果分析**:
- **节点数的影响**:随着节点数的增加,插值多项式在端点附近的振荡加剧,导致误差变大。例如,在\(x=0.96\)处,插值多项式的值远大于原函数的值,这正是Runge现象的一个典型表现。
- **插值效果**:在\(x=0\)附近,插值效果较好,说明在中心区域插值误差较小。
- **实际应用启示**:基于以上分析,实践中通常建议避免使用高次多项式进行插值,特别是在端点附近,而倾向于使用低次插值如线性插值、二次插值等。
#### 六、结论与展望
通过本次实验,我们不仅深入了解了Runge现象的本质,还掌握了如何利用MATLAB进行多项式插值的方法。同时,通过对不同节点数下插值结果的比较,进一步验证了Runge现象的存在。这对于未来在工程计算中合理选择插值方法具有重要的指导意义。未来的研究可以考虑探索其他类型的插值方法,如分段多项式插值,以进一步提高插值精度和稳定性。