You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何四点二次插值生成的曲线呈现三次多项式形态?

为什么scipy.interp1d的quadratic插值得到的不是二次曲线?

测试代码

import numpy as np
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt

# 定义四个数据点
x = np.array([0, 1, 2, 3])  # 点的x坐标
y = np.array([0, 1, 0, 1])  # 点的y坐标

# 创建二次插值函数
f = interp1d(x, y, kind='quadratic')

# 生成更密集的x网格用于绘图
x_interp = np.linspace(min(x), max(x), 1000)

# 计算插值后的y值
y_interp = f(x_interp)

# 绘制原始点和插值曲线
plt.scatter(x, y, label='原始数据点')
plt.plot(x_interp, y_interp, label='二次插值曲线')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.title('4个数据点的二次插值')
plt.show()

现象说明

运行上述代码后,得到的曲线并非单一的二次抛物线,而是呈现出类似三次多项式的形态——曲线存在两个拐点,在每个原始数据点的子区间内呈现不同的凹凸性。

核心疑问

interp1d函数内部发生了什么?为何生成的曲线不是二次曲线?

原因解析

  • 全局二次插值的局限性:单一的二次多项式只有3个参数,无法精确拟合4个独立的数据点(4个点会产生4个约束方程,超出参数数量),因此不可能生成全局的二次曲线。
  • interp1d的quadratic是分段二次样条:scipy.interp1d中kind='quadratic'的实际含义是分段二次样条插值,而非全局二次多项式插值。函数会将整个x区间拆分为多个子区间(此处为[0,1]、[1,2]、[2,3]三个区间),每个子区间内单独拟合一条二次多项式曲线。
  • 平滑性约束:为了保证曲线整体平滑,相邻子区间的二次多项式需要满足:在节点处函数值相等、一阶导数连续;同时默认应用"not-a-knot"边界条件(让首尾分段的二阶导数在相邻节点处相等),避免边界处出现突兀的转折。
  • 视觉类似三次曲线的原因:每个子区间的二次多项式凹凸性可以不同,拼接后整体曲线会出现多个拐点(此处为2个),与三次多项式的拐点数量一致,因此视觉上看起来类似三次曲线,但本质是多条二次曲线的平滑拼接。

内容的提问来源于stack exchange,提问作者Steve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 15:32:09