拉格朗日插值法的推导

1、插值的基本定义
  设函数 y = f ( x ) y=f(x) y=f(x)在区间 [ a , b ] [a,b] [a,b]上有定义,且已知它在 n + 1 n+1 n+1个互异点 a ≤ x 0 < x 1 < . . . < x n ≤ b a\leq x_0<x_1<...<x_n\leq b ax0<x1<...<xnb上的函数值 y 0 , y 1 , . . . , y n y_0,y_1,...,y_n y0,y1,...,yn,若存在一个简单函数 p ( x ) p(x) p(x),使得
p ( x i ) = y i , i = 0 , 1 , 2 , . . , n p(x_i)=y_i,i=0,1,2,..,n p(xi)=yi,i=0,1,2,..,n
  成立,则称 p ( x ) p(x) p(x) f ( x ) f(x) f(x)插值函数。显然,除上述已知 n + 1 n+1 n+1个互异点外,在其他位置上,插值函数 p ( x ) p(x) p(x)和原函数 f ( x ) f(x) f(x)之间并没有明确关系,所以插值总是有误差的。不过,若对原函数和插值函数增加一定的约束,则可能使两者保持一致。下面讨论代数插值情况。
  设 p ( x ) p(x) p(x)是次数不超过 n n n的代数多项式,即
p ( x ) = a n x n + a n − 1 x n − 1 + . . . + a 1 x + a 0 (1) p(x)=a_n x^n+a_{n-1}x^{n-1}+...+a_1 x+a_0 \tag{1} p(x)=anxn+an1xn1+...+a1x+a0(1)
该函数满足 p ( x i ) = y i p(x_i)=y_i p(xi)=yi,则称 p ( x ) p(x) p(x)为原函数 f ( x ) f(x) f(x) n n n次代数插值多项式。该种插值称为代数插值,代数插值的几何意义,其实就是找一条过上述 n + 1 n+1 n+1个互异点的 n n n次代数曲线来近似表示曲线 f ( x ) f(x) f(x)
  可以证明,上述 n n n次插值函数有且只有一个。显然,将 p ( x i ) = y i p(x_i)=y_i p(xi)=yi的条件代入(1)式,得到下面的 n + 1 n+1 n+1阶线性方程组
{ a 0 + a 1 x 0 + a 2 x 0 2 + . . . + a n x 0 n = y 0 a 0 + a 1 x 1 + a 2 x 1 2 + . . . + a n x 1 n = y 1 ⋮ a 0 + a 1 x n + a 2 x n 2 + . . . + a n x n n = y n → [ 1 x 0 . . . x 0 n 1 x 1 . . . x 1 n ⋮ ⋮ . . . ⋮ 1 x n . . . x n n ] [ a 0 a 1 ⋮ a n ] = [ y 0 y 1 ⋮ y n ] \left\{\begin{matrix} a_0+a_1 x_0+a_2 x_0^2+...+a_nx_0^n=y_0 \\ a_0+a_1 x_1+a_2 x_1^2+...+a_nx_1^n=y_1 \\ \vdots \\ a_0+a_1 x_n+a_2 x_n^2+...+a_nx_n^n=y_n \\ \end{matrix}\right. \rightarrow \left[ \begin{matrix} 1 & x_0 & ... & x_0^n \\ 1 & x_1 & ... & x_1^n \\ \vdots & \vdots & ... & \vdots \\ 1 & x_n & ... & x_n^n \\ \end{matrix}\right] \left[ \begin{matrix} a_0 \\ a_1 \\ \vdots \\ a^n \\ \end{matrix}\right] = \left[ \begin{matrix} y_0 \\ y_1 \\ \vdots \\ y^n \\ \end{matrix}\right] a0+a1x0+a2x02+...+anx0n=y0a0+a1x1+a2x12+...+anx1n=y1a0+a1xn+a2xn2+...+anxnn=yn 111x0x1xn............x0nx1nxnn a0a1an = y0y1yn
  显然,该线性方程组的行列式为
∣ 1 x 0 . . . x 0 n 1 x 1 . . . x 1 n ⋮ ⋮ . . . ⋮ 1 x n . . . x n n ∣ = ∏ i = 1 n ∏ j = 0 i − 1 ( x i − x j ) \begin{vmatrix} 1 & x_0 & ... & x_0^n \\ 1 & x_1 & ... & x_1^n \\ \vdots & \vdots & ... & \vdots \\ 1 & x_n & ... & x_n^n \\ \end{vmatrix} = \prod_{i=1}^n \prod_{j=0}^{i-1}(x_i-x_j) 111x0x1xn............x0nx1nxnn =i=1nj=0i1(xixj)
 显然,由于 x i x_i xi互不相同,所以上式不为0,所以方程系数 a 0 , . . . , a n a_0,...,a_n a0,...,an可被唯一确,即该插值多项式有且只有一个。
  插值问题的关键是求解插值多项式,显然利用上述线性方程组,可直接求得多项式系数的最小二乘解。但计算过程涉及矩阵求逆,计算量较大,后面将探究新的计算方法。

2、拉格朗日插值法

2.1、线性插值情况
  我们从一次多项式开始逐步推导。此时有 p ( x i ) = y i , ( i = 0 , 1 ) p(x_i)=y_i,(i=0,1) p(xi)=yi,(i=0,1),显然,可过这两个点作一条直线,目的是用直线 p ( x ) p(x) p(x)来近似表示原函数 f ( x ) f(x) f(x),这种插值称为线性插值。该直线的两点式方程可表示为
p ( x ) = y 0 x − x 1 x 0 − x 1 + y 1 x − x 0 x 1 − x 0 = l 0 ( x ) y 0 + l 1 ( x ) y 1 = ∑ k = 0 1 l k ( x ) y k p(x)=y_0 \frac{x-x_1}{x_0-x_1}+y_1 \frac{x-x_0}{x_1-x_0}=l_0(x)y_0+l_1(x)y_1=\sum_{k=0}^1 l_k(x)y_k p(x)=y0x0x1xx1+y1x1x0xx0=l0(x)y0+l1(x)y1=k=01lk(x)yk
  其中, l 0 ( x ) = x − x 1 x 0 − x 1 l_0(x)=\frac{x-x_1}{x_0-x_1} l0(x)=x0x1xx1称为点 x 0 x_0 x0的一次插值基函数, l 1 ( x ) = x − x 0 x 1 − x 0 l_1(x)=\frac{x-x_0}{x_1-x_0} l1(x)=x1x0xx0称为点 x 1 x_1 x1的一次插值基函数, 显然 p ( x ) p(x) p(x) l 0 ( x ) l_0(x) l0(x) l 1 ( x ) l_1(x) l1(x)的线性组合。另外,上述插值基函数满足
l j ( x i ) = δ i j = { 1 , i = j 0 , i ≠ j (2) l_j(x_i)=\delta_{ij}=\left\{\begin{matrix} 1,i=j \\ 0,i\neq j \end{matrix}\right. \tag{2} lj(xi)=δij={1,i=j0,i=j(2)
在这里插入图片描述

图1. 线性插值示意图

2.2、二次插值情况
  此时已知 f ( x ) f(x) f(x)上面三个互异点 ( x i , y i ) , i = 0 , 1 , 2 (x_i,y_i),i=0,1,2 (xi,yi),i=0,1,2,要求构造一个不超过2次的代数多项式 p ( x ) = a x 2 + b x + c p(x)=ax^2+bx+c p(x)=ax2+bx+c,满足 p ( x i ) = y i , ( i = 0 , 1 , 2 ) p(x_i)=y_i,(i=0,1,2) p(xi)=yi,(i=0,1,2)。为便于求解,我们可将 p ( x ) p(x) p(x)重新整理为 p ( x ) = A ( x − x 1 ) ( x − x 2 ) + B ( x − x 0 ) ( x − x 2 ) + C ( x − x 0 ) ( x − x 1 ) p(x)=A(x-x_1)(x-x_2)+B(x-x_0)(x-x_2)+C(x-x_0)(x-x_1) p(x)=A(xx1)(xx2)+B(xx0)(xx2)+C(xx0)(xx1),将三个已知点坐标代入,可求得
A = y 0 ( x 0 − x 1 ) ( x 0 − x 2 ) B = y 1 ( x 1 − x 0 ) ( x 1 − x 2 ) C = y 2 ( x 2 − x 0 ) ( x 2 − x 1 ) A=\frac{y_0}{(x_0-x_1)(x_0-x_2)}\\ B=\frac{y_1}{(x_1-x_0)(x_1-x_2)}\\ C=\frac{y_2}{(x_2-x_0)(x_2-x_1)} A=(x0x1)(x0x2)y0B=(x1x0)(x1x2)y1C=(x2x0)(x2x1)y2
此时可得到插值函数为
p ( x ) = ( x − x 1 ) ( x − x 2 ) ( x 0 − x 1 ) ( x 0 − x 2 ) y 0 + ( x − x 0 ) ( x − x 2 ) ( x 1 − x 0 ) ( x 1 − x 2 ) y 1 + ( x − x 0 ) ( x − x 1 ) ( x 2 − x 0 ) ( x 2 − x 1 ) y 2 = l 0 ( x ) y 0 + l 1 ( x ) y 1 + l 2 ( x ) y 2 = ∑ j = 0 2 l j ( x ) y j p(x)=\frac{(x-x_1)(x-x_2)}{(x_0-x_1)(x_0-x_2)}y_0+\frac{(x-x_0)(x-x_2)}{(x_1-x_0)(x_1-x_2)}y_1+\frac{(x-x_0)(x-x_1)}{(x_2-x_0)(x_2-x_1)}y_2\\ =l_0(x)y_0+l_1(x)y_1+l_2(x)y_2=\sum_{j=0}^2 l_j(x)y_j p(x)=(x0x1)(x0x2)(xx1)(xx2)y0+(x1x0)(x1x2)(xx0)(xx2)y1+(x2x0)(x2x1)(xx0)(xx1)y2=l0(x)y0+l1(x)y1+l2(x)y2=j=02lj(x)yj
其中, l j ( x ) = ∏ i = 0 , i ≠ j 2 x − x i x j − x i l_j(x)=\prod_{i=0,i\neq j}^2 \frac{x-x_i}{x_j-x_i} lj(x)=i=0,i=j2xjxixxi,显然 l j ( x ) l_j(x) lj(x)同样具有(2)式所示的性质。该插值称为二次插值或抛物线插值。

2.3、n次插值情况
  此时,仿照二次插值的构造方法,令
p ( x ) = l 0 ( x ) y 0 + . . . + l n ( x ) y n = ∑ j = 0 n l j ( x ) y j p(x)=l_0(x)y_0+...+l_n(x)y_n=\sum_{j=0}^n l_j(x)y_j p(x)=l0(x)y0+...+ln(x)yn=j=0nlj(x)yj
其中, l j ( x ) l_j(x) lj(x) n n n次多项式,称为插值基函数,它满足条件
l j ( x i ) = δ i j = { 1 , i = j 0 , i ≠ j , ( i , j = 0 , 1 , . . . , n ) (2) l_j(x_i)=\delta_{ij}=\left\{\begin{matrix} 1,i=j \\ 0,i\neq j \end{matrix}\right. ,(i,j=0,1,...,n) \tag{2} lj(xi)=δij={1,i=j0,i=j(i,j=0,1,...,n)(2)
  显然,此时问题归结为构造满足条件的 n n n次多项式 l j ( x ) l_j(x) lj(x)。事实上,由 l j ( x ) = 0 , i ≠ j l_j(x)=0,i\neq j lj(x)=0,i=j,知道 x 0 , x 1 , . . . , x j − 1 , x j + 1 , . . . , x n x_0,x_1,...,x_{j-1},x_{j+1},...,x_n x0,x1,...,xj1,xj+1,...,xn都是 l j ( x ) l_j(x) lj(x)的零点,所以可设 l j ( x ) = A ( x − x 0 ) ( x − x 1 ) . . . . ( x − x j − 1 ) ( x − x j + 1 ) . . . ( x − x n ) l_j(x)=A(x-x_0)(x-x_1)....(x-x_{j-1})(x-x_{j+1})...(x-x_n) lj(x)=A(xx0)(xx1)....(xxj1)(xxj+1)...(xxn)。其中, A A A为待定系数,由条件 l j ( x j ) = 1 l_j(x_j)=1 lj(xj)=1,可确定 A = 1 ( x j − x 0 ) ( x j − x 1 ) . . . ( x j − x j − 1 ) ( x j − x j + 1 ) . . . ( x j − x n ) A=\frac{1}{(x_j-x_0)(x_j-x_1)...(x_j-x_{j-1})(x_j-x_{j+1})...(x_j-x_n)} A=(xjx0)(xjx1)...(xjxj1)(xjxj+1)...(xjxn)1,所以
l j ( x ) = ( x − x 0 ) . . . ( x − x j − 1 ) ( x − x j + 1 ) . . . ( x − x n ) ( x j − x 0 ) . . . ( x j − x j − 1 ) ( x j − x j + 1 ) . . . ( x j − x n ) = ∏ i = 0 , i ≠ j n x − x i x j − x i l_j(x)=\frac{(x-x_0)...(x-x_{j-1})(x-x_{j+1})...(x-x_n)}{(x_j-x_0)...(x_j-x_{j-1})(x_j-x_{j+1})...(x_j-x_n)}=\prod_{i=0,i\neq j}^n \frac{x-x_i}{x_j-x_i} lj(x)=(xjx0)...(xjxj1)(xjxj+1)...(xjxn)(xx0)...(xxj1)(xxj+1)...(xxn)=i=0,i=jnxjxixxi
  由此可得
p ( x ) = ∑ j = 0 n l j ( x ) y j = ∑ j = 0 n y j ( ∏ i = 0 , i ≠ j n x − x i x j − x i ) (3) p(x)=\sum_{j=0}^n l_j(x)y_j=\sum_{j=0}^n y_j(\prod_{i=0,i\neq j}^n \frac{x-x_i}{x_j-x_i})\tag{3} p(x)=j=0nlj(x)yj=j=0nyj(i=0,i=jnxjxixxi)(3)
我们称形如(3)式的插值公式为拉格朗日插值。

3、代码实现
  分别仿真拉格朗日插值法用于线性插值、抛物线插值和三次插值的情况,仿真代码见附录,仿真结果如下图所示,图中蓝色点表示已知点,红色点表示插值点。
在这里插入图片描述

图2. 线性插值的结果

在这里插入图片描述

图3. 抛物线插值的结果

在这里插入图片描述

图4. 三次插值的结果

【实现代码】

import numpy as np
import matplotlib.pyplot as plt

def lagrange_interpolate(x, xi, yi):
    """
    本函数用于实现拉格朗日函数
    :param x: 待计算的x坐标
    :param xi: 已知的x坐标
    :param yi: 已知的y坐标
    :return y: 对应x得到的y
    """
    if len(xi) != len(yi):
        raise ValueError('x dimension is not equal to y dimension!')

    # #######################计算拉格朗日基函数##################
    lj = np.ones((len(x), len(yi)))
    for j in range(0, len(yi), 1):
        for i in range(0, len(xi), 1):
            if i != j:
                lj[:, j] *= ((x - xi[i]) / (xi[j] - xi[i]))

    # ####################计算拉格朗日插值结果#####################
    y = np.zeros(len(x))
    for j in range(0, len(yi), 1):
        y += yi[j] * lj[:, j]
    return y


if __name__ == '__main__':
    xi = np.array([0, 6, 7, 11])
    yi = np.array([5, 2, 8, 9])
    x = np.arange(0, 12, 0.5)
    y = lagrange_interpolate(x, xi, yi)
    plt.figure()
    plt.plot(xi, yi, 'bo')
    plt.plot(x, y, 'r.-')
    plt.legend(['original points', 'interpolated points'])
    plt.grid()
    plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/668195.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

房产证上加名?手把手教你操作,省钱又省心!

随着《民法典》的实施&#xff0c;房产的权属问题愈发受到重视。夫妻双方及其亲属常希望能在房产证上增添自己的名字&#xff0c;以保障各自的权益。那么&#xff0c;房产证上到底能写几个名字呢&#xff1f;以下是对这一问题的详细解答。 一、房产证命名无固定限制 在购房时&…

MAB规范(1):概览介绍

前言 MATLAB的MAAB&#xff08;MathWorks Automotive Advisory Board&#xff09;建模规范是一套由MathWorks主导的建模指南&#xff0c;旨在提高基于Simulink和Stateflow进行建模的代码质量、可读性、可维护性和可重用性。这些规范最初是由汽车行业的主要厂商共同制定的&…

手写HTML字符串解析成对应的 AST语法树

先看效果 展示如下&#xff1a; HTML模版 转成ast语法树后 在学习之前&#xff0c;我们需要了解这么一个问题&#xff0c;为什么要将HTML字符串解析成对应的 AST语法树。 为什么&#xff1f; 语法分析&#xff1a;HTML字符串是一种标记语言&#xff0c;其中包含了大量的标签…

电动汽车电子系统架构

电动汽车的普及正在稳步发展&#xff0c;供应链的各个环节也在发生变化。它涵盖了制造电动汽车零件的原材料、化学品、电池和各种组件。与此同时&#xff0c;汽车充电基础设施也参与其中&#xff0c;它们正经历一个历史性的阶段&#xff0c;经过彻底的重新设计。它们的电气化以…

Echarts实现半圆形饼图,Echarts实现扇形图

效果预览,此处的双半圆扇形图是使用v-for循环的出来的 dom部分 <template><div><div class="mainDiv"><div class="headTit">全校平台最近作业</div><div class="loopSubject"><div id="app"…

反射获取成员变量

目录 利用反射获取成员变量 ​编辑 代码实现 获取class对象 获取成员变量 获取单个成员变量 获取成员变量的名字 获取权限修饰符 获取成员变量的数据类型 获取成员变量记录的值 修改对象里面记录的值 利用反射获取成员变量 代码实现 Student类&#xff1a; 获取clas…

JVM学习-类加载过程(二)

Initialization初始化阶段 为类的静态变量赋予正确的初始值 具体描述 类的初始化是类装载的最后一个阶段&#xff0c;如果前面的步骤没有问题&#xff0c;那么表示类可以顺利装载到系统中&#xff0c;此时&#xff0c;类才会开始执行Java字节码(即&#xff0c;到了初始化阶段…

使用YOLOv10训练自己的数据集

1. yolov10源码下载 THU-MIG/yolov10: YOLOv10: Real-Time End-to-End Object Detection (github.com)https://github.com/THU-MIG/yolov10?tabreadme-ov-file 2. 环境配置 预先安装好ANACONDA、PyCharm或者VSCode等基本软件。参考以下博客&#xff1a; 史上最全最详细的An…

六一礼物怎么选?来用python采集几套试卷送给小朋友们吧

马上要六一了&#xff0c;想一想我小时候的儿童节老师大概率都会布置一些试卷&#xff0c;所以也算是渡过了一个很"快乐"的童年呢。 所以今天这篇文章来采集一下试卷网中的试卷&#xff0c;快来学习一下&#xff0c;然后采集几套试卷送给你身边还在上学的小朋友们吧…

《面试笔记》——MySQL终结篇30

三大范式&#xff1f; 第一范式&#xff1a;字段具有原子性&#xff0c;不可再分&#xff08;字段单一职责&#xff09; 第二范式&#xff1a;满足第一范式&#xff0c;每行应该被唯一区分&#xff0c;加一列存放每行的唯一标识符&#xff0c;称为主键&#xff08;都要依赖主…

系统架构设计师【第10章】: 软件架构的演化和维护 (核心总结)

文章目录 10.1 软件架构演化和定义的关系10.1.1 演化的重要性10.1.2 演化和定义的关系 10.2 面向对象软件架构演化过程10.2.1 对象演化10.2.2 消息演化10.2.3 复合片段演化10.2.4 约束演化 10.3 软件架构演化方式的分类10.3.1 软件架构演化时期10.3.2 软件架构静态演…

第二十五章新增H5基础(以及视频~兼容)

1.HTML5中新增布局标签 HTML5新增了页眉&#xff0c;页脚&#xff0c;内容块等文档结构相关标签&#xff0c;可以使文档结构更加清晰明了。 1.新增的结构标签 1、<header>标签 定义文档或者文档中内容块的页眉。通常可以包含整个页面或一个内容区域的标题&#xff0c…

【Java】刚刚!突然!紧急通知!垃圾回收!

【Java】刚刚&#xff01;突然&#xff01;紧急通知&#xff01;垃圾回收&#xff01; 文章目录 【Java】刚刚&#xff01;突然&#xff01;紧急通知&#xff01;垃圾回收&#xff01;从C语言的内存管理引入&#xff1a;手动回收Java的垃圾回收机制引用计数器循环引用问题 可达…

支付宝支付-Java基于沙箱环境实现支付宝支付

一、支付宝沙箱环境介绍 沙箱环境是支付宝开放平台为开发者提供的安全低门槛的测试环境&#xff0c;开发者在沙箱环境中调用接口无需具备所需的商业资质&#xff0c;无需绑定和开通产品&#xff0c;同时不会对生产环境中的数据造成任何影响。合理使用沙箱环境&#xff0c;可以…

7-Django项目--账号管理

目录 templates/admin_role/admin_list.html ​编辑 templates/admin_role/add_modify.html views/admin_role.py 账号管理----> 账号添加 views.py 身份修改 views.py 重置密码 views.py templates/admin_role/admin_list.html {% extends "index/index.ht…

[有监督学习] 7.详细图解随机森林

随机森林 随机森林&#xff08;random forest&#xff09;是将多个模型综合起来创建更高性能模型的方法&#xff0c;既可用于回归&#xff0c;也可用于分类。同样的算法有梯度提升&#xff08;gradient boosting&#xff09;等在机器学习竞赛中很受欢迎的算法。 通过学习随机森…

SpringBoot整合jasypt加密配置文件敏感信息

SpringBoot整合jasypt加密配置文件敏感信息 在项目中我们需要对配置文件的一些敏感信息进行加密处理&#xff0c;比如数据库账户密码&#xff0c;避免直接暴露出来&#xff0c;这种场景常常用于生产环境&#xff0c;我们不想让开发人员知道生产库的密码&#xff0c;有运维人员…

Ubuntu 安装好虚拟环境后,找不到workon 命令

1、安装虚拟环境 pip3 install virtualenv pip3 install virtualenvwrapper 2、安装完成后 workon 命令。 找不到workon 命令 执行&#xff0c;source virtualenvwrapper.sh 执行后&#xff0c;在使用workon命令&#xff0c;即可完成。

1.1 Mediapipe随手简记(一)

为了后续项目展开&#xff0c;需要Python、C、Linux、OpenCV、Mediapipe、ROS知识。 最后面有手势识别&#xff08;数字&#xff09;精准案例&#xff0c;项目会用到。 Mediapipe学习篇1 Mediapipe 是一个开源的跨平台框架&#xff0c;它提供了大量的解决方案&#xff0c;用…

MySQL十部曲之九:MySQL优化理论

文章目录 前言概述查询优化查询执行计划EXPLAIN获取表结构信息获取执行计划信息 EXPLAIN 输出格式如何使用EXPLAIN进行优化 范围访问优化单列索引的范围访问多列索引的范围访问 索引合并优化索引合并交叉访问算法索引合并联合访问算法索引合并排序联合访问算法 索引下推优化连接…