拉格朗日插值算法原理及简单示例

拉格朗日插值法,是一种通过巧妙地构造一组基函数并将它们线性组合起来,得到一个曲线精准通过所有离散点的表达式的方法,通常用来预测中间未知点的值。

一、算法原理

给定一组点\((x_1,y_1),(x_2,y_2),...,(x_n,y_n)\),构造一个次数不超过 n 的多项式\(L(x)\),满足 \(L(x_i)=y_i, i=1,2,...,n\),函数曲线严格穿过了所有已知点。

表达式的构造采用这样一种巧妙的形式,基于已知点自变量构造分式,使其在已知点处恒为1,其他恒为0,即

\L(x)=\\sum_{i=0}\^{n}{\\left( y_i\\cdot\\prod_{j=0 \\\\ j\\ne i}\^{n} \\frac{x-x_j}{x_i-x_j}\\right)} \\

其中\(\prod_{j=0 \\ j\ne i}^{n} \frac{x-x_j}{x_i-x_j}\)称为拉格朗日基函数,它在\(x_i\)的值为1,其他为0。

这样,函数刚好在\(x_i\)处取得值\(y_i\)。

二、示例

现基于三个点(1,2)、(2,3)、(3,5),构造拉格朗日插值函数,并计算在 x=2.5 处的函数值。

根据已知点,由拉格朗日插值算法构造函数为

\\\begin{aligned} L(x) \&=y_0\\cdot\\frac{(x-x_1)(x-x_2)}{(x_0-x_1)(x_0-x_2)}+y_1\\cdot\\frac{(x-x_0)(x-x_2)}{(x_1-x_0)(x_1-x_2)}+y_2\\cdot\\frac{(x-x_0)(x-x_1)}{(x_2-x_0)(x_2-x_1)} \\\\ \&=2\\cdot\\frac{(x-2)(x-3)}{(1-2)(1-3)}+3\\cdot\\frac{(x-1)(x-3)}{(2-1)(2-3)}+5\\cdot \\frac{(x-1)(x-2)}{(3-1)(3-2)} \\end{aligned} \\

当x=2.5时,计算得y=3.875。

三、Python实现

python 复制代码
'''
拉格朗日插值算法示例:基于三个点(1,2)、(2,3)、(3,5),构造拉格朗日插值函数,并计算在 x=2.5 处的函数值。
'''

def lagrange_interpolation(x_points, y_points, x):
    """
    拉格朗日插值法(三点版)
    :param x_points: 已知点的x坐标列表,长度为3
    :param y_points: 已知点的y坐标列表,长度为3
    :param x: 需要插值的x值
    :return: 插值得到的y值
    """
    # 解包三个已知点的x坐标
    x0, x1, x2 = x_points
    # 解包三个已知点的y坐标
    y0, y1, y2 = y_points

    # 计算三个拉格朗日基函数
    l0 = ((x - x1) * (x - x2)) / ((x0 - x1) * (x0 - x2))
    l1 = ((x - x0) * (x - x2)) / ((x1 - x0) * (x1 - x2))
    l2 = ((x - x0) * (x - x1)) / ((x2 - x0) * (x2 - x1))

    # 计算插值结果
    y = y0 * l0 + y1 * l1 + y2 * l2
    return y


# 示例:三个已知点 (1,2)、(2,3)、(3,5)
x_points = [1, 2, 3]
y_points = [2, 3, 5]

# 计算x=2.5处的插值结果
interpolated_x = 2.5
interpolated_y = lagrange_interpolation(x_points, y_points, interpolated_x)

# 输出结果
print(f"已知点:x={x_points}, y={y_points}")
print(f"插值点 x={interpolated_x} 对应的y值为:{interpolated_y:.4f}")

# 验证:计算已知点的插值结果(应该等于原y值)
print("\n验证已知点插值结果:")
for x in x_points:
    y = lagrange_interpolation(x_points, y_points, x)
print(f"x={x} 插值结果:y={y:.4f} (原y值:{y_points[x_points.index(x)]})")

End.

相关推荐
遇码7 小时前
流式调用中途断连别直接报错:瞬态故障识别、退避重试与中文根因诊断的搭建方法
大数据·人工智能·ai·rust·数据分析·大模型·agent
HPtiger7 小时前
数据结构——选择排序
数据结构·算法·排序算法
康实训8 小时前
老年评估仿真实训平台架构设计与老年人能力评估实训室教学落地实践
大数据·人工智能·算法·实训室·实训室建设
DongQiShanRen8 小时前
六根硬件映射(四):归属澄清、两处不一致与卷十一总表
开发语言·人工智能·算法·rust·哈希算法·集成学习
CCblandy8 小时前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构
quantdash_cc8 小时前
Pandas 处理分钟级股票行情:从原始数据清洗到 K 线聚合
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
丑梨数据8 小时前
信创环境里跑文档工具:格式兼容与本地合规的几个坑
数据结构·人工智能·算法·决策树·排序算法
roman_日积跬步-终至千里9 小时前
【数据Agent论文·查询与语义|05】Spider:为什么换一个数据库,模型就不会查了?
数据库·数据分析
roman_日积跬步-终至千里9 小时前
【数据Agent论文·分析工作流|18】TaskWeaver:数据Agent为什么需要有状态执行?
数据分析
erzong23110 小时前
Linux操作系统:线程概念与控制
linux·算法