在工程应用和科学研究中,经常要研究变量之间的关系y=f(x)。但对于函数f(x),常常得不到一个具体的解析表达式,它可能是通过观测或实验得到的一组数据(x,f(x)),x为一向量;或则是解析表达式非常复杂,不便于计算和使用。因此我们需要寻找一个计算比较简单的函数S(x)近似代替f(x),并使得S(x)=f(x),这种方法就称为插值法

常用的插值法有:
一维插值法:拉格朗日插值、牛顿插值、分段低次插值、埃尔米特插值、样条插值。
二维插值法:双线性插值、双二次插值。

拉格朗日插值法

已知函数f(x)的n+1个互异的节点处的函数值,则其拉格朗日插值多项式可以写为:
其中,为插值基函数,其表达式为:

牛顿插值法

已知函数f(x)的n+1个互异的节点处的函数值,则其牛顿插值多项式可以写为:
其中,为f(x)的k阶差商(也叫均差),可以表示如下:
也可以由函数值线性表示为:
根据上述基本原理和公式,很容易编程实现。我们假设根据下面的数据表,来分别用拉格朗日插值和牛顿插值来计算f(8.4)的近似值:
x 8.1 8.3 8.6 8.7
f(x) 16.94410 17.56492 18.50515 18.82091

具体代码实现如下:

#include<iostream>
#include<vector>
using namespace std;
//-----------------拉格朗日插值法BEGIN---------------------//
double Lagrange(vector<double> x,vector<double> y ,double X)//x,y分别为x和f(x)的值,X为要求的点,返回值为f(X)
{double result=0;double temp=1;for(int i=0;i<x.size();i++){temp=1;for(int j=0;j<x.size();j++){if(j!=i){temp=temp*(X-x.at(j))/(x.at(i)-x.at(j));}        }result+=temp*y.at(i);}return result;
}
//-----------------拉格朗日插值法END---------------------//
//-----------------牛顿法BEGIN---------------------//
double DifferenceQuotient(vector<double> x,vector<double> y ,int k)//计算差商
{double result=0;for(int i=0;i<=k;i++){double temp=1;for(int j=0;j<=k;j++){if(i!=j){temp=temp/(x.at(i)-x.at(j));}}temp=y.at(i)*temp;result+=temp;}return result;
}
double Newton(vector<double> x,vector<double> y ,double X)
{double result=y.at(0);double temp=1;for(int i=1;i<x.size();i++){temp=1;for(int j=0;j<i;j++){temp*=(X-x.at(j));}result+=DifferenceQuotient(x,y,i)*temp;}return result;
}
//-----------------牛顿法END---------------------//
void main()
{vector<double> x;vector<double> y;//这里输入x的值,这里使用向量vector是为了方便添加数据点,可以根据实际的观测点更改x.push_back(8.1);x.push_back(8.3);x.push_back(8.6);x.push_back(8.7);//这里输入f(x)的值y.push_back(16.94410);y.push_back(17.56492);y.push_back(18.50515);y.push_back(18.82091);cout.precision(10);//设置显示精度//下面是根据上面的4个样本点及其函数值来分别使用两种插值法计算在x=8.4处的函数值cout<<"使用拉格朗日插值法:";cout<<Lagrange(x,y,8.4)<<endl;cout<<"使用牛顿插值法:";cout<<Newton(x,y,8.4)<<endl;
}

程序运行结果如下:

优缺点比较:
拉格朗日插值法:插值多项式和插值基函数的形式对称,容易编程。但是,增加节点时,需要重新计算每一个插值基函数。
牛顿插值法:当插值节点增加时,之前已计算的结果仍然能用,每增加一个节点,只要再增加一项即可,从而避免了重复性计算。

Matlab实现多种插值函数

现在也有很多人使用Matlab来进行算法的仿真,我在这里把大二时数学建模整理的插值算法函数也共享出来,链接为:http://download.csdn.net/detail/tengweitw/8387451具体的使用说明在文件中都有说明。下面就拿我们刚才所讲的拉格朗日插值和牛顿插值来举例说明,还是使用上面的数据表,则拉格朗日插值函数如下:

function f = Language(x,y,x0)
%x y为坐标向量  x0为插值点的x坐标|| f0为x0对应的值syms t;
if(length(x) == length(y))n = length(x);
elsedisp('x和y的维数不相等!');return;
end                                      %检错f = 0.0;
for(i = 1:n)l = y(i); for(j = 1:i-1)l = l*(t-x(j))/(x(i)-x(j));      end;for(j = i+1:n)l = l*(t-x(j))/(x(i)-x(j));      %计算拉格朗日基函数end;f = f + l;                           %计算拉格朗日插值函数      simplify(f);                         %化简if(i==n)if(nargin == 3)f = subs(f,'t',x0);          %计算插值点的函数值elsef = collect(f);          %将插值多项式展开f = vpa(f,6);                %将插值多项式的系数化成6位精度的小数endend
end

牛顿插值函数如下:

function f = Newton(x,y,x0)
%x y为坐标向量  x0为插值点的x坐标|| f0为x0对应的值
syms t;if(length(x) == length(y))n = length(x);c(1:n) = 0.0;
elsedisp('x和y的维数不相等!');return;
endf = y(1);
y1 = 0;
l  = 1;for(i=1:n-1)   for(j=i+1:n)y1(j) = (y(j)-y(i))/(x(j)-x(i));endc(i) = y1(i+1);     l = l*(t-x(i));  f = f + c(i)*l;simplify(f);y = y1;if(i==n-1)if(nargin == 3)f = subs(f,'t',x0);elsef = collect(f);                %将插值多项式展开f = vpa(f, 6);endend
end

为了使用上面两个函数,脚本文件如下:

clear all
clc
format long
format compactx=[8.1 8.3 8.6 8.7 ];
y=[ 16.94410 17.56492 18.50515 18.82091];
x0=8.4;
disp('拉格朗日插值法:')
disp(Language(x,y,x0))
disp('牛顿插值法:')
disp(Newton(x,y,x0))

结果显示如下:

原文:http://blog.csdn.net/tengweitw/article/details/43025225

作者:nineheadedbird

【数值分析】拉格朗日插值与牛顿插值相关推荐

  1. matlab全域基函数,多项式函数插值:全域多项式插值(一)单项式基插值、拉格朗日插值、牛顿插值 [MATLAB]...

    全域多项式插值指的是在整个插值区域内形成一个多项式函数作为插值函数.关于多项式插值的基本知识,见"计算基本理论". 在单项式基插值和牛顿插值形成的表达式中,求该表达式在某一点处的值 ...

  2. 拉格朗日插值和牛顿插值的龙格现象

    文章目录 一.实验目的 二.实验设备信息 三.实验内容 (一)拉格朗日插值多项式 (二)牛顿插值多项式 四.实验步骤 (一)拉格朗日插值函数实现 (二)牛顿插值函数实现 (三)观察拉格朗日插值和牛顿插 ...

  3. Matlab实现线性插值、抛物插值、牛顿插值、拉格朗日插值、分段抛物插值、分段线性插值

    目录 线性插值 原理 流程图 代码 抛物插值 原理 流程图 代码 拉格朗日插值 代码 牛顿插值 原理 代码 分段线性插值 代码 线性插值 原理 流程图 单个点的线性插值代码 X=[0.2 0.4]; ...

  4. 【插值】牛顿插值、拉格朗日插值、三次样条插值的Python代码实现

    插值简介 插值即根据有限的离散点绘制出穿过所有样本点的曲线,从直观上想象似乎画一条穿过n个特定点的曲线有无数种画法,但从数学意义上来说我们希望画出的曲线能够尽量平滑,震荡幅度尽量小能够在非样本点上符合 ...

  5. 数值分析之 拉格朗日插值、牛顿插值、分段线性插值实现

    1.拉格朗日插值法 考虑全局信息的比较经典的插值方法,编程简单,计算量大. #coding=utf-8 from matplotlib import pyplot as pltdef Lg(data, ...

  6. 1月16日:拉格朗日中值定理,罗尔定理,柯西中值,拉格朗日插值,牛顿插值,重心插值,拉格朗日乘子法的证明

    拉格朗日中值定理 https://www.bilibili.com/video/BV117411E7kx?from=search&seid=17921778669593975548 拉格朗日中 ...

  7. 插值问题(拉格朗日插值、牛顿插值)

    agui_lagrange.m: function f=agui_lagrange(x0,y0,x) % x0为节点向量,y0为节点上的函数值,x为插值点,f为返回插值 n=length(x0);m= ...

  8. Hermite插值是牛顿插值的极限情形

    Hermite插值可以看作牛顿插值的极限状况.为什么可以这么说呢?我们来看一个实例: 构造一个三次多项式 $p_3$ 使得 $p_3(0)=0$,$p_3(1)=1,p_3'(0)=1,p_3'(1) ...

  9. 【数值分析】插值法:拉格朗日插值、牛顿插值

    本科课程参见:<软件学院那些课> 拉格朗日插值法 (*以下定义选自维基百科) 算法流程图 算法代码 #include<iostream> #include<string& ...

  10. 插值法:拉格朗日插值、牛顿插值

    拉格朗日插值法 (*以下定义选自维基百科) 算法流程图 算法代码 [cpp] view plaincopy #include<iostream> #include<string> ...

最新文章

  1. 方便的图片修改Sql代码
  2. HDU - 3081 Marriage Match II(二分+并查集+最大流/匈牙利删边)
  3. 乔安监控云存储_智能运维丨全栈监控,护航云上业务
  4. Effective C++学习第六天
  5. 【Java基础】List迭代并修改时出现的ConcurrentModificationException问题
  6. DeFi 借贷协议 NAOS Finance 完成种子轮融资
  7. java.lang.IllegalArgumentException: An invalid character [10] was present in the Cookie value
  8. 同花顺黄金分割线及斐波那契数列分析网格(主图公式)
  9. java线程(线程的概念,线程的状态)
  10. Mac好用的截图工具:Snipaste
  11. 冰点还原容易出现的问题总结
  12. 液压与气压传动原理及实验装置,QY-QD11
  13. 教你防范QQ黑客工具!!!!
  14. 计算机操作系统--缺页中断与越界中断
  15. 17家中国初创IT公司的失败史
  16. 【模块】MAX31865 铂电阻温度检测器模块 RTD传感器PT100-PT1000
  17. Unity 2D手游——坦克大战 C#
  18. 粉笔公考——判断推理
  19. 厉害!张近东钦点,80后郝嘉成苏宁北京300亿市场掌舵人
  20. web常见漏洞解析 注入 xss csrf 文件上传 文件包含 -dvwa演示

热门文章

  1. application跟消息相关的东东
  2. DataMining with Sql 2005
  3. ERwin 正向工程
  4. 487-3279 (poj1002)
  5. git svn clone
  6. linux下libnet编程 亲自测试可用
  7. 关于RealProxy
  8. Nginx(代理)+Tomcat(Java)+Apache(PHP)共用80端口
  9. heartbeat 非联网安装(通过配置本地yum文件库安装heartbeat)
  10. C# Winform 实现Ajax效果自定义按钮