使用interpn进行曲面点插值结果异常,求问题排查方案
scipy.interpolate.interpn 插值错误排查方案
核心错误点及修正
网格与数据维度不匹配
interpn要求points参数的网格维度必须和values的形状严格对应。比如X是(100,)、Y是(100,)的一维网格,对应的values必须是(100,100)的二维数组,且顺序要和points一致——如果points传入(X,Y),values的第一维度对应X,第二维度对应Y,搞反顺序会直接导致插值结果错乱。插值点维度顺序错误
待插值点xi的顺序必须和points的顺序完全匹配。比如points是(X,Y),那xi必须是N×2的数组,每一行是[x值, y值],若写成[y值, x值],插值结果会完全偏离真实值,这是最常见的低级错误。网格非严格单调
interpn要求每个网格维度必须是严格单调递增或递减的。若网格存在重复值、乱序,函数会出现未定义行为。可通过np.all(np.diff(X) > 0)或np.all(np.diff(X) < 0)快速检查网格单调性。插值方法或边界处理不当
默认method='linear'在网格稀疏时误差较大,非线性函数建议尝试method='cubic'(仅适用于规则网格);若插值点超出原始网格范围,需显式设置bounds_error=False并指定fill_value(外插结果可靠性有限,需谨慎使用)。
修正后参考代码
import numpy as np from scipy.interpolate import interpn # 生成严格单调的规则网格 X = np.linspace(-5, 5, 100) Y = np.linspace(-5, 5, 100) # 用indexing='ij'保证网格维度与points顺序一致 X_grid, Y_grid = np.meshgrid(X, Y, indexing='ij') # 定义目标函数 def f(X, Y): return np.sin(np.sqrt(X**2 + Y**2)) # 计算网格上的函数值,维度与网格对应 values = f(X_grid, Y_grid) # 生成待插值的(x,y)点 t = np.linspace(0, 10, 200) def g(t): return np.cos(t), np.sin(t) x_new, y_new = g(t) # 整理插值点,顺序与points(X,Y)一致 xi = np.column_stack((x_new, y_new)) # 执行插值 interpolated_vals = interpn( points=(X, Y), values=values, xi=xi, method='cubic', bounds_error=False, fill_value=None ) # 计算真实值用于对比 true_vals = f(x_new, y_new)
内容的提问来源于stack exchange,提问作者lchavez
相关产品推荐
相关产品推荐

