拉格朗日插值多项式的原理介绍及其应用

2023-11-09

  插值,不论在数学中的数值分析中,还是在我们实际生产生活中,都不难发现它的身影,比如造船业和飞机制造业中的三次样条曲线。那么,什么是插值呢?我们可以先看一下插值的定义,如下:

  (定义)如果对于每个 1 ≤ i ≤ n , P ( x i ) = y i 1 \leq i \leq n,P(x_{i})=y_{i} 1in,P(xi)=yi,则称函数 y = P ( x ) y=P(x) y=P(x)插值数据点 ( x 1 , y 1 ) , . . . , ( x n , y n ) (x_{1},y_{1}),...,(x_{n},y_{n}) (x1,y1),...,(xn,yn).

   插值的定义无疑是清楚明了的,而在众多的数学函数中,多项式无疑是最简单,最常见的函数,关于它的理论研究也最为透彻。因此,我们可以不妨先考虑利用多项式来进行插值。那么,这样的多项式是否总是存在呢?答案是肯定的,因为我们有如下定理:

  (多项式插值定理)令 ( x 1 , y 1 ) , . . . , ( x n , y n ) (x_{1},y_{1}),...,(x_{n},y_{n}) (x1,y1),...,(xn,yn)是平面中的 n n n个点,各 x i x_{i} xi互不相同。则有且仅有一个 n − 1 n-1 n1次或者更低的多项式 P P P满足 P ( x i ) = y i , i = 1 , 2 , . . . , n . P(x_{i})=y_{i},i=1,2,...,n. P(xi)=yi,i=1,2,...,n.

  **证明:**先用归纳法证明存在性,再证明唯一性。
  当 n = 1 n=1 n=1时,常函数(0次) P 1 ( x ) = y 1 P_{1}(x)=y_{1} P1(x)=y1即符合要求。假设当 n − 1 n-1 n1时存在一个次数 ≤ n − 2 \leq n-2 n2的多项式 P n − 1 P_{n-1} Pn1,使得 P n − 1 ( x i ) = y i , i = 1 , 2 , . . . , n − 1. P_{n-1}(x_{i})=y_{i},i=1,2,...,n-1. Pn1(xi)=yi,i=1,2,...,n1.则令 P n ( x ) = P n − 1 ( x ) + c ( x − x 1 ) ( x − x 2 ) . . . ( x − x n − 1 ) ( x − x n ) P_{n}(x)=P_{n-1}(x)+c(x-x_{1})(x-x_{2})...(x-x_{n-1})(x-x_{n}) Pn(x)=Pn1(x)+c(xx1)(xx2)...(xxn1)(xxn),其中 c c c为待定系数,利用 P n ( x n ) = y n P_{n}(x_{n})=y_{n} Pn(xn)=yn即可求出待定系数 c c c.此时, P n ( x i ) = y i , i = 1 , 2 , . . . , n , P_{n}(x_{i})=y_{i},i=1,2,...,n, Pn(xi)=yi,i=1,2,...,n, P n ( x ) P_{n}(x) Pn(x)的次数 ≤ n − 1 \leq n-1 n1.这样就证明了存在性。
  其次证明唯一性。假设存在两个这样的多项式,设为 P ( x ) P(x) P(x) Q ( x ) Q(x) Q(x),它们次数 ≤ n − 1 \leq n-1 n1且都插值经过 n n n个点,即 P ( x i ) = Q ( x i ) = y i , i = 1 , 2 , . . . , n . P(x_{i})=Q(x_{i})=y_{i},i=1,2,...,n. P(xi)=Q(xi)=yi,i=1,2,...,n. H ( x ) = P ( x ) − Q ( x ) H(x)=P(x)-Q(x) H(x)=P(x)Q(x), H H H的次数也 ≤ n − 1 \leq n-1 n1,且有 n n n个不同的根 x 1 , x 2 , . . . , x n x_{1},x_{2},...,x_{n} x1,x2,...,xn.因此,由多项式基本定理可知, H ( x ) H(x) H(x)为0多项式,即恒等于0,故有 P ( x ) = Q ( x ) P(x)=Q(x) P(x)=Q(x).这样就证明了存在性。
  证毕。

  有了以上定理,我们可以放心地使用多项式进行插值,同时,通过上述定理,我们可以用归纳法来构造此多项式,但是,这样的方法难免复杂麻烦。于是,天才的法国数学家拉格朗日(Lagrange)创造性地发明了一种实用的插值多项式方法来解决这个问题,那么,他的方法是怎么样的?
  一般来说,如果我们有 n n n个点 ( x 1 , y 1 ) , . . . , ( x n , y n ) (x_{1},y_{1}),...,(x_{n},y_{n}) (x1,y1),...,(xn,yn),各 x i x_{i} xi互不相同。对于1到n之间的每个 k k k,定义 n − 1 n-1 n1次多项式
L k ( x ) = ( x − x 1 ) . . ( x − x k − 1 ) ( x − x k + 1 ) . . . ( x − x n ) ( x k − x 1 ) . . ( x k − x k − 1 ) ( x k − x k + 1 ) . . . ( x k − x n ) L_{k}(x) = \frac{(x-x_{1})..(x-x_{k-1})(x-x_{k+1})...(x-x_{n})}{(x_{k}-x_{1})..(x_{k}-x_{k-1})(x_{k}-x_{k+1})...(x_{k}-x_{n})} Lk(x)=(xkx1)..(xkxk1)(xkxk+1)...(xkxn)(xx1)..(xxk1)(xxk+1)...(xxn)
L k ( x ) L_{k}(x) Lk(x)具有有趣的性质: L k ( x k ) = 1 , L k ( x j ) = 0 , j ≠ k . L_{k}(x_{k})=1,L_{k}(x_{j})=0,j\neq k. Lk(xk)=1,Lk(xj)=0,j=k.然后定义一个 n − 1 n-1 n1次多项式
P n − 1 ( x ) = y 1 L 1 ( x ) + . . . + y n L n ( x ) . P_{n-1}(x)=y_{1}L_{1}(x)+...+y_{n}L_{n}(x). Pn1(x)=y1L1(x)+...+ynLn(x).
这样的多项式 P n − 1 ( x ) P_{n-1}(x) Pn1(x)满足 P n − 1 ( x i ) = y i , i = 1 , 2 , . . . , n . P_{n-1}(x_{i})=y_{i},i=1,2,...,n. Pn1(xi)=yi,i=1,2,...,n.这就是著名的拉格朗日插值多项式!
  以上就是拉格朗日插值多项式的理论介绍部分,接下来我们就要用Python中的Sympy模块来实现拉格朗日插值多项式啦~~
  实现拉格朗日插值多项式的Python代码如下:

from sympy import *

def Lagrange_interpolation(keys, values):
    x = symbols('x')
    t = len(keys)
    ploy = []
    for i in range(t):
        lst = ['((x-'+str(_)+')/('+str(keys[i])+'-'+str(_)+'))' for _ in keys if _ != keys[i]]
        item = '*'.join(lst)
        ploy.append(str(values[i])+'*'+item)
    ploy = '+'.join(ploy)
    
    return factor(expand(ploy))

def main():
    #example 1, interpolate a line 
    x_1 = [1,2]
    y_1 = [3,5]
    if len(x_1) != len(y_1):
        print('The lengths of two list are not equal!')
    else:
        print('Lagrange_interpolation polynomials is:')
        print(Lagrange_interpolation(x_1,y_1))
    
    #example 2, interpolate a parabola
    x_2 = [0,2,3]
    y_2 = [1,2,4]
    if len(x_2) != len(y_2):
        print('The lengths of two list are not equal!')
    else:
        print('Lagrange_interpolation polynomials is:')
        print(Lagrange_interpolation(x_2,y_2))
    
    #example 3
    x_3 = [0,1,2,3]
    y_3 = [2,1,0,-1]
    if len(x_3) != len(y_3):
        print('The lengths of two list are not equal!')
    else:
        print('Lagrange_interpolation polynomials is:')
        print(Lagrange_interpolation(x_3,y_3))
        
main()

函数Lagrange_interpolation()具体实现了拉格朗日插值多项式,参数(keys, values)为list形式的点对,在main()函数中举了三个Lagrange_interpolation()函数的应用实例,一个是插值两个点,即直线,一个是插值三个点,即抛物线,一个是插值四个点,但结果却是一次多项式。该程序的运行结果如下:

![程序运行结果](https://img-blog.csdn.net/20180108220343531?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamNsaWFuOTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
  接下来,我们将介绍一个拉格朗日插值多项式的应用,即求 $$1^{k}+2^{k}+...+x^{k}$$ 的求和公式,其中$x,k$为正整数。分析如下:   首先,该求和公式应当是一个至多为k+1次的关于$x$的多项式。然后,我们可以通过取k+2个不同的点,利用拉格朗日插值多项式的办法来求解,这k+2个不同的点的横坐标可以取$x=1,2,...,k+2$,在求出其对应的纵坐标的值。   以下代码分别求出$k=1,2,...,50$的求和公式,并将其插入到Redis中。 ```python from sympy import * import redis

def Lagrange_interpolation(keys, values):
x = symbols(‘x’)
t = len(keys)
ploy = []
for i in range(t):
lst = [‘((x-’+str()+‘)/(’+str(keys[i])+‘-’+str()+‘))’ for _ in keys if _ != keys[i]]
item = ‘‘.join(lst)
ploy.append(str(values[i])+’
’+item)
ploy = ‘+’.join(ploy)

return factor(expand(ploy))

def degree_of_sum(k):
x_list, y_list = [], []
degree = k # degree=k in expression of 1k+2k+…+x^{k}
cul_sum = 0
for i in range(1,degree+3):
x_list.append(i)
cul_sum += i**degree
y_list.append(cul_sum)
return Lagrange_interpolation(x_list,y_list)

def main():
r = redis.Redis(host=‘localhost’, port=6379,db=0)
for k in range(1,51):
expression = str(degree_of_sum(k))
r.hset(‘sum_%s’%k,‘degree’,str(k))
r.hset(‘sum_%s’%k,‘expression’,expression)
print(‘Degree of %d inserted!’%k)

main()

运行以上程序,结果如下:
<center>
![程序运行结果](https://img-blog.csdn.net/20180108221925388?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamNsaWFuOTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
</center>
在Redis中的储存结果如下:
<center>
![Redis中储存结果](https://img-blog.csdn.net/20180108221948384?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamNsaWFuOTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
</center>
我们可以具体查看当$k=2$时的求和公式,如下:
<center>
![k=2时的求和公式](https://img-blog.csdn.net/20180108222038385?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamNsaWFuOTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
</center>
&emsp;&emsp;这样我们就介绍完了一个拉格朗日插值多项式的应用了。看了上面的介绍,聪明又机智的你是否能想到更多拉格朗日插值多项式的应用呢?欢迎大家交流哦~~
&emsp;&emsp;新的一年,新的气象,就从这一篇开始~

***注意:***本人现已开通微信公众号: NLP奇幻之旅(微信号为:easy_web_scrape), 欢迎大家关注哦~~
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

拉格朗日插值多项式的原理介绍及其应用 的相关文章

  • 使用 pythonbrew 编译 Python 3.2 和 2.7 时出现问题

    我正在尝试使用构建多个版本的 python蟒蛇酿造 http pypi python org pypi pythonbrew 0 7 3 但我遇到了一些测试失败 这是在运行的虚拟机上 Ubuntu 8 04 32 位 当我使用时会发生这种情
  • 在 python 程序中合并第三方库的最佳实践是什么?

    下午好 我正在为我的工作编写一个中小型Python程序 该任务需要我使用 Excel 库xlwt and xlrd 以及一个用于查询 Oracle 数据库的库 称为CX Oracle 我正在通过版本控制系统 即CVS 开发该项目 我想知道围
  • 将数据从 python pandas 数据框导出或写入 MS Access 表

    我正在尝试将数据从 python pandas 数据框导出到现有的 MS Access 表 我想用已更新的数据替换 MS Access 表 在 python 中 我尝试使用 pandas to sql 但收到错误消息 我觉得很奇怪 使用 p
  • 为 Anaconda Python 安装 psycopg2

    我有 Anaconda Python 3 4 但是每当我运行旧代码时 我都会通过输入 source activate python2 切换到 Anaconda Python 2 7 我的问题是我为 Anaconda Python 3 4 安
  • 通过最小元素比较对 5 个元素进行排序

    我必须在 python 中使用元素之间的最小比较次数来建模对 5 个元素的列表进行排序的执行计划 除此之外 复杂性是无关紧要的 结果是一个对的列表 表示在另一时间对列表进行排序所需的比较 我知道有一种算法可以通过 7 次比较 总是在元素之间
  • 如何替换 pandas 数据框列中的重音符号

    我有一个数据框dataSwiss其中包含瑞士城市的信息 我想用普通字母替换带有重音符号的字母 这就是我正在做的 dataSwiss Municipality dataSwiss Municipality str encode utf 8 d
  • 如何从网页中嵌入的 Tableau 图表中抓取工具提示值

    我试图弄清楚是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入图形中抓取工具提示值 以下是当用户将鼠标悬停在条形上时带有工具提示的图表示例 我从要从中抓取的原始网页中获取了此网址 https covid19 colo
  • 是否可以忽略一行的pyright检查?

    我需要忽略一行的pyright 检查 有什么特别的评论吗 def create slog group SLogGroup data Optional dict None SLog insert one SLog group group da
  • Python 函数可以从作用域之外赋予新属性吗?

    我不知道你可以这样做 def tom print tom s locals locals def dick z print z name z name z guest Harry print z guest z guest print di
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一
  • AWS EMR Spark Python 日志记录

    我正在 AWS EMR 上运行一个非常简单的 Spark 作业 但似乎无法从我的脚本中获取任何日志输出 我尝试过打印到 stderr from pyspark import SparkContext import sys if name m
  • 添加不同形状的 numpy 数组

    我想添加两个不同形状的 numpy 数组 但不进行广播 而是将 缺失 值视为零 可能最简单的例子是 1 2 3 2 gt 3 2 3 or 1 2 3 2 1 gt 3 2 3 1 0 0 我事先不知道形状 我正在弄乱每个 np shape
  • Flask如何获取请求的HTTP_ORIGIN

    我想用我自己设置的 Access Control Allow Origin 标头做出响应 而弄清楚请求中的 HTTP ORIGIN 参数在哪里似乎很混乱 我在用着烧瓶 0 10 1 以及HTTP ORIGIN似乎是这个的特点之一object
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • Scrapy:如何使用元在方法之间传递项目

    我是 scrapy 和 python 的新手 我试图将 parse quotes 中的项目 item author 传递给下一个解析方法 parse bio 我尝试了 request meta 和 response meta 方法 如 sc
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • 使用 Python 的 matplotlib 选择在屏幕上显示哪些图形以及将哪些图形保存到文件中

    我想用Python创建不同的图形matplotlib pyplot 然后 我想将其中一些保存到文件中 而另一些则应使用show 命令 然而 show 显示all创建的数字 我可以通过调用来避免这种情况close 创建我不想在屏幕上显示的绘图
  • Rocket UniData/UniVerse:ODBC 无法分配足够的内存

    每当我尝试使用pyodbc连接到 Rocket UniData UniVerse 数据时我不断遇到错误 pyodbc Error 00000 00000 Rocket U2 U2ODBC 0302810 Unable to allocate
  • 如何使用 Pycharm 安装 tkinter? [复制]

    这个问题在这里已经有答案了 I used sudo apt get install python3 6 tk而且效果很好 如果我在终端中打开 python Tkinter 就可以工作 但我无法将其安装在我的 Pycharm 项目上 pip
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2

随机推荐

  • 全面接入:ChatGPT杀进15个商业应用,让AI替你打工

    智东西 智能产业新媒体 智东西专注报道人工智能主导的前沿技术发展 和技术应用带来的千行百业产业升级 聚焦智能变革 服务产业升级 ChatGPT狂飙160天 世界已经不是两个月前的样子 文 李水青 编辑 心缘 来源 智东西 ID zhidxc
  • findbug类型

    Summary Description Category BC Equals method should not assume anything about the type of its argument Bad practice BIT
  • 十九、SpringAOP切面的单例与多例

    Repository Scope prototype public class UserDao implements IUserDao public void save System out println 保存成功 无返回值 Config
  • 硬件基础——滤波

    一 滤波概念 滤波是将信号中特定波段频率滤除的操作 是抑制和防止干扰的一项重要措施 滤波器分类 1 当允许信号中较高频率的成分通过滤波器时 这种滤波器叫做高通滤波器 2 当允许信号中较低频率的成分通过滤波器时 这种滤波器叫做低通滤波器 3
  • vue echarts 三维折线图

    效果图
  • USR-WIFI232-B2(WIFI)模块没有和服务器TCP连接成功时,单片机读取USR-WIFI232-B2(WIFI)模块的MAC地址

    您想要实现什么功能 1 单片机上电后先读取WIFI模块的MAC地址 2 读取完WIFI模块的MAC地址的后 WIFI模块和上位机进行TCP通信 WIFI模块作为服务器 需要发送 a 进入AT指令配置状态 读取MAC 读取之后 发送AT EN
  • 用HL7创建含多个code item的modality worklist

    需求 DCM4CHEE做RIS DICOM服务器 用NHAPI发ORM o01消息创建worklist 问题 在同一个OBR里面没法包含多个Scheduled Protocol Code Sequence item 创建出来的worklis
  • kafka介绍

    一 kafka介绍 1 1 kafka 模型介绍 Kafka 是一个开源的 轻量级的 支持多分区 多副本 基于 Zookeeper 的分布式消息流平台 相比于其它消息系统 其有以下优点 支持发布订阅模式的消息引擎系统 储存数据流时提供容错机
  • 直观了解CNN

    CNN解释器 https poloclub github io cnn explainer GitHub https github com poloclub cnn explainer 论文 https arxiv org abs 2004
  • Buck电路的参数计算及仿真

    一 Buck电路的参数计算较为简单 可以用matlab来完成 代码如下 clear clc Vin 12 输入电压单位V Vout 5 输出电压单位V Fs 100000 开关频率单位Hz DeltaIL 0 25 电流纹波单位A Delt
  • 实战DeviceIoControl 之五:列举已安装的存储设备

    Q 前几次我们讨论的都是设备名比较清楚的情况 有了设备名 路径 就可以直接调用CreateFile打开设备 进行它所支持的I O操作了 如果事先并不能确切知道设备名 如何去访问设备呢 A 访问设备必须用设备句柄 而得到设备句柄必须知道设备路
  • nginx基础3——配置文件详解(实用功能篇)

    文章目录 一 平滑升级 二 修饰符 2 1 无修饰符效果 2 2 精准匹配 2 3 区分大小写匹配 2 4 不区分大小写匹配 2 5 匹配优先级 三 访问控制 四 用户认证 五 配置https 六 开启状态界面 七 rewrite重写url
  • [ 未完结 ] [ 小程序 lin-ui 分析 1]总起 资源导航栏

    最近由于学校项目一直在做小程序 实习那边刚好事情不是很多 就将研究重心放在了小程序上 lin ui是一位师兄在21年10月推荐给我的 当时我还是第一次独自一人负责小程序开发 那个时候csdn里面关于lin ui文章并不是很多 我自己在上手l
  • 图像处理算法 之 梯度/边缘检测(Sobel算子,拉普拉斯算子,Canny等)

    边缘检测 一 一阶微分算子 1 1 Sobel算子 1 2 Scharr算子 OpenCV函数使用 1 3 Roberts算子 二 二阶微分算子 2 1 拉普拉斯算子 OpenCV函数使用 三 Canny算法 算法流程 OpenCV 函数使
  • Unity3d多线程

    一 多线程的创建 Thread t new Thread new ThreadStart Go Thread t1 new Thread Go 两种创建方式没有区别 二 多线程的状态控制和优先级
  • Proxmox如何进入单人维护模式(重置root密码)

    官网连接 https pve proxmox com wiki Root Password Reset Root Password Reset Contents hide 1Resetting the root account passwo
  • 2023年目标检测研究进展

    综述 首先关于写这个笔记 我个人思考了很久关于以下几点 1 19年开始从做OCR用到图像和文本这种多模态联合处理的后 也就有意识的开始关注自然语言处理 这样的结果导致可能停留在前期图像上的学习和实践 停滞的研究如果在观点理解上有误希望大家给
  • VS配置QT

    1 所需环境 a Visual Studio 20xx b QT环境 网址 c QT VS插件 网址 2 安装步骤 在VS环境已经安装的情况下安装QT环境 根据自身需要选择不同的QT环境 Qt4和Qt5差别相对较大 笔者这里安装的是Qt4
  • [python爬虫之路day7]:实战之中国天气网全国城市天气情况爬取

    通过今天的学习 我们将中国天气网的所有城市天气信息按照最低温度的排序爬取出来 并将排名前10的城市可视化 通过本次学习又温习了以下 1 sort函数 可以排序 但是数据必须是整型数据 2 pyecharts的Bar库 可以进行绘制表格 代码
  • 拉格朗日插值多项式的原理介绍及其应用

    插值 不论在数学中的数值分析中 还是在我们实际生产生活中 都不难发现它的身影 比如造船业和飞机制造业中的三次样条曲线 那么 什么是插值呢 我们可以先看一下插值的定义 如下 定义 如果对于每个 1 i n P