草庐IT

拉格朗日插值法(理论详解)

旅途中的宽~ 2023-04-15 原文

一、引言

在数值分析中,拉格朗日插值法是以法国十八世纪数学家约瑟夫.拉格朗日命名的一种多项式插值方法。许多实际问题中都用函数来表示某种内在联系和规律,而不少函数都只能通过实验或观测来了解。如对实验中的某个物理量进行观测,在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测点取到观测到的值。这样的多项式称为拉格朗日多项式。

数学上来讲,拉格朗日插值法可以给出一个恰好穿过二维平面上若干个已知点的多项式函数。

对于给定的 n + 1 n+1 n+1个点 ( x 0 , y 0 )    ,    ( x 1 , y 1 )    ,    ⋯    ,    ( x n , y n ) (x_0,y_0)\;,\;(x_1,y_1)\;,\;\cdots\;,\;(x_n,y_n) (x0,y0),(x1,y1),,(xn,yn),对应于它们的次数都不超过 n n n的拉格朗日多项式 L L L只有一个。如果计入次数更高的多项式,则有无穷个,因为所有与 L L L相差 λ ( x − x 0 ) ( x − x 1 ) ⋯ ( x − x n ) \lambda(x-x_0)(x-x_1)\cdots(x-x_n) λ(xx0)(xx1)(xxn)的多项式都满足条件。例如:

已知平面上四个点:(-9,5)、(-4,2)、(-1,-2)、(7,9),拉格朗日多项式 L ( x ) L(x) L(x)(黑色)穿过所有点。而每个基本多项式 y 0 l 0 ( x )    ,    y 1 l 1 ( x )    ,    y 2 l 2 ( x )    ,    y 3 l 3 ( x ) y_0l_0(x)\;,\;y_1l_1(x)\;,\;y_2l_2(x)\;,\;y_3l_3(x) y0l0(x),y1l1(x),y2l2(x),y3l3(x)各穿过对应的一点,并在其他的三个点的 x x x值上取0。

二、定义

对某个多项式函数,已知有给定的 k + 1 k+1 k+1个取值点:
( x 0 , y 0 )    ,    ( x 1 , y 1 )    ,    ⋯    ,    ( x k , y k ) (x_0,y_0)\;,\;(x_1,y_1)\;,\;\cdots\;,\;(x_k,y_k) (x0,y0),(x1,y1),,(xk,yk)
其中, x j x_j xj对应着自变量的位置,而 y j y_j yj对应着函数在这个位置的取值。

假设任意两个不同的 x j x_j xj都互不相同,那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为:
L ( x ) : = ∑ j = 0 k y j l j ( x ) L(x):=\sum_{j=0}^ky_jl_j(x) L(x)=j=0kyjlj(x)
其中,每个 l j ( x ) l_j(x) lj(x)为拉格朗日基本多项式(或称插值基函数),其表达式为:
l j ( x ) : = ∏ i = 0 , i ≠ j k x − x i x j − x i = x − x 0 x j − x 0 ⋯ x − x j − 1 x j − x j − 1 x − x j + 1 x j − x j + 1 ⋯ x − x k x j − x k l_j(x):=\prod_{i=0,i\neq j}^k\frac{x-x_i}{x_j-x_i}=\frac{x-x_0}{x_j-x_0}\cdots \frac{x-x_{j-1}}{x_j-x_{j-1}}\frac{x-x_{j+1}}{x_j-x_{j+1}}\cdots\frac{x-x_k}{x_j-x_k} lj(x):=i=0,i=jkxjxixxi=xjx0xx0xjxj1xxj1xjxj+1xxj+1xjxkxxk
拉格朗日基本多项式 l j ( x ) l_j(x) lj(x)的特点是在 x j x_j xj上的取值为1,在其他的点 x i    ,    i ≠ j x_i\;,\;i\neq j xi,i=j上取值为0。

三、范例

假设有某个二次多项式函数 f f f,已知它在三个点上的取值为:
f ( 4 ) = 10    ,    f ( 5 ) = 5.25    ,    f ( 6 ) = 1 f(4)=10\;,\;f(5)=5.25\;,\;f(6)=1 f(4)=10,f(5)=5.25,f(6)=1
需要求 f ( 18 ) f(18) f(18)的值。

首先写出每个拉格朗日基本多项式:
l 0 ( x ) = ( x − 5 ) ( x − 6 ) ( 4 − 5 ) ( 4 − 6 ) l_0(x)=\frac{(x-5)(x-6)}{(4-5)(4-6)} l0(x)=(45)(46)(x5)(x6)
l 1 ( x ) = ( x − 4 ) ( x − 6 ) ( 5 − 4 ) ( 5 − 6 ) l_1(x)=\frac{(x-4)(x-6)}{(5-4)(5-6)} l1(x)=(54)(56)(x4)(x6)
l 2 ( x ) = ( x − 4 ) ( x − 5 ) ( 6 − 4 ) ( 6 − 5 ) l_2(x)=\frac{(x-4)(x-5)}{(6-4)(6-5)} l2(x)=(64)(65)(x4)(x5)
然后应用拉格朗日插值法,就可以得到 P P P的表达式( P P P为函数 f f f的插值函数):
P ( x ) = f ( 4 ) l 0 ( x ) + f ( 5 ) l 1 ( x ) + f ( 6 ) l 2 ( x ) P(x)=f(4)l_0(x)+f(5)l_1(x)+f(6)l_2(x) P(x)=f(4)l0(x)+f(5)l1(x)+f(6)l2(x)
代入我们上面的公式:
P ( x ) = 1 4 ( x 2 − 28 x + 136 ) P(x)=\frac{1}{4}(x^2-28x+136) P(x)=41(x228x+136)
此时代入数值18就可以得到所求之值:
f ( 18 ) = P ( 18 ) = − 11 f(18)=P(18)=-11 f(18)=P(18)=11

四、证明

1. 存在性

对于给定的 k + 1 k+1 k+1个点: ( x 0 , y 0 )    ,    ( x 1 , y 1 )    ,    ⋯    ,    ( x k , y k ) (x_0,y_0)\;,\;(x_1,y_1)\;,\;\cdots\;,\;(x_k,y_k) (x0,y0),(x1,y1),,(xk,yk),拉格朗日插值法的思路是找到一个在一点 x j x_j xj取值为1,而在其他点取值为0的多项式 l j ( x ) l_j(x) lj(x)。这样,多项式 y j l j ( x ) y_jl_j(x) yjlj(x)在点 x j x_j xj取值为 y j y_j yj,而在其他点取值都为0。

而多项式 L ( x ) = ∑ j = 0 k y j l j ( x ) L(x)=\sum_{j=0}^ky_jl_j(x) L(x)=j=0kyjlj(x)就可以满足:
L ( x j ) = ∑ j = 0 k y i l i ( x j ) = 0 + 0 + ⋯ + y j + ⋯ + 0 = y j L(x_j)=\sum_{j=0}^ky_il_i(x_j)=0+0+\cdots+y_j+\cdots+0=y_j L(xj)=j=0kyili(xj)=0+0++yj++0=yj
在其他点取值为0的多项式容易找到,例如:
( x − x 0 ) ( x − x 1 ) ⋯ ( x − x j − 1 ) ( x − x j + 1 ) ⋯ ( x − x k ) (x-x_0)(x-x_1)\cdots(x-x_{j-1})(x-x_{j+1})\cdots(x-x_k) (xx0)(xx1)(xxj1)(xxj+1)(xxk)
它在点 x j x_j xj取值为:
( x j − x 0 ) ( x j − x 1 ) ⋯ ( x j − x j − 1 ) ( x j − x j + 1 ) ⋯ ( x j − x k ) (x_j-x_0)(x_j-x_1)\cdots(x_j-x_{j-1})(x_j-x_{j+1})\cdots(x_j-x_k) (xjx0)(xjx1)(xjxj1)(xjxj+1)(xjxk)
由于已经假定 x i x_i xi互不相同,因此上面的取值不等于0,将多项式除以这个取值,就能得到一个满足“在 x j x_j xj取值为1,在其他店取值为0”的多项式。
l j ( x ) : = ∏ i = 0 , i ≠ j k x − x i x j − x i = x − x 0 x j − x 0 ⋯ x − x j − 1 x j − x j − 1 x − x j + 1 x j − x j + 1 ⋯ x − x k x j − x k l_j(x):=\prod_{i=0,i\neq j}^k\frac{x-x_i}{x_j-x_i}=\frac{x-x_0}{x_j-x_0}\cdots \frac{x-x_{j-1}}{x_j-x_{j-1}}\frac{x-x_{j+1}}{x_j-x_{j+1}}\cdots\frac{x-x_k}{x_j-x_k} lj(x):=i=0,i=jkxjxixxi=xjx0xx0xjxj1xxj1xjxj+1xxj+1xjxkxxk
这就是拉格朗日基本多项式。

2. 唯一性

次数不超过 k k k的拉格朗日多项式至多只有一个,因为对任意两个次数不超过 k k k的拉格朗日多项式: p 1    ,    p 2 p_1\;,\;p_2 p1,p2。它们的差 p 1 − p 2 p_1-p_2 p1p2在所有 k + 1 k+1 k+1个点上取值都为0,因此必然是多项式 ( x − x 0 ) ( x − x 1 ) ⋯ ( x − x j − 1 ) ( x − x j + 1 ) ⋯ ( x − x k ) (x-x_0)(x-x_1)\cdots(x-x_{j-1})(x-x_{j+1})\cdots(x-x_k) (xx0)(xx1)(xxj1)(xxj+1)(xxk)的倍数。

因此,如果这个差 p 1 − p 2 p_1-p_2 p1p2不等于0,次数就一定不小于 k + 1 k+1 k+1。但是 p 1 − p 2 p_1-p_2 p1p2是两个次数不超过 k k k的多项式之差,它的次数也不超过 k k k

所以 p 1 − p 2 = 0 p_1-p_2=0 p1p2=0,也就是说 p 1 = p 2 p_1=p_2 p1=p2,这就证明了唯一性。

五、优点与缺点

拉格朗日插值法的公式结构整齐紧凑,在理论分析中十分方便,然而在计算中,当插值点增加或减少一个时,所对应的基本多项式就需要全部重新计算,于是整个公式都会变化,非常繁琐。这时可以用重心拉格朗日插值法或牛顿插值法来代替。

此外,当插值点比较多的时候,拉格朗日插值多项式的次数可能会很高,因此具有数值不稳定的特点,也就是说尽管在已知的几个点取到给定的数值,但在附近却会和“实际上”的值之间有很大的偏差。

这类现象也被称为龙格现象,解决的办法是分段用较低次数的插值多项式。

六、重心拉格朗日插值法

重心拉格朗日插值法是拉格朗日插值法的一种改进。

在拉格朗日插值法中,运用多项式:
l ( x ) = ( x − x 0 ) ( x − x 1 ) ⋯ ( x − x k ) l(x)=(x-x_0)(x-x_1)\cdots(x-x_k) l(x)=(xx0)(xx1)(xxk)

拉格朗日插值法的数值稳定性:如图,用于模拟一个十分平稳的函数时,插值多项式的取值可能会突然出现一个大的偏差(图中的14至15中间)

可以将拉格朗日基本多项式重新写为:
l j ( x ) = l ( x ) x − x j 1 ∏ i = 0 , i ≠ j k ( x j − x i ) l_j(x)=\frac{l(x)}{x-x_j}\frac{1}{\prod_{i=0,i\neq j}^k(x_j-x_i)} lj(x)=xxjl(x)i=0,i=jk(xjxi)1
定义重心权:
ω j = 1 ∏ i = 0 , i ≠ j k ( x j − x i ) \omega_j=\frac{1}{\prod_{i=0,i\neq j}^k(x_j-x_i)} ωj=i=0,i=jk(xjxi)1
上面的表达式可以简化为:
l j ( x ) = l ( x ) ω j x − x j l_j(x)=l(x)\frac{\omega_j}{x-x_j} lj(x)=l(x)xxjωj
于是拉格朗日插值多项式变为:
L ( x ) = l ( x ) ∑ j = 0 k ω j x − x j y j L(x)=l(x)\sum_{j=0}^k\frac{\omega_j}{x-x_j}y_j L(x)=l(x)j=0kxxjωjyj
即所谓的重心拉格朗日插值公式(第一型)或改进拉格朗日插值公式。

它的优点是当插值点的个数增加一个时,将每个 ω j \omega_j ωj都除以 ( x j − x k + 1 ) (x_j − x_{k + 1}) (xjxk+1),就可以得到新的重心权 w k + 1 w_{k + 1} wk+1,计算复杂度为 O ( n ) \mathcal O(n) O(n),比重新计算每个基本多项式所需要的复杂度 O ( n 2 ) \mathcal O(n^2) O(n2)降了一个量级。

将以上的拉格朗日插值多项式用来对函数 g ( x ) ≡ 1 g(x)\equiv 1 g(x)1插值,可以得到:
∀ x ,   g ( x ) = l ( x ) ∑ j = 0 k ω j x − x j \forall x,\,g(x)=l(x)\sum_{j=0}^k\frac{\omega_j}{x-x_j} x,g(x)=l(x)j=0kxxjωj
因为 g ( x ) ≡ 1 g(x)\equiv 1 g(x)1是一个多项式。

因此,将 L ( x ) L(x) L(x)除以 g ( x ) g(x) g(x)后可得到:
L ( x ) = ∑ j = 0 k ω j x − x j y j ∑ j = 0 k ω j x − x j L(x)=\frac{\sum_{j=0}^k\frac{\omega_j}{x-x_j}y_j}{\sum_{j=0}^k\frac{\omega_j}{x-x_j}} L(x)=j=0kxxjωjj=0kxxjωjyj
这个公式被称为重心拉格朗日插值公式(第二型)或真正的重心拉格朗日插值公式。它继承了(1)式容易计算的特点,并且在代入 x x x值计算 L ( x ) L(x) L(x)的时候不必计算多项式 l ( x ) l(x) l(x)

它的另一个优点是,结合切比雪夫节点进行插值的话,可以很好地模拟给定的函数,使得插值点个数趋于无穷时,最大偏差趋于零。同时,重心拉格朗日插值结合切比雪夫节点进行插值可以达到极佳的数值稳定性。第一型拉格朗日插值是向后稳定的,而第二型拉格朗日插值是向前稳定的,并且勒贝格常数很小。

有关拉格朗日插值法(理论详解)的更多相关文章

  1. ruby-on-rails - Ruby on Rails I18n 插值 - 2

    大家好!我对我的:username字段进行了一个小的验证,它应该是4到30个字符。我写了一个验证::length=>{:within=>4..30,:message=>I18n.t('activerecord.errors.range')-我想显示一个错误各种错误的消息(不像,太长或太短),但这里有一个问题-我可以将最小值和最大值都传递给翻译,以便有类似的东西:用户名应该在4到30个字符之间。目前我有:range:"shouldbebetween%{count}and%{count}characters",这显然不起作用(只是为了检查)。是否可以从范围中获取这些值?谢谢大家的指教!

  2. 【高数】用拉格朗日中值定理解决极限问题 - 2

    首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有,  也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加

  3. ruby - 如何转义 Ruby 字符串插值? - 2

    给定这段代码:has_many:foos,:finder_sql=#{id}部分被过早插入。我如何逃脱它? 最佳答案 在定界符两边加上单引号:has_many:foos,:finder_sql= 关于ruby-如何转义Ruby字符串插值?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2052724/

  4. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  5. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  6. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  7. 【Elasticsearch基础】Elasticsearch索引、文档以及映射操作详解 - 2

    文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就

  8. 最强Http缓存策略之强缓存和协商缓存的详解与应用实例 - 2

    HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地,以便下次请求时能够直接从缓存中获取资源,从而减少网络请求次数,提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。一.强缓存强缓存是指浏览器直接从本地缓存中获取资源,而不需要向web服务器发出网络请求。这是因为浏览器在第一次请求资源时,服务器会在响应头中添加相关缓存的响应头,以表明该资源的缓存策略。常见的强缓存响应头如下所述:Cache-ControlCache-Control响应头是用于控制强制缓存和协商缓存的缓存策略。该响应头中的指令如下:max-age:指定该资源在本地缓存的最长有效时间,以秒为单位。例如:Ca

  9. IDEA 2022 创建 Spring Boot 项目详解 - 2

    如何用IDEA2022创建并初始化一个SpringBoot项目?目录如何用IDEA2022创建并初始化一个SpringBoot项目?0. 环境说明1.  创建SpringBoot项目 2.编写初始化代码0. 环境说明IDEA2022.3.1JDK1.8SpringBoot1.  创建SpringBoot项目        打开IDEA,选择NewProject创建项目。        填写项目名称、项目构建方式、jdk版本,按需要修改项目文件路径等信息。        选择springboot版本以及需要的包,此处只选择了springweb。        此处需特别注意,若你使用的是jdk1

  10. ruby-on-rails - 单引号字符串字符串插值 - 2

    我正在尝试使用Rails在ActionMailer中设置电子邮件地址。在它被硬编码之前,但我们现在想让它们成为ENV变量,这样我们就不需要在每次电子邮件更改时都修改代码。这是它目前的定义方式:from='"NameofPerson"'我已经尝试使用ENV['EMAIL']将电子邮件设置为环境变量,但即使使用#{ENV['EMAIL'}我也没有运气。谁能指出我正确的方向? 最佳答案 您不能在Ruby中对单引号字符串使用字符串插值。但是双引号字符串可以!from="'NameofPerson'"但是如果你想用双引号将NameofPers

随机推荐