在数值计算和工程应用中,我们常常面临一个经典问题:如何通过一组已知的离散数据点,来估算或预测未知点的函数值?无论是实验数据的拟合、图像处理中的像素插值,还是金融模型中的缺失值填充,插值法都是不可或缺的工具。其中,拉格朗日插值法因其概念直观、公式优美,成为学习数值计算时绕不开的经典算法。然而,很多初学者在面对其理论推导和代码实现时,常感到无从下手,网上资料要么过于理论化,要么代码片段零散不成体系。
本文旨在彻底解决这个问题。我们将从零开始,完整拆解拉格朗日插值法的核心原理,手把手带你推导公式,并提供可直接复制运行的Python代码实现。更重要的是,我们将通过多个由浅入深的实战题目进行“带练”,让你不仅理解算法,更能熟练应用它解决实际问题。无论你是正在学习《数值计算方法》课程的学生,还是需要在项目中快速实现数据插值的开发者,这篇文章都能为你提供一套从理论到实践的闭环解决方案。
1. 拉格朗日插值法:核心概念与问题背景
在深入公式和代码之前,我们必须先搞清楚拉格朗日插值法究竟要解决什么问题,以及它的基本思想是什么。
1.1 插值问题是什么?
想象一个场景:我们在一次物理实验中,测量了物体在几个特定时间点的速度,但我们想知道在某个未测量时间点的速度是多少。或者,我们有一张低分辨率图片,想通过已知像素点的颜色值,来推测出更高分辨率下新像素点的颜色。这类问题本质上都是插值问题。
插值(Interpolation)的数学定义是:给定一组互不相同的节点 ( x_0, x_1, ..., x_n ) 及其对应的函数值 ( y_0, y_1, ..., y_n ),构造一个插值函数( P(x) ),使其满足 ( P(x_i) = y_i ) (i=0,1,...,n)。然后,对于任意给定的 ( x )(通常在已知节点范围内),用 ( P(x) ) 的值作为函数 ( f(x) ) 的近似值。
这里有几个关键点:
- 节点(Nodes):已知的自变量值 ( x_i )。
- 函数值(Function Values):已知的因变量值 ( y_i )。
- 插值函数(Interpolant):我们构造出来的那个函数 ( P(x) ),它必须精确地经过所有已知点。
- 插值区间:通常我们只在已知节点的最小值和最大值构成的区间内进行插值,这个区间外的预测称为外推(Extrapolation),其误差通常更大,风险更高。
1.2 为什么选择多项式?拉格朗日的思路
构造插值函数的方法有很多,比如多项式、三角函数、样条函数等。拉格朗日插值法选择使用多项式作为插值函数。这是因为多项式具有形式简单、易于计算和微积分、并且根据多项式插值定理,对于n+1个互异节点,存在唯一的一个次数不超过n的多项式恰好经过这些点。
拉格朗日方法的巧妙之处在于其构造思路。它不直接去求解一个复杂的线性方程组来确定多项式系数,而是采用了一种“组合与叠加”的思想:
核心思想:构造一组“基础多项式”(拉格朗日基函数),每个基函数 ( l_i(x) ) 只在对应的节点 ( x_i ) 处取值为1,而在其他所有节点处取值为0。然后,将每个已知的函数值 ( y_i ) 作为权重,与对应的基函数相乘并求和,最终得到的多项式 ( P(x) ) 自然就满足了所有插值条件。
这个思想就像用乐高积木搭建一个形状:每个特定的积木块(基函数)只在特定位置凸起(值为1),在其他标准连接点都是平的(值为0)。我们按照图纸(已知数据点)选择相应高度的积木块(乘以 ( y_i )),然后拼在一起,就得到了最终模型(插值多项式)。
2. 环境准备与工具说明
在开始公式推导和编码之前,我们先明确实践环境。本文的代码示例将使用Python语言,因为它语法简洁,拥有强大的科学计算库,非常适合算法演示和快速验证。
所需环境:
- 编程语言:Python 3.6 及以上版本。
- 核心库:
NumPy:用于高效的数组和数学运算。Matplotlib:用于数据可视化,绘制函数和插值结果图像。
- 开发工具:任何你熟悉的Python IDE或编辑器均可,如 PyCharm, VSCode, Jupyter Notebook 等。
安装依赖:如果你尚未安装这些库,可以通过pip命令快速安装。打开终端或命令提示符,执行:
pip install numpy matplotlib示例项目结构:我们将创建一个简单的Python脚本文件,例如lagrange_interpolation.py,所有代码都将在此文件中编写和运行。对于复杂的练习,我们可能会创建多个文件,但核心逻辑是相通的。
3. 拉格朗日插值法原理与公式拆解
理解了核心思想后,我们来一步步推导出拉格朗日插值公式。
3.1 拉格朗日基函数的构造
这是整个算法的基石。对于第 ( i ) 个节点 ( x_i ),其对应的拉格朗日基函数 ( l_i(x) ) 定义如下:
[ l_i(x) = \prod_{\substack{j=0 \ j \neq i}}^{n} \frac{x - x_j}{x_i - x_j} ]
公式解读:
- 符号:( \prod ) 表示连乘。下标 ( j=0 ) 到 ( n ),但 ( j \neq i ),意味着对除了 ( i ) 之外的所有节点索引进行连乘。
- 分子:( (x - x_j) )。这保证了当 ( x ) 等于任意其他节点 ( x_j (j \neq i) ) 时,分子为零,从而使整个 ( l_i(x) = 0 )。
- 分母:( (x_i - x_j) )。这是一个常数,其作用是进行“归一化”,确保当 ( x = x_i ) 时,每一项 ( \frac{x_i - x_j}{x_i - x_j} = 1 ),连乘结果也为1,即 ( l_i(x_i) = 1 )。
性质验证:
- ( l_i(x_i) = 1 )
- ( l_i(x_j) = 0 ),对于所有 ( j \neq i )
这完美实现了我们“只在自家门口亮灯”的设计目标。
3.2 拉格朗日插值多项式的形成
一旦我们有了这组“开关”一样的基函数,构造最终的插值多项式就水到渠成了。拉格朗日插值多项式 ( L(x) ) 定义为所有基函数与其对应函数值的加权和:
[ L(x) = \sum_{i=0}^{n} y_i \cdot l_i(x) = \sum_{i=0}^{n} y_i \cdot \left( \prod_{\substack{j=0 \ j \neq i}}^{n} \frac{x - x_j}{x_i - x_j} \right) ]
为什么这个公式是对的?让我们验证插值条件:对于任意一个已知节点 ( x_k ), [ L(x_k) = \sum_{i=0}^{n} y_i \cdot l_i(x_k) ] 根据基函数的性质,当 ( i = k ) 时,( l_k(x_k) = 1 );当 ( i \neq k ) 时,( l_i(x_k) = 0 )。因此,上式求和后只剩下 ( y_k \cdot 1 = y_k )。完美满足 ( L(x_k) = y_k )。
3.3 算法步骤与复杂度分析
将上述数学公式转化为算法步骤:
- 输入:已知节点数组
x_nodes, 对应函数值数组y_nodes, 待插值点x(可以是一个值或数组)。 - 初始化:结果
result = 0。 - 外层循环 (i):遍历每一个节点索引
i(从0到n)。 a. 初始化基函数值basis = 1。 b.内层循环 (j):再次遍历每一个节点索引j(从0到n)。 - 如果j != i,则计算:basis *= (x - x_nodes[j]) / (x_nodes[i] - x_nodes[j])。 c. 将加权后的基函数值累加到结果:result += y_nodes[i] * basis。 - 输出:
result即为在点x处的插值结果。
时间复杂度分析:该算法包含两层嵌套循环,对于n+1个节点,计算一个插值点的时间复杂度为 ( O(n^2) )。当节点数很多时,计算效率会降低,这是拉格朗日插值法的一个缺点。但对于中小规模数据(n < 20),它完全够用且实现简单。
4. 完整实战:从零实现拉格朗日插值函数
理论必须结合实践。我们现在就动手编写一个健壮、可复用的拉格朗日插值函数。
4.1 基础函数实现
我们将实现一个函数lagrange_interpolation,它能够处理单个插值点或一组插值点。
# 文件:lagrange_interpolation.py import numpy as np def lagrange_interpolation(x_nodes, y_nodes, x): """ 计算拉格朗日插值多项式在点x处的值。 参数: x_nodes : list or np.ndarray 已知节点的x坐标列表。 y_nodes : list or np.ndarray 已知节点对应的y坐标列表。 x : float, int, or np.ndarray 待求插值点的x坐标。可以是单个数值,也可以是一个数组。 返回: float or np.ndarray 插值结果。如果x是单个值,返回标量;如果x是数组,返回对应结果的数组。 """ x_nodes = np.asarray(x_nodes) y_nodes = np.asarray(y_nodes) x = np.asarray(x) # 检查输入数据长度是否一致 if len(x_nodes) != len(y_nodes): raise ValueError("x_nodes 和 y_nodes 的长度必须相同。") n = len(x_nodes) result = np.zeros_like(x, dtype=float) # 初始化结果数组,形状与x相同 # 遍历每一个拉格朗日基函数 for i in range(n): # 计算第i个拉格朗日基函数 l_i(x) l_i = np.ones_like(x, dtype=float) # 初始化为1,用于连乘 for j in range(n): if j != i: # 连乘计算基函数 l_i *= (x - x_nodes[j]) / (x_nodes[i] - x_nodes[j]) # 加权求和 result += y_nodes[i] * l_i # 如果输入x是单个数值,返回标量以便于使用 if result.shape == (): return result.item() return result # 简单测试 if __name__ == "__main__": # 已知数据点 known_x = [1, 2, 4] known_y = [1, 4, 16] # 对应函数 y = x^2 # 测试点 test_x = 3 test_x_array = np.linspace(0.5, 4.5, 50) # 生成50个点用于绘图 # 计算插值 value_at_3 = lagrange_interpolation(known_x, known_y, test_x) interpolated_array = lagrange_interpolation(known_x, known_y, test_x_array) print(f"在 x={test_x} 处的插值结果为:{value_at_3}") print(f"真实值 y = {test_x**2} = {test_x**2}") print(f"绝对误差:{abs(value_at_3 - test_x**2)}")代码解释:
np.asarray(): 将输入转换为NumPy数组,使函数能同时处理列表和数组,并支持向量化运算。np.zeros_like(x): 创建一个与输入x形状、数据类型相同的全零数组,用于存储结果。- 双重循环:严格实现了拉格朗日插值公式。内层循环计算基函数
l_i,外层循环进行加权求和。 - 向量化计算:
(x - x_nodes[j]) / (x_nodes[i] - x_nodes[j])这一步,如果x是数组,NumPy会自动进行广播(Broadcasting),一次性完成所有点的计算,效率远高于在Python层用for循环遍历x的每个元素。 - 最后的
if判断:确保当输入是单个数字时,返回一个Python标量(float),这样在交互式环境中使用起来更直观。
4.2 可视化验证:绘制插值多项式
“一图胜千言”。让我们用Matplotlib绘制已知点、原始函数和插值多项式曲线,直观感受插值效果。
# 接续上面的 lagrange_interpolation.py 文件 import matplotlib.pyplot as plt def plot_interpolation(x_nodes, y_nodes, true_func=None, interval=None): """ 绘制拉格朗日插值结果。 参数: x_nodes : 已知节点x坐标。 y_nodes : 已知节点y坐标。 true_func : function, optional 真实的函数 f(x),用于对比。默认为None。 interval : tuple, optional 绘图区间 (x_min, x_max)。默认为节点最小最大值向外扩展10%。 """ if interval is None: x_min, x_max = min(x_nodes), max(x_nodes) margin = (x_max - x_min) * 0.1 interval = (x_min - margin, x_max + margin) # 生成密集的x点用于绘制平滑曲线 x_dense = np.linspace(interval[0], interval[1], 500) # 计算插值多项式在这些点上的值 y_interp = lagrange_interpolation(x_nodes, y_nodes, x_dense) plt.figure(figsize=(10, 6)) # 绘制已知数据点 plt.scatter(x_nodes, y_nodes, color='red', s=100, zorder=5, label='已知数据点') # 绘制插值多项式曲线 plt.plot(x_dense, y_interp, 'b-', linewidth=2, label='拉格朗日插值多项式') # 如果提供了真实函数,绘制真实曲线 if true_func is not None: y_true = true_func(x_dense) plt.plot(x_dense, y_true, 'g--', linewidth=2, label='真实函数', alpha=0.7) plt.xlabel('x') plt.ylabel('y') plt.title('拉格朗日插值法演示') plt.legend() plt.grid(True, alpha=0.3) plt.axhline(y=0, color='k', linestyle='-', alpha=0.2) plt.axvline(x=0, color='k', linestyle='-', alpha=0.2) plt.show() # 使用示例 if __name__ == "__main__": # 示例1:拟合二次函数 y = x^2 print("--- 示例1:拟合 y = x^2 ---") known_x = [1, 2, 4] known_y = [1, 4, 16] plot_interpolation(known_x, known_y, true_func=lambda x: x**2) # 示例2:拟合正弦函数 y = sin(x) print("\n--- 示例2:拟合 y = sin(x) ---") known_x_sin = [0, np.pi/2, np.pi, 3*np.pi/2] known_y_sin = [np.sin(x) for x in known_x_sin] plot_interpolation(known_x_sin, known_y_sin, true_func=np.sin, interval=(0, 2*np.pi))运行这段代码,你将看到两幅图。第一幅图显示,用三个点(1,1), (2,4), (4,16)插值得到的多项式(蓝色实线)与真实函数 ( y=x^2 )(绿色虚线)在区间内完全重合!这是因为我们用的点本身就来自一个二次函数,而2次多项式(3个点)足以精确重构它。第二幅图展示了用4个点拟合 ( sin(x) ) 的效果,可以看到插值多项式在节点处完全重合,但在节点间与真实正弦波存在差异,这就是插值误差。
5. 题目带练:从易到难掌握应用
现在进入关键的“带练”环节。我们将通过几个典型题目,巩固你对拉格朗日插值法的理解和应用能力。
5.1 基础题:线性插值(两点插值)
题目:已知函数 ( f(x) ) 满足 ( f(1) = 2 ), ( f(3) = 5 )。使用拉格朗日插值法求 ( f(2) ) 的近似值,并写出插值多项式。
分析与解答: 这是最简单的情况,只有两个节点 (n=1)。拉格朗日插值多项式是一次多项式(直线)。
- 已知数据:
x_nodes = [1, 3],y_nodes = [2, 5]。 - 基函数:
- ( l_0(x) = \frac{x - x_1}{x_0 - x_1} = \frac{x - 3}{1 - 3} = -\frac{1}{2}(x-3) )
- ( l_1(x) = \frac{x - x_0}{x_1 - x_0} = \frac{x - 1}{3 - 1} = \frac{1}{2}(x-1) )
- 插值多项式: [ L(x) = y_0 l_0(x) + y_1 l_1(x) = 2 \cdot \left[-\frac{1}{2}(x-3)\right] + 5 \cdot \left[\frac{1}{2}(x-1)\right] = -(x-3) + \frac{5}{2}(x-1) ] 化简得:( L(x) = \frac{3}{2}x + \frac{1}{2} )。
- 计算 f(2):( L(2) = \frac{3}{2} \times 2 + \frac{1}{2} = 3.5 )。
代码验证:
# 基础题代码验证 known_x = [1, 3] known_y = [2, 5] x_to_interp = 2 result = lagrange_interpolation(known_x, known_y, x_to_interp) print(f"已知点: x={known_x}, y={known_y}") print(f"在 x={x_to_interp} 处的拉格朗日插值结果为: {result}") print(f"插值多项式为一次函数,斜率为1.5,截距为0.5。")5.2 进阶题:预测缺失数据
题目:在某实验中,测得物体运动时间(t)和位移(s)关系如下表所示。由于仪器故障,t=4s时的数据缺失。请用拉格朗日插值法估计该时刻的位移。
| t(s) | 1 | 2 | 3 | 5 | 6 |
|---|---|---|---|---|---|
| s(m) | 10 | 15 | 20 | 30 | 35 |
分析与解答: 这是一个典型的应用场景。我们拥有4个有效数据点,要估算第5个点。选择用于插值的节点至关重要。通常,我们选择待插值点附近的数据点,因为距离越近,相关性一般越强,误差可能越小。t=4 在 3 和 5 之间,因此最合理的选择是使用 (3, 20) 和 (5, 30) 两个点进行线性插值(即上一题的方法)。当然,为了演示,我们也可以使用更多点。
方案1(线性插值,推荐):使用点 (3,20) 和 (5,30)。
known_x = [3, 5] known_y = [20, 30] t = 4 s_estimated = lagrange_interpolation(known_x, known_y, t) print(f"使用点(3,20)和(5,30)线性插值,t={t}s时,s≈{s_estimated}m")方案2(二次插值):使用点 (2,15), (3,20), (5,30)。这会得到一个二次多项式。
known_x = [2, 3, 5] known_y = [15, 20, 30] t = 4 s_estimated = lagrange_interpolation(known_x, known_y, t) print(f"使用点(2,15),(3,20),(5,30)二次插值,t={t}s时,s≈{s_estimated}m")运行代码,比较两种方案的结果。你会发现它们很接近。在工程中,需要根据数据特点和经验选择插值节点的个数和位置。
5.3 综合题:绘制复杂函数的插值逼近
题目:已知函数 ( f(x) = \frac{1}{1+25x^2} ) 在区间 [-1, 1] 上取等距节点。分别用 5 个点和 11 个点进行拉格朗日插值,绘制插值多项式与真实函数的对比图,观察现象。
分析与解答: 这个函数就是著名的龙格函数(Runge‘s function)。它是一个揭示高次多项式插值风险(龙格现象)的经典例子。
# 综合题:龙格现象演示 def runge(x): return 1 / (1 + 25 * x**2) x_interval = np.linspace(-1, 1, 400) y_true = runge(x_interval) plt.figure(figsize=(14, 5)) # 使用5个等距节点 n1 = 5 x_nodes1 = np.linspace(-1, 1, n1) y_nodes1 = runge(x_nodes1) y_interp1 = lagrange_interpolation(x_nodes1, y_nodes1, x_interval) plt.subplot(1, 2, 1) plt.plot(x_interval, y_true, 'g-', label='真实函数 f(x)') plt.plot(x_interval, y_interp1, 'b-', label=f'{n1}点拉格朗日插值') plt.scatter(x_nodes1, y_nodes1, color='red', s=50, zorder=5, label='插值节点') plt.title(f'使用 {n1} 个等距节点') plt.legend() plt.grid(True, alpha=0.3) plt.ylim(-0.5, 1.5) # 使用11个等距节点 n2 = 11 x_nodes2 = np.linspace(-1, 1, n2) y_nodes2 = runge(x_nodes2) y_interp2 = lagrange_interpolation(x_nodes2, y_nodes2, x_interval) plt.subplot(1, 2, 2) plt.plot(x_interval, y_true, 'g-', label='真实函数 f(x)') plt.plot(x_interval, y_interp2, 'b-', label=f'{n2}点拉格朗日插值') plt.scatter(x_nodes2, y_nodes2, color='red', s=50, zorder=5, label='插值节点') plt.title(f'使用 {n2} 个等距节点') plt.legend() plt.grid(True, alpha=0.3) plt.ylim(-2, 2) # 调整y轴范围以观察振荡 plt.tight_layout() plt.show()运行代码后,你会观察到令人惊讶的现象:当节点增加到11个时,插值多项式在区间两端出现了剧烈的振荡,尽管它在节点处仍然精确通过。这就是龙格现象(Runge‘s phenomenon):对于某些函数,使用高次多项式(节点数多)在等距节点上进行插值,在区间边缘会产生巨大的误差。这个例子深刻地告诉我们:并非插值节点越多,逼近效果就越好。对于龙格这类函数,使用样条插值(Spline)或切比雪夫节点(非等距)会是更好的选择。
6. 常见问题与排查思路
在实际使用拉格朗日插值法时,你可能会遇到以下问题:
| 问题现象 | 可能原因 | 排查与解决思路 |
|---|---|---|
程序报错:ZeroDivisionError | 节点x_nodes中存在重复值,导致分母(x_i - x_j)为零。 | 检查输入数据。拉格朗日插值要求所有节点互异。使用if len(set(x_nodes)) != len(x_nodes):检查是否有重复。 |
插值结果出现nan或inf | 1. 节点值重复(同上)。 2. 待插值点 x非常接近某个节点,浮点计算导致数值不稳定。3. 节点值数量级差异巨大,导致浮点溢出。 | 1. 检查节点唯一性。 2. 对于接近节点的插值,可考虑直接返回该节点的函数值。 3. 尝试对数据进行归一化处理(如减去均值,除以标准差),插值后再反变换。 |
| 插值结果明显错误,与预期不符 | 1.x_nodes和y_nodes顺序不对应。2. 输入数据类型错误,如列表中包含字符串。 3. 代码实现逻辑有误,如循环边界错误。 | 1. 确保(x_nodes[i], y_nodes[i])是正确的一对数据点。2. 打印输入数据,检查类型。使用 np.asarray(..., dtype=float)强制转换。3. 用简单的两点或三点例子(如5.1基础题)逐步调试你的函数。 |
| 计算速度非常慢 | 节点数量n很大,导致算法 ( O(n^2) ) 复杂度显现。 | 1. 评估是否真的需要这么多节点。对于平滑函数,可能不需要高次插值。 2. 考虑使用更高效的插值算法,如牛顿插值法(同样多项式插值,但计算可复用)。 3. 对于大量重复插值,可预先计算多项式系数。 |
| 区间外插值(外推)误差巨大 | 拉格朗日多项式在区间外可能迅速发散,这是多项式外推的固有风险。 | 强烈不建议使用多项式插值进行外推。如果必须预测,应使用基于模型的方法(如回归分析)或明确告知风险。 |
| 出现龙格现象般的剧烈振荡 | 对不适宜的函数(如龙格函数)使用了高次多项式插值,且节点为等距分布。 | 1. 减少插值节点数,使用低次多项式。 2. 改用分段低次插值,如分段线性插值或三次样条插值。 3. 使用非等距节点,如切比雪夫节点。 |
7. 最佳实践与工程建议
理解了算法和常见问题后,以下建议能帮助你在实际项目中更好地应用拉格朗日插值法:
数据质量优先:
- 检查节点唯一性:这是算法成立的前提。在插值前务必确保
x_nodes中没有重复值。 - 审视数据分布:节点在区间内应分布合理。对于变化剧烈的区域,节点应更密集。避免所有节点挤在一端。
- 检查节点唯一性:这是算法成立的前提。在插值前务必确保
节点数量选择:
- “少即是多”原则:不要盲目追求高次多项式。先从低次(如线性、二次)开始,观察效果。增加节点前,思考是否真的能提高精度。
- 警惕龙格现象:如果函数本身有奇点或剧烈波动,或者你不得不使用等距节点,要特别小心高次插值带来的边缘振荡。绘制对比图是发现问题的好方法。
代码实现优化:
- 向量化计算:如我们的示例代码所示,利用NumPy的广播机制一次性计算所有待插值点,比用Python循环遍历每个点快几个数量级。
- 考虑牛顿插值法:如果你需要多次计算同一个节点集下的不同插值点,牛顿插值法因其“差商”的可加性,在计算上比拉格朗日法更高效。
- 添加输入验证:在生产代码中,函数开头应验证输入数组长度、类型、是否包含非数值等。
误差与评估:
- 理解误差来源:拉格朗日插值误差与函数的高阶导数及节点分布有关。对于未知函数,误差难以精确估计。
- 交叉验证:如果有充足数据,可以留出一部分数据不参与插值构造,然后用这些“测试点”来评估插值多项式的精度。
- 可视化是关键:始终绘制原始数据点、插值曲线和(如果已知)真实函数的对比图。图形能最直观地揭示问题。
替代方案考量:
- 分段线性插值:最简单稳健,虽然不够光滑,但绝不会振荡,计算复杂度O(n)。
- 三次样条插值:在保证一定光滑性(二阶导数连续)的同时,能有效避免高次多项式振荡,是工程中最常用的插值方法之一。Python中
scipy.interpolate.CubicSpline可直接使用。 - 考虑拟合而非插值:当数据存在噪声时,强行让曲线穿过每个点(插值)会放大噪声。此时,使用多项式或其它模型的最小二乘拟合可能得到更反映趋势的结果。
拉格朗日插值法是数值计算领域的瑰宝,它以其简洁优美的形式阐述了多项式插值的核心思想。通过本文,我们从其解决的问题出发,逐步推导了公式,实现了可复用的代码,并通过多个实战题目演练了其应用。更重要的是,我们探讨了它的局限性(如龙格现象、计算效率)和适用的最佳实践。
掌握它,不仅是为了解一道数学题,更是为了在面临数据补全、曲线绘制、函数逼近等实际问题时,工具箱里多一件趁手的武器。记住,没有一种方法是万能的,拉格朗日插值法在节点数少、函数平滑时表现优异;而当节点增多或函数复杂时,就需要我们审慎地选择节点,或者转向分段插值、样条插值等更稳健的工具。
建议你将文中的代码保存下来,尝试用自己的数据或课本习题进行练习。遇到问题时,回头看看第6部分的排查清单。当你能够熟练地调用lagrange_interpolation函数,并理解其背后的每一次乘加运算时,你就真正掌握了这项技术。