一、定义
在 Python 中,插值(Interpolation)是一种通过已知数据点估算未知值的技术,常用于数据补全、信号处理、数值分析等领域。
二、分类
在Python中使用到的插值运算方法主要有线性插值 (Linear Interpolation)、多项式插值 (Polynomial Interpolation)等,下面分别介绍:
(一)、线性插值 (Linear Interpolation)
线性插值主要是根据两点之间用直线连接,假设相邻点的变化率恒定的原理,去处理数据变化平缓且误差容忍度较高的情况。
代码:
import numpy as np
x = np.array([0, 1, 2, 3, 4])
y = np.array([0, 2, 4, 6, 8])
new_x = 2.5
linear_interp = np.interp(new_x, x, y)
print(linear_interp)
分析:给两个等差数列x,y,new_x是用来定义插值的位置的,该值位于x=2和x=3之间,np.interp()函数便是线性插值函数:
numpy.interp(x_new, x, y, left=None, right=None, period=None)
x_new | 标量或数组 | 需要插值的新位置(可以是单个值或一维数组)。 |
x | 一维数组 | 已排序的已知数据点的 x 坐标(必须单调递增)。 |
y | 一维数组 | 已知数据点的 y 坐标,长度与 x 相同。 |
left | 可选 | 当 x_new < x[0] 时的返回值,默认值为 y[0] 。 |
right | 可选 | 当 x_new > x[-1] 时的返回值,默认值为 y[-1] 。 |
period | 可选 | 若数据是周期性的,指定周期长度(默认无周期性)。 |
对于每个 x_new[i]
,找到其在 x
数组中的插入位置 idx
,使得
x[idx] <= x_new[i] <= x[idx+1]
。根据相邻点 (x[idx], y[idx])
和 (x[idx+1], y[idx+1])
,按比例计算插值结果:
返回值是在x_new位置处插值的结果。
上面代码的结果简单理解便是给x里的一个值,得到y里对应的值。输出为:5。
(二)、多项式插值 (Polynomial Interpolation)
多项式插值是根据找到一个多项式函数完全经过所有点;但缺点是容易产生龙格现象,高阶多项式振荡剧烈。
代码:
import numpy as np
def lagrange_interpolation(x_data, y_data, x):
n = len(x_data)
result = 0.0
for i in range(n):
# 构造第 i 个拉格朗日基函数 L_i(x)
term = y_data[i]
for j in range(n):
if j != i:
term *= (x - x_data[j]) / (x_data[i] - x_data[j])
result += term
return result
# 示例数据(x^2 函数采样)
x_data = np.array([0, 1, 2, 3, 4])
y_data = x_data**2
# 插值点
new_x = 1.5
new_y = lagrange_interpolation(x_data, y_data, new_x)
print(f"拉格朗日插值结果: x={new_x:.1f}, y={new_y:.3f}") # 输出: 2.250(正确值为 2.25)
分析:在上面的示例中,使用到的是典型的拉格朗日函数插值
x_data: 已知数据点的 x 坐标
y_data: 已知数据点的 y 坐标
new_x: 需要插值的目标点
n:为数据点数量
result:用于累加所有基函数的加权和
数学模型:
基函数构造:对每个i,构造基函数
加权求和:累加到结果里。