在数学建模过程中大家经常会使用插值法对数据进行处理,而其中拉格朗日多项式插值法是较为常用到的。
以下是我在学习拉格朗日插值法时通过阅读许多大佬博主的文章时发现,要么只有代码,要么只有理论讲解或者例题,所以我就根据自己的理解总结了这篇笔记。代码附在后面 需求的大家自取即可

文章目录

  • 拉格朗日多项式插值
    • 方法应用
    • 具体引入
    • 公式推导
    • 最终公式
    • 公式代码
  • 引申
    • 线性插值多项式
      • 代码
    • 抛物线插值多项式
      • 代码

插值:求过已知有限个数数据点的近似函数

拟合:已知有限个数据点,求近似函数,不要求过急直数据点,只要求在某种意义下它在这些点上的总偏差最小

拉格朗日多项式插值

插值方法有许多,常用的、基本的有:拉格朗日多项式插值、牛顿插值、分段线插值、Hermite插值和三次样条插值。这里只将一下拉格朗日多项式插值法:

方法应用

通缩点说,已知n+1个点x1,x2,…,xn的函数值,可以使用lagrange插值求出一个n次多项式插值函数f(x),f(x)是接近未知原函数p(x)的函数,根据插值函数f(x)求出p(x)的未知点

具体引入

已知一个未知函数f(x)的三个点(x1,y1)、(x2,y2)、(x3,y3

存在使用一个多项式函数经过这三个点,呈现为一根曲线

因此进行合理假设,此曲线为一个二次多项式

拉格朗日认为可通过三根两次曲线来得到这根二次曲线。

关键

因此假设了三根曲线

第一根曲线f1(x),在x1点处,取值为1,其余两点(x2,y2)、(x3,y3)取值为0

第二根曲线f2(x),在x2点处,取值为1,其余两点(x1,y1)、(x3,y3)取值为0

第三根曲线f3(x),在x3点处,取值为1,其余两点(x1,y1)、(x2,y2)取值为0

所以可得到

y1f1(x)曲线可以保证,在x1处,取值为y1,其余两点取值为0

y2f2(x)曲线可以保证,在x2处,取值为y2,其余两点取值为0

y3f3(x)曲线可以保证,在x3处,取值为y3,其余两点取值为0

可以说这三根曲线就可以组成需要得到的那根二次曲线

那么,f(x)=y1f1(x)+y2f2(x)+y3f3(x)

公式推导

首先假设的三根曲线fi为二次函数

其次需满足

因此可以得到构造的函数(例如第一根)

​ 零点法

所以
f 1 ( x ) = ( x − x 2 ) ( x − x 3 ) ( x 1 − x 2 ) ( x 1 − x 3 ) {f_1}\left( x \right) = \frac{{\left( {x - {x_2}} \right)\left( {x - {x_3}} \right)}}{{\left( {{x_1} - {x_2}} \right)\left( {{x_1} - {x_3}} \right)}} f1​(x)=(x1​−x2​)(x1​−x3​)(x−x2​)(x−x3​)​
推广到一般,可得到
f ( x ) = ∑ i = 1 3 y i ⋅ f i ( x ) f\left( x \right) = \sum\limits_{i = 1}^3 {{y_i} \cdot {f_i}\left( x \right)} f(x)=i=1∑3​yi​⋅fi​(x)

最终公式

f i ( x ) = ( x − x 0 ) ( x − x 1 ) ⋯ ( x − x i − 1 ) ( x − x i + 1 ) ⋯ ( x − x n ) ( x i − x 0 ) ( x i − x 1 ) ⋯ ( x i − x i − 1 ) ( x i − x i + 1 ) ⋯ ( x i − x n ) {f_i}\left( x \right) = \frac{{\left( {x - {x_0}} \right)\left( {x - {x_1}} \right) \cdots \left( {x - {x_{i - 1}}} \right)\left( {x - {x_{i + 1}}} \right) \cdots \left( {x - {x_n}} \right)}}{{\left( {{x_i} - {x_0}} \right)\left( {{x_i} - {x_1}} \right) \cdots \left( {{x_i} - {x_{i - 1}}} \right)\left( {{x_i} - {x_{i + 1}}} \right) \cdots \left( {{x_i} - {x_n}} \right)}} fi​(x)=(xi​−x0​)(xi​−x1​)⋯(xi​−xi−1​)(xi​−xi+1​)⋯(xi​−xn​)(x−x0​)(x−x1​)⋯(x−xi−1​)(x−xi+1​)⋯(x−xn​)​

称为拉格朗日插值基函数
f n ( x ) = ∑ i = 0 n f i ( x ) ⋅ y i {f_n}\left( x \right) = \sum\limits_{i = 0}^n {{f_i}\left( x \right)} \cdot {y_i} fn​(x)=i=0∑n​fi​(x)⋅yi​
为拉格朗日插值多项式公式

公式代码

function y=lagrange(x0,y0,x)
n=length(x0);
m=length(x);
for i=1:m z=x(i); s=0.0; for k=1:n p=1.0; for j=1:n if j~=k p=p*(z-x0(j))/(x0(k)-x0(j)); end end s=p*y0(k)+s; end y(i)=s;
end 

引申

线性插值多项式

f 1 ( x ) = ( x − x 1 ) ( x 0 − x 1 ) ⋅ y 0 + ( x − x 0 ) ( x 1 − x 0 ) ⋅ y 1 {f_1}\left( x \right) = \frac{{\left( {x - {x_1}} \right)}}{{\left( {{x_0} - {x_1}} \right)}} \cdot {y_0} + \frac{{\left( {x - {x_0}} \right)}}{{\left( {{x_1} - {x_0}} \right)}} \cdot {y_1} f1​(x)=(x0​−x1​)(x−x1​)​⋅y0​+(x1​−x0​)(x−x0​)​⋅y1​

代码

function y=sin_L(x0,y0,x1,y1,x)
% sin_L输出sin(x)使用线性插值计算得到的函数值
% 例如: y=sin_T(4,2,9,3,5)
%       y =
%           2.200
%       R =
%           6% 以下为判断输入值是否合法的代码
if nargin~=5error('请输入线性插值的插值节点和插值点')
end
if ~( isnumeric(x0)&&isnumeric(y0)&&isnumeric(x1)&&isnumeric(y1)&&isnumeric(x) )error('输入参数必须是数')
end% 核心计算的代码
y=y0+(y1-y0)*(x-x0)/(x1-x0);% 以下为求解截断误差的代码
syms M2; % 因为sin(x)的二阶导数是本身,所以只需要挑出最大的y值,即可的到M2
if y0>y1M2=y0;
elseM2=y1;
end
R=M2*abs((x-x0)*(x-x1))/2
end

抛物线插值多项式

f 2 ( 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 {f_2}\left( x \right) = \frac{{\left( {x - {x_1}} \right) \cdot \left( {x - {x_2}} \right)}}{{\left( {{x_0} - {x_1}} \right) \cdot \left( {{x_0} - {x_2}} \right)}} \cdot {y_0} + \frac{{\left( {x - {x_0}} \right)\left( {x - {x_2}} \right)}}{{\left( {{x_1} - {x_0}} \right) \cdot \left( {{x_1} - {x_2}} \right)}} \cdot {y_1} + \frac{{\left( {x - {x_0}} \right)\left( {x - {x_1}} \right)}}{{\left( {{x_2} - {x_0}} \right) \cdot \left( {{x_2} - {x_1}} \right)}} \cdot {y_2} f2​(x)=(x0​−x1​)⋅(x0​−x2​)(x−x1​)⋅(x−x2​)​⋅y0​+(x1​−x0​)⋅(x1​−x2​)(x−x0​)(x−x2​)​⋅y1​+(x2​−x0​)⋅(x2​−x1​)(x−x0​)(x−x1​)​⋅y2​

代码

function y=sin_T(x0,y0,x1,y1,x2,y2,x)
% sin_T输出sin(x)使用抛物插值计算得到的函数值
% 例如: y=sin_T(1,1,4,2,9,3,5)
%       y =
%           2.2667
%       R =
%           1.4408% 以下为判断输入值是否合法的代码
if nargin~=7error('请输入线性插值的插值节点和插值点')
end
if ~( isnumeric(x0)&&isnumeric(y0)&&isnumeric(x1)&&isnumeric(y1)&&isnumeric(x2)&&isnumeric(y2)&&isnumeric(x) )error('输入参数必须是数')
end% 核心计算的代码
y=y0*(x-x1)*(x-x2)/((x0-x1)*(x0-x2))+y1*(x-x0)*(x-x2)/((x1-x0)*(x1-x2))+y2*(x-x0)*(x-x1)/((x2-x0)*(x2-x1));% 以下为求解截断误差的代码
y_0=cos(x0); % 因为sin(x)的三阶导数是cos(x),那么只要求出x0,x1,x2的cos值,然后去最大即可得到M3
y_1=cos(x1);
y_2=cos(x2);
syms M3;
if y_0>y_1M3=y_0;
elseM3=y_1;
end
if y_2>M3M3=y_2;
end
R=M3*abs((x-x0)*(x-x1)*(x-x2))/6
end

拉格朗日多项式插值法 思路详解+详细代码相关推荐

  1. 2023年MathorCup 高校数学建模挑战赛-D 题 航空安全风险分析和飞行技术评估问题-思路详解及代码分享

    一.题目简析 背景信息较长,关于航空安全数据的真实背景.其中给出了不少提示需要注意.本质是数据分析题目,难度较低,适合小白. 关键知识:G 值是飞机飞行过程中过载情况的直接反应,在着陆安全分析中,G ...

  2. 2022年亚太数学建模竞赛-问题C:全球变暖与否?-思路详解

    一.题目分析 数据分析典中典,数据量适中,主要考察预测模型,另外还需要收集额外的数据辅助建模和判断. 要求 1.你同意全球气温的说法吗?使用2022_APMMC_C_Data.csv以及您的团队收集的 ...

  3. x264 代码重点详解 详细分析

    eg mplayer x264 代码重点详解 详细分析 分类: ffmpeg 2012-02-06 09:19 4229人阅读 评论(1) 收藏 举报 h.264codecflv优化initializ ...

  4. python拍七游戏代码_python实现逢七拍腿小游戏的思路详解

    逢七拍腿游戏 几个小朋友在一起玩逢七拍腿的游戏,从1开始数数,当数到7的倍数或者尾号是7时,拍一下腿.现在从1数到99,假设每个人都没有错,计算一下共要拍腿几次? 第一种实现思路:通过在for循环语句 ...

  5. python实现括号匹配代码_python实现括号匹配的思路详解

    1.用一个栈[python中可以用List]就可以解决,时间和空间复杂度都是O(n) # -*- coding: utf8 -*- # 符号表 SYMBOLS = {'}': '{', ']': '[ ...

  6. 插值法亚像素边缘检测(拉格朗日多项式插值法)

    原理 拉格朗日插值法的直观理解和推倒思路,下面知乎这位马同学讲的很好理解 https://www.zhihu.com/question/58333118 这篇博客把整个数学原理,公式推导,讲的很详细了 ...

  7. Java编程配置思路详解

    Java编程配置思路详解 SpringBoot虽然提供了很多优秀的starter帮助我们快速开发,可实际生产环境的特殊性,我们依然需要对默认整合配置做自定义操作,提高程序的可控性,虽然你配的不一定比官 ...

  8. android仿知乎按钮动效,Android仿知乎客户端关注和取消关注的按钮点击特效实现思路详解...

    先说明一下,项目代码已上传至github,不想看长篇大论的也可以先去下代码,对照代码,哪里不懂点哪里. 代码在这https://github.com/zgzczzw/ZHFollowButton 前几 ...

  9. P2P技术详解(一):NAT详解——详细原理、P2P简介(转)

    这是一篇介绍NAT技术要点的精华文章,来自华3通信官方资料库,文中对NAT技术原理的介绍很全面也很权威,对网络应用的应用层开发人员而言有很高的参考价值. <P2P技术详解>系列文章 ➊ 本 ...

最新文章

  1. 自动驾驶场景下的高效激光里程计
  2. module ‘tensorrt‘ has no attribute ‘BuilderFlag‘
  3. 技术向:一文读懂卷积神经网络
  4. NLP复习资料(3)-六~七章:马尔科夫模型与条件随机场、词法分析与词性标注
  5. .Net 高效开发之不可错过的实用工具
  6. listctrl 优化_上海SEO整站优化公司_新站整站快速排名优化
  7. C#中DataRow的初始化
  8. mycat php pdo,mycat程序写入和读取中文乱码解决
  9. docker安装mysql以及设置navicat远程访问
  10. 目前使用的python版本_Python版本到底有多少种?
  11. hive三种建表语句
  12. 威金杀虫剂作者农夫和威金病毒制造者的聊天记录
  13. wow.js动画插件
  14. 中兴华为继续应诉欧盟无线网卡反倾销
  15. Android内存泄漏检测工具使用手册
  16. final、finalize 和 finally
  17. 金山WPS面经 c++开发工程师
  18. 深度解密 Python 列表的实现原理
  19. docker学习整理
  20. Windows使用etcher制作macOS系统启动u盘

热门文章

  1. 关于 Linux 中 firewalld 的一些笔记整理
  2. sublime配置浏览器
  3. Java 20 超神版正式发布,展示了 Java 技术的最新进展
  4. Python pandas把多个DataFrame对象写入Excel文件中同一个工作表
  5. 动态规划——1265:【例9.9】最长公共子序列
  6. 搜狗输入法截屏工具的使用
  7. (深度学习入门)sigmoid型函数和 sigmoid函数的区别
  8. 洛谷P1424 小鱼的航程(改进版)-c++题解
  9. [数据库] mysql
  10. 代码传奇 | 身价10亿程序员的传奇一生