能否使用NumPy绘制给定x、y值的线性插值图?如何打印图表所用插值函数?
打印NumPy线性插值所用函数的实现方法
np.interp 本身没有提供直接获取、打印内部插值函数的内置接口,它的插值逻辑是基于逐段线性规则实现的,我们可以通过推导分段表达式还原并打印完整的插值函数。
核心逻辑对齐
要打印的函数必须和你绘图、插值计算的逻辑完全一致,首先需要匹配np.interp的内置节点处理规则:
np.interp会默认对输入的x值做非降排序- 对于取值完全重合的重复x节点,会自动取对应y值的最小值作为该点的插值边界
- 相邻两个节点之间的区间,使用两点连线的线性函数做插值计算
根据两点式直线方程,相邻节点(x_i, y_i)和(x_{i+1}, y_{i+1})之间的插值函数为:
f(x) = y_i + ((y_{i+1} - y_i) / (x_{i+1} - x_i)) * (x - x_i)
适用范围:x ∈ [x_i, x_{i+1}]
可直接复用的实现代码
import numpy as np import matplotlib.pyplot as plt x = [700, 701, 702, 702] y = [46, 48, 45, 45] # 整理有效插值节点,和np.interp的处理逻辑保持一致 sorted_pairs = sorted(zip(x, y)) node_map = {} for xi, yi in sorted_pairs: if xi not in node_map or yi < node_map[xi]: node_map[xi] = yi xs = sorted(node_map.keys()) ys = [node_map[xi] for xi in xs] # 逐段计算并打印插值函数 print("当前图表所用线性插值的分段函数如下:") for idx in range(len(xs)-1): x_left, x_right = xs[idx], xs[idx+1] y_left, y_right = ys[idx], ys[idx+1] slope = (y_right - y_left) / (x_right - x_left) intercept = y_left - slope * x_left print(f"- 当 x 处于 [{x_left}, {x_right}] 区间时,f(x) = {slope:.2f}x + {intercept:.2f}") # 保留原有插值计算与绘图逻辑 x_new = [701] y_new = np.interp(x_new, x, y) plt.plot(x, y, "og-", x_new, y_new, "or")
实际运行输出
针对你提供的示例数据,代码会输出如下内容:
当前图表所用线性插值的分段函数如下: - 当 x 处于 [700, 701] 区间时,f(x) = 2.00x + -1354.00 - 当 x 处于 [701, 702] 区间时,f(x) = -3.00x + 2151.00
补充说明
np.interp是分段线性实现,不存在覆盖全x范围的单一全局函数,以上打印的分段表达式拼接起来就是完整的插值逻辑- 后续如果调整原x、y值,这套代码会自动重新计算所有分段的表达式,不需要手动修改公式
内容的提问来源于stack exchange,提问作者Lea
相关产品推荐
相关产品推荐

