
1. 项目概述从“猜”数据到“造”数据搞数学建模尤其是处理那些来自现实世界、长得七零八落的数据时你肯定遇到过这种头疼事手头的数据点稀稀拉拉但模型偏偏要求你给出一个连续、光滑的曲线或者预测某个根本没测过的位置的值。比如气象站就那么几个你想知道整个区域每一点的气温实验只做了几个特定浓度的测试你需要估算中间任意浓度的反应速率。这时候你需要的两把核心“手术刀”就是插值和拟合。很多人刚开始学容易把这俩概念搞混觉得都是“用一条线穿过数据点”。其实内核完全不同。简单打个比方插值像是“考古修复”要求还原的曲线必须严丝合缝地经过每一个已知的“文物碎片”数据点追求的是在已知点上的绝对精确再现常用于补全缺失的、高精度的观测数据。而拟合更像是“趋势预测”它承认数据有误差噪声找的是一条从整体上看最“贴近”所有数据点的曲线不要求穿过每一个点目的是抓住数据背后隐藏的规律用于预测和解释。一个是“重现已知”一个是“探索未知”。这次我们聚焦上半场——插值。别看概念基础里头的门道和坑一点也不少。选哪种插值函数边界怎么处理数据点一多就震荡怎么办这些都是在论文里体现你建模功底的关键细节。接下来我们就抛开教科书式的定义直接切入实战看看怎么把这些方法用活、用对。2. 核心思路插值究竟在解决什么问题在动手写任何代码之前我们必须把插值要解决的核心问题想透。这决定了你后续所有方法的选择。2.1 问题本质从离散到连续的构造艺术我们面对的场景永远是这样的在自变量 x 的某些离散点x0, x1, ..., xn上我们已知函数值y0, y1, ..., yn。现在我们想要构造一个新的函数 φ(x)使得对于所有已知点满足φ(xi) yi。然后我们就可以用这个 φ(x) 来计算任意一点x’尤其是那些没测过的点的函数值近似值。这里的关键词是“构造”。数据点之间是一片空白插值就是用数学规则在这片空白上“搭建”出一条我们认为合理的路径。不同的搭建规则即不同的插值函数形式就会得到完全不同形状的路径从而直接影响你预测结果的合理性和精度。2.2 插值 vs. 拟合核心诉求的抉择为什么有时候必须用插值而不能用拟合这取决于你的数据特性和建模目标。使用插值的信号数据精度高你的观测值或数据点本身被认为是精确的、无误差的。比如从高精度传感器读取的特定时刻的温度、通过理论公式计算得到的离散解。要求精确通过模型或物理意义要求重构的函数必须精确还原这些已知点。例如根据有限个点的精确坐标重构零件外形轮廓CAD或者由关键帧生成动画中间帧。补全缺失信息在完整、精确的数据集中有少量点缺失需要基于周围已知的精确值进行填补。使用拟合的信号数据存在明显误差或噪声实验测量数据通常带有随机误差强迫曲线穿过每一个带噪声的点反而会放大误差得到一条极不合理的震荡曲线。探寻整体趋势你更关心变量之间的宏观关系如经济增长趋势、药物剂量反应关系而不是每个点的精确值。简化模型你希望用一个形式相对简单如线性、二次、指数的函数来概括复杂的数据关系以便于理解和后续分析。注意在数学建模竞赛中审题时要格外留意题目对数据性质的描述。如果题干暗示或明示数据是“观测值”、“实验数据”、“存在误差”那么你首选的方法应该是拟合并在论文中论证这一点。如果数据是“理论值”、“精确坐标”、“关键节点”那么插值才是更合适的选择。选错大方向后续工作再精致也容易失分。3. 常用插值方法深度解析与选型指南知道了“为什么用”接下来就是“用什么”。下面这几种方法是工具箱里的常客但每种都有其特定的适用场景和“脾气”。3.1 线性插值简单可靠的“连接器”这是最直观的方法把相邻的两个数据点用直线连起来。公式对于区间[xi, xi1]有φ(x) yi (yi1 - yi) / (xi1 - xi) * (x - xi)。优点计算量极小速度快。结果稳定绝对不会出现无法预料的大幅度震荡。保单调性如果原始数据是单调递增/递减的线性插值的结果也是单调的。缺点不光滑在节点处数据点导数不连续得到的是一条折线看起来有“棱角”。精度较低如果真实函数是弯曲的用直线去近似误差可能较大。适用场景对光滑度要求不高的快速估算。数据本身变化平缓或你只关心一个粗略的趋势。作为复杂方法如样条插值的第一步或后备方案。实操心得在编程实现时首要任务是确保你的待插值点 x 落在已知的数据区间内。一个健壮的代码必须包含查找 x 所在区间的算法如二分查找。对于落在数据范围之外的x即外推线性插值可以沿端点连线延伸但外推风险极大需在论文中明确说明并谨慎对待。3.2 多项式插值威力巨大但需慎用的“双刃剑”其思想是找一个 n 次多项式Pn(x) a0 a1x ... anx^n让它穿过所有 n1 个数据点。拉格朗日插值和牛顿插值是两种经典的实现方式。优点形式统一整个定义域上一个表达式搞定理论上无限光滑。理论基础坚实。致命的缺点——龙格现象 这是多项式插值最著名的坑。当数据点在高阶情况下等距分布时插值多项式在区间边缘会产生剧烈的震荡导致误差爆炸式增长。节点越多多项式次数越高边缘震荡往往越厉害完全偏离真实函数。适用场景数据点很少通常不超过 5-7 个。数据点非等距且你主要关心中间区域的内插值。作为理论分析的工具但在实际数值计算中已基本被样条插值取代。选型建议拉格朗日插值公式对称美观理论推导时常用。但增加一个新节点时所有基函数都要重新计算不适合动态增删数据。牛顿插值具有“承袭性”增加新节点时只需在原有结果上加一项计算更有优势。通常在实际计算中更受青睐。警告在数学建模论文中除非有非常特殊的理由并且能在论文中充分论证否则不要轻易使用高阶多项式插值去处理超过10个的数据点。评委看到这个很可能会认为你对数值计算的稳定性缺乏基本了解。3.3 分段多项式插值平衡的艺术为了克服高阶多项式插值的震荡问题很自然的想法就是“分而治之”将整个区间分成若干小段在每一段上用低次多项式进行插值。这就是分段插值的思想。分段线性插值就是前面讲的每段用直线整体是折线。分段三次埃尔米特插值这比单纯插值要求更高。它不仅要求函数值相等还要求在节点处导数值也相等或等于给定值。这保证了插值函数在节点处是C1 连续的一阶导数连续看起来就光滑多了没有“尖角”。你需要已知或设法估计每个节点处的导数值。如果不知道可以用相邻点差商来近似但这会引入新的误差。优点有效避免了全局震荡局部性好计算量可控。缺点分段线性光滑性差分段埃尔米特需要导数信息不总是可得。3.4 三次样条插值平滑主义的终极选择这是目前应用最广泛、最受推崇的插值方法可以看作是分段三次埃尔米特插值的“智能升级版”。它同样是分段三次多项式但它不要求你事先给出导数值。它的聪明之处在于通过增加一个全局性的约束条件来自动确定所有节点处的一阶和二阶导数从而使最终得到的插值函数S(x)满足S(xi) yi插值条件。在每个子区间[xi, xi1]上是三次多项式。S(x),S(x),S(x)在整个区间上连续即 C2 连续。这意味着函数曲线本身、其切线斜率和曲率变化都是光滑的视觉上非常优美。还需要两个边界条件来使方程组封闭。最常用的是自然边界条件S(x0) S(xn) 0。这样得到的样条在两端最“放松”像一根有弹性的木条被固定在数据点上两端自由弯曲。固定边界条件给定端点的一阶导数值S(x0)和S(xn)。如果你能从物理意义或其他知识中知道端点的趋势用这个条件会更准确。非扭结边界条件强制第一个点和最后一个点处的三阶导数也连续。这在某些情况下能减少边界处的摆动。优点高光滑性C2连续曲线非常光滑符合多数物理过程的直观。数值稳定性好不会出现多项式插值那样的剧烈震荡。收敛性有保证随着数据点加密样条插值函数会一致收敛到光滑的原函数。计算效率较高虽然要解一个三对角线性方程组但算法成熟高效如追赶法。缺点/注意事项计算比分段线性复杂。边界条件的选择会影响结果特别是靠近端点的区域。如果原始数据本身有不连续点比如阶跃强行用样条插值会得到在间断点附近剧烈振荡的错误结果。适用场景绝大多数需要光滑插值的情况。例如地形曲面生成、汽车/飞机外形设计、关键帧动画、经济数据平滑处理等。在数学建模中只要你的问题背景暗示了过程的“光滑性”如物体运动轨迹、温度扩散、经济增长趋势三次样条通常是首选。3.5 实战选型速查表为了帮你快速决策我把核心方法总结成下表方法核心思想光滑度计算复杂度稳定性典型应用场景一句话忠告线性插值用直线连接相邻点C0连续函数值连续折线极低非常稳定快速估算、数据可视化初稿、单调数据“快而糙不出大错”多项式插值用一个高次多项式穿过所有点C∞连续理论上无限光滑中到高不稳定龙格现象理论分析、极少数据点7“威力大但易失控非高手勿近”分段三次埃尔米特每段用三次多项式并匹配节点导数值C1连续一阶导连续中较稳定已知节点导数信息的光滑插值“有导数信息时的好选择”三次样条插值分段三次并强制二阶导连续C2连续二阶导连续中非常稳定绝大多数需要光滑曲线的场景如设计、模拟、动画“平滑插值的行业标准闭眼选它大概率没错”4. 关键实现步骤与MATLAB/Python实操理论说得再多不如一行代码。这里我们用最常用的 MATLAB 和 Python (SciPy) 来演示如何实现这些插值并解读关键输出。4.1 数据准备与可视化第一步永远不能省在插值前把数据画出来这是发现数据特质单调性、周期性、潜在间断点最简单有效的方法。% MATLAB x_known [0, 1, 2, 3, 4, 5]; y_known [0, 0.5, 0.8, 0.9, 0.1, -0.8]; figure; plot(x_known, y_known, ro, MarkerSize, 10, LineWidth, 2); hold on; xlabel(X); ylabel(Y); title(原始数据点); grid on;# Python import numpy as np import matplotlib.pyplot as plt x_known np.array([0, 1, 2, 3, 4, 5]) y_known np.array([0, 0.5, 0.8, 0.9, 0.1, -0.8]) plt.figure(figsize(8, 5)) plt.plot(x_known, y_known, ro, markersize10, labelKnown Data) plt.xlabel(X) plt.ylabel(Y) plt.title(原始数据点) plt.grid(True) plt.legend() plt.show()4.2 各类插值实现代码示例假设我们想在更密的点上进行插值x_fine np.linspace(0, 5, 100)。4.2.1 线性插值% MATLAB - interp1 函数是核心 x_fine linspace(0, 5, 100); y_linear interp1(x_known, y_known, x_fine, linear); % linear 是默认方法 % 绘图对比 plot(x_fine, y_linear, b-, LineWidth, 1.5, DisplayName, Linear Interp); legend(Location, best);# Python - numpy.interp 或 scipy.interpolate.interp1d from scipy.interpolate import interp1d x_fine np.linspace(0, 5, 100) # 方法1: numpy (仅线性) y_linear_np np.interp(x_fine, x_known, y_known) # 方法2: scipy.interp1d (更通用) linear_interp_func interp1d(x_known, y_known, kindlinear, bounds_errorFalse, fill_valueextrapolate) # bounds_errorFalse 允许外插fill_value设置外插方式 y_linear_scipy linear_interp_func(x_fine) # 绘图 plt.plot(x_fine, y_linear_scipy, b-, linewidth1.5, labelLinear Interp) plt.legend() plt.show()4.2.2 多项式插值以拉格朗日为例慎用% MATLAB 可以使用 polyfit 和 polyval但注意这是拟合不是严格插值。 % 对于精确插值可以自己实现拉格朗日公式或使用第三方工具。 % 这里演示用 polyfit 拟合一个 n-1 次多项式通过所有点 p polyfit(x_known, y_known, length(x_known)-1); % 拟合一个5次多项式 y_poly polyval(p, x_fine); plot(x_fine, y_poly, g--, LineWidth, 1.5, DisplayName, Poly (5th degree));# Python - 使用 scipy.interpolate.lagrange (警告仅供演示数值不稳定) from scipy.interpolate import lagrange poly_interp_func lagrange(x_known, y_known) # 生成拉格朗日插值多项式对象 y_poly poly_interp_func(x_fine) plt.plot(x_fine, y_poly, g--, linewidth1.5, labelLagrange Poly (n5))4.2.3 三次样条插值% MATLAB - interp1 的 spline 或 pchip y_spline interp1(x_known, y_known, x_fine, spline); % 三次样条 y_pchip interp1(x_known, y_known, x_fine, pchip); % 保形分段三次埃尔米特插值 plot(x_fine, y_spline, m-, LineWidth, 2, DisplayName, Cubic Spline); plot(x_fine, y_pchip, c-, LineWidth, 2, DisplayName, PCHIP);# Python - scipy.interpolate.CubicSpline (推荐) 或 interp1d with kindcubic from scipy.interpolate import CubicSpline # 使用 CubicSpline 类可以指定边界条件 cs_natural CubicSpline(x_known, y_known, bc_typenatural) # 自然边界 y_spline_natural cs_natural(x_fine) cs_clamped CubicSpline(x_known, y_known, bc_typeclamped) # 需要提供端点导数这里假设为0 # 实际应为CubicSpline(x_known, y_known, bc_type((1, 0), (1, 0))) # 两端一阶导为0 y_spline_clamped cs_clamped(x_fine) # 使用 interp1d (内部可能调用样条但边界条件控制不如CubicSpline直接) spline_interp_func interp1d(x_known, y_known, kindcubic) y_spline_interp1d spline_interp_func(x_fine) plt.plot(x_fine, y_spline_natural, m-, linewidth2, labelCubic Spline (Natural)) plt.plot(x_fine, y_spline_clamped, c-, linewidth2, labelCubic Spline (Clamped, df0))4.3 结果对比与解读将以上所有曲线画在同一张图上你会立刻看出区别线性插值蓝线是一条明显的折线在数据点处有“拐角”。它忠实地连接了数据但不够光滑。5次多项式插值绿虚线穿过了所有点但在首尾两端特别是X4到5之间产生了剧烈的、不符合数据整体趋势的震荡这就是龙格现象的典型表现。它为了精确通过每一个点付出了曲线严重畸变的代价。三次样条插值品红线曲线非常光滑整体上反映了数据的起伏趋势没有不合理的震荡。自然边界条件下曲线在两端趋于平缓。PCHIP/Clamped样条青线也是一种光滑插值但有时比自然样条更“保守”保单调性的性质更好。如果原始数据是单调的PCHIP插值结果也能保持单调而自然样条可能会在单调区间内产生微小的波动。实操心得在MATLAB中interp1的‘spline’选项使用的是非扭结not-a-knot边界条件而‘pchip’是保形状的分段三次埃尔米特插值。在Python的CubicSpline中我们可以明确指定bc_type‘natural’自然样条或‘clamped’固定导数。在论文中你应该明确写出你使用了哪种样条以及边界条件并简要说明理由这体现了你对方法的深入理解。5. 误差分析与评估你的插值结果可信吗插值函数 φ(x) 毕竟是对真实函数 f(x) 的一种近似我们需要知道这个近似的好坏。5.1 误差来源截断误差/方法误差由插值方法本身的理论局限性引起。例如用直线去近似曲线用三次多项式去近似正弦波本身就会存在偏差。对于多项式插值有著名的插值余项公式来分析。舍入误差计算机浮点数计算引入的微小误差在条件数大的问题中会放大。原始数据误差如果已知的yi本身就有测量误差那么插值结果会继承并可能放大这个误差。这是拟合要处理的问题插值默认不考虑。5.2 如何评估插值效果在数学建模中你通常无法知道真实函数 f(x)所以评估要讲究策略内插验证最常用方法从已知数据点中随机留出一部分如20%不参与插值模型的构建用剩下的点构建插值函数 φ(x)。然后用 φ(x) 去预测这些预留点的值计算预测值与真实值之间的误差。误差指标均方误差 (MSE):(1/m) * Σ (φ(xi) - yi)^2平均绝对误差 (MAE):(1/m) * Σ |φ(xi) - yi|最大绝对误差 (Max Error):max(|φ(xi) - yi|)优点模拟了模型对未知数据的预测能力评估更客观。注意对于插值由于模型强制穿过所有训练点所以对训练点的误差为0。因此必须用未参与建模的点来验证否则评估毫无意义。可视化直观判断将插值曲线与数据点画在一起观察曲线是否平滑、是否符合物理直觉、在数据稀疏区域是否出现不合理的振荡或过度弯曲。绘制误差分布图预测值-真实值 vs. X看误差是否随机分布是否存在系统性的偏差如一端总是偏高。针对样条插值的检查可以计算样条函数的二阶导数S(x)并绘图。一个“好”的样条其二阶导数也应该是连续且变化平缓的。如果在某些区域出现二阶导数的尖峰或剧烈变化说明该处的曲率变化过大插值结果可能不稳定。5.3 一个简单的交叉验证代码框架# Python 示例简单交叉验证评估样条插值 from sklearn.model_selection import train_test_split from scipy.interpolate import CubicSpline from sklearn.metrics import mean_squared_error, mean_absolute_error import numpy as np # 假设我们有数据 X_all, y_all X_all np.array([...]) y_all np.array([...]) # 1. 划分数据为“训练集”用于构建插值函数和“测试集”用于验证 X_train, X_test, y_train, y_test train_test_split(X_all, y_all, test_size0.2, random_state42) # 注意插值要求X有序这里分割打乱了顺序仅演示思想。实际中应按顺序留出连续段。 # 更合理的做法按顺序留出中间一段 split_idx int(len(X_all) * 0.8) X_train, y_train X_all[:split_idx], y_all[:split_idx] X_test, y_test X_all[split_idx:], y_all[split_idx:] # 2. 在训练集上构建样条插值函数 # 注意需要确保X_train是单调递增的这是样条的要求 sort_idx np.argsort(X_train) X_train_sorted X_train[sort_idx] y_train_sorted y_train[sort_idx] cs CubicSpline(X_train_sorted, y_train_sorted, bc_typenatural) # 3. 在测试集上进行预测 y_pred cs(X_test) # 4. 计算误差指标 mse mean_squared_error(y_test, y_pred) mae mean_absolute_error(y_test, y_pred) max_err np.max(np.abs(y_test - y_pred)) print(f测试集 MSE: {mse:.6f}) print(f测试集 MAE: {mae:.6f}) print(f测试集 Max Absolute Error: {max_err:.6f}) # 5. 可视化 plt.figure(figsize(12,5)) plt.subplot(1,2,1) x_fine np.linspace(X_all.min(), X_all.max(), 500) plt.plot(X_train, y_train, bo, labelTraining Data) plt.plot(X_test, y_test, rs, labelTest Data) plt.plot(x_fine, cs(x_fine), g-, labelCubic Spline (on Train)) plt.legend() plt.title(Interpolation Result) plt.subplot(1,2,2) plt.plot(X_test, y_test - y_pred, ko-) plt.axhline(y0, colorr, linestyle--) plt.xlabel(X (Test set)) plt.ylabel(Prediction Error) plt.title(Error on Test Set) plt.grid(True) plt.tight_layout() plt.show()6. 高维与散乱数据插值简介我们上面讨论的都是一维数据y f(x)。现实问题中大量数据是多维的例如三维空间中的温度分布T f(x, y, z)或者二维图像像素I f(x, y)。6.1 网格数据插值如果数据点是在规则网格上给出的比如每间隔1度经纬度的气象数据那么问题可以分解为一系列一维插值。最常用的方法是双线性插值二维和三线性插值三维。双线性插值对于一个矩形网格先在x方向做两次线性插值得到两个中间点再在这两个中间点之间在y方向做一次线性插值。它比直接在两个方向独立做线性插值双线性插值的结果是双线性的而不是线性的更平滑。MATLAB:interp2,griddata(对于部分散乱数据也适用)Python:scipy.interpolate.interp2d,scipy.interpolate.RegularGridInterpolator, 或scipy.interpolate.griddata6.2 散乱数据插值这是更普遍也更难的情况数据点(xi, yi, zi)在平面上毫无规则地分布。你不能直接用网格方法。常用方法自然邻域插值对于待插值点找到它在散点集中的自然邻域Voronoi图用邻域内点的值进行加权平均。权重与邻域面积有关。结果平滑但计算量较大。径向基函数插值假设插值函数是许多以数据点为中心的径向对称基函数如高斯函数、多二次函数的加权和。通过求解线性方程组确定权重。这种方法非常灵活能适应复杂曲面但需要选择合适的基础函数和形状参数。克里金插值起源于地质统计学不仅考虑距离还考虑数据间的空间相关性通过变差函数建模。它是最优线性无偏估计能提供插值方差即不确定性估计在地理、环境科学中应用极广。Delaunay三角剖分线性插值将散点三角化每个待插值点落在某个三角形内用该三角形三个顶点的值进行线性插值二维。结果是不光滑的三角面片。工具选择MATLAB:scatteredInterpolant类功能强大支持多种方法‘linear’,‘natural’,‘nearest’。griddata函数也常用。Python (SciPy):scipy.interpolate.griddata是处理散乱数据插值的主力支持‘linear’三角剖分线性,‘nearest’,‘cubic’仅对网格数据有效等。对于更高级的径向基函数可以使用scipy.interpolate.Rbf。注意事项高维插值尤其是散乱数据插值计算复杂度高且容易陷入“维度灾难”。在建模时如果问题允许应优先考虑通过降维如主成分分析或假设简化如考虑对称性将问题转化到低维空间处理。选择方法时一定要考虑数据的空间分布特征和你的光滑性要求。7. 常见陷阱与实战避坑指南结合多年经验和学生常见错误我总结出以下几个“坑”跳过去就是加分项。7.1 外推风险极高的行为绝对要避免用插值函数去计算远超出原始数据范围[x0, xn]的值。插值方法只在数据内部是相对可靠的。一旦外推行为完全不可控。线性插值会沿端点直线延伸多项式会疯狂震荡发散样条函数在边界外的行为也依赖于边界条件的假设通常不可信。怎么办如果必须预测未来或外部值应该使用拟合得到一个经验模型或者使用专门的时间序列预测方法如ARIMA并在论文中明确说明外推的不确定性极大。7.2 数据点顺序与单调性坑很多插值算法包括样条都要求自变量 x 是严格单调递增的。如果你的数据是乱序的直接喂给函数会得到错误结果或直接报错。避坑在插值前务必先对数据按 x 排序。# Python sort_idx np.argsort(x_data) x_sorted x_data[sort_idx] y_sorted y_data[sort_idx] # 然后再用 x_sorted, y_sorted 去构建插值函数7.3 重复的 x 值坑如果数据中存在两个或多个相同的 x 值对应不同的 y 值这违反了函数的定义单值性。大多数插值函数会直接报错。避坑检查并处理重复点。如果是测量误差可以取平均值如果代表不同状态可能需要重新审视问题看是否应该引入新的维度。7.4 过密数据点与过拟合虽然插值本身要求通过所有点但如果数据点本身非常密集且带有噪声使用高阶多项式或非常“柔软”的样条如使用很小的平滑参数会导致插值曲线紧紧跟随每一个数据点包括噪声点从而产生一条极其扭曲、毫无物理意义的曲线。这本质上是对噪声的过拟合。怎么办此时应该放弃严格的插值转而使用平滑样条或拟合。平滑样条允许曲线不完全通过数据点而是在拟合优度和曲线光滑度之间做一个权衡。在scipy.interpolate中有UnivariateSpline并指定平滑参数s。7.5 边界条件的选择依赖症对于三次样条很多人直接调用默认函数从不关心边界条件。在数据边界附近不同的边界条件会导致结果差异明显。建议如果对端点行为一无所知用自然样条(bc_type‘natural’) 通常是一个合理且稳健的默认选择。如果你能从问题背景中推断出端点的导数信息例如在物理模拟中边界是绝热的温度梯度为0一定要使用固定边界条件(bc_type‘clamped’) 并给出导数值。在论文中写明你使用的边界条件及其理由这能展示你对模型细节的掌控力。7.6 忽略插值函数的可调用性在MATLAB和Python中获得插值结果后你得到的往往是一个函数对象如cs CubicSpline(...)。这个对象可以像普通函数一样调用cs(新的x值)非常方便进行后续计算或集成到更大的模型中。高效做法不要每次都重新拟合。先构建好插值函数对象然后在需要的地方反复调用它。# 好做法 interp_func CubicSpline(x_data, y_data) # 构建一次 result1 interp_func(new_x1) result2 interp_func(new_x2) # ... 在循环或其它函数中多次使用 # 不好做法低效 result1 np.interp(new_x1, x_data, y_data) result2 np.interp(new_x2, x_data, y_data) # 每次都要重新处理数据插值是把离散数据转化为连续模型的桥梁选对方法、理解原理、避开陷阱这座桥才能建得稳固可靠。在数学建模中清晰阐述你选择某种插值方法的理由并展示对其误差和局限性的认识远比单纯堆砌代码和图表更能打动评委。下半部分我们将走进另一片广阔天地——拟合看看当数据充满噪声时我们如何拨开迷雾寻找那条最本质的趋势线。