使用Scipy Lagrange插值报除零错误且多项式系数为无穷如何解决
问题排查结果
直接原因:输入x数组存在未被检出的重复值
你提供的30个x样本中,索引为26和29的两个值均为302.487,去重后仅剩余29个唯一值,完全符合拉格朗日插值除零错误的触发条件。拉格朗日基函数的分母项为x_i - x_j,两个x坐标完全相等时会直接触发除零,最终返回无穷值的多项式系数。
你可以通过以下代码验证重复值:
import numpy as np x = np.array([273.324,285.579,309.292,279.573,297.427,290.681,276.621,293.586,283.463,284.674,273.904,288.064,280.125,294.269,288.51,285.898,273.419,273.023,281.754,281.546,283.21,303.399,297.392,293.359,306.404,356.285,302.487,280.586,299.487,302.487]) print("原始x长度:", len(x)) print("去重后x长度:", len(np.unique(x))) print("重复的x值:", [v for v in np.unique(x) if np.sum(x == v) > 1])
额外注意:拉格朗日插值的数值稳定性限制
即使删除重复值,30个节点的高阶拉格朗日插值也存在严重的数值不稳定问题,浮点计算误差会被指数级放大,仍然大概率得到异常的系数结果。生产场景中不建议使用节点数超过10的拉格朗日插值,优先选择三次样条插值等更稳定的方案。
修复代码示例
import numpy as np from scipy.interpolate import CubicSpline # 原始数据处理 x = out["x"].round(decimals=3) y = out["y"].round(decimals=3) # 去重 _, idx = np.unique(x, return_index=True) x_unique = x[idx] y_unique = y[idx] # 按x升序排序(样条插值要求输入x严格递增) sort_idx = np.argsort(x_unique) x_sorted = x_unique[sort_idx] y_sorted = y_unique[sort_idx] # 插值计算 pol = CubicSpline(x_sorted, y_sorted) print(pol)
内容的提问来源于stack exchange,提问作者wladyk
相关产品推荐
相关产品推荐

