当前位置: 首页 > news >正文

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

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

一、算法原理

给定一组点\((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实现

'''
拉格朗日插值算法示例:基于三个点(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 * l2return 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.

http://www.jsqmd.com/news/447042/

相关文章:

  • 终极指南:为什么选择Lovefield关系型数据库而非IndexedDB
  • 银行家算法-安全性检查算法(C语言实现)
  • 终极指南:如何用vex.js插件系统打造自定义对话框
  • xctool测试报告分析终极指南:5分钟快速解读JUnit和Phabricator报告
  • 不同输入函数的区别比较及send和sendline使用
  • 为什么React Dev Inspector是2024年前端开发的必备工具?
  • 如何快速掌握Mio高性能I/O库:探索os-poll和net核心功能的终极指南
  • 如何快速生成精准上传漏洞字典?upload-fuzz-dic-builder完全使用指南
  • 交流异步电动机变频矢量控制仿真的控制效果良好
  • EVE API完全指南:函数对象与SIMD类型深度解析
  • USWDS与现代化框架集成终极指南:React、Angular和Vue的最佳实践
  • aHash高级特性:编译时/运行时RNG选择与no_std环境配置
  • 如何使用MagicClothing:AI服装驱动图像合成的完整指南
  • 自动驾驶数据集标注与检测对比:Streamlit Demo: The Udacity Self-driving Car Image Browser 实战教程
  • 彻底解决结构化数据痛点:TensorFlow Fold动态计算图实战指南
  • 为何 LoRA 初始化 B=0 而 A 为高斯分布初始化?
  • wps加载项打包成exe
  • 10分钟上手pretty-quick:让代码格式化效率提升10倍的实战指南
  • wit-bindgen高级特性:类型别名、资源管理与异步支持完全攻略
  • 岐金兰空论
  • 为什么gh_mirrors/cr/cross_browser能跨浏览器追踪用户?核心算法解析
  • Glass终极隐私保护:为什么它永远不会出现在屏幕录制中
  • Input Leap企业部署终极指南:多用户环境下的配置管理与安全策略
  • 终极Githug插件系统架构解析:如何快速扩展Git学习功能的完整指南
  • 如何快速掌握Facebook xctool测试框架:从入门到精通的完整指南
  • twentytwenty实战案例:打造响应式图片对比界面的简单步骤
  • Mutate高级配置:如何设置热键、关键词和主题个性化
  • cryptocurrency-arbitrage:揭秘800+加密货币跨50个市场的套利机会计算器
  • 本地化JSON 处理新方案:基于 Docker的JSON Hero部署全记录
  • Pux Mux类深度解析:掌握路由定义与分发核心机制