牛顿插值法的原理,在维基百科上不太全面,具体可以参考这篇文章。同样贴出,楼主作为初学者认为好理解的代码。

function p=Newton1(x1,y,x2)
%p为多项式估计出的插值
syms x
n = length(x1);
%差商的求法 for i=2:n
f1(i,1)=(y(i)-y(i-1))/(x1(i)-x1(i-1));
end for i=2:n
for j=i+1:n
f1(j,i)=(f1(j,i-1)-f1(j-1,i-1))/(x1(j)-x1(j-i));
end
end
f1=[y',f1]% 输出带0阶差商的差商表格 %Newton插值函数
Newton=f1(1,1);
for i=2:n
tt=1;
for j=1:i-1
tt=tt*(x-x1(j));
end
Newton=Newton+f1(i,i)*tt;
end
fprintf('Newton插值函数为\n')
expand(Newton) % 将连乘多项式合并展开
x = x2;
p = eval(Newton); % 代入值计算
fprintf('Newton插值函数在所求点x2的函数值为\n')
p

  运行:

  输出:

  CPP实现代码如下:

  注意此处求差商运用的是另外一种方法

#include<iostream>
#include<string>
#include<vector>
using namespace std; // 函数声明,使得其在被完整定义之前可以被引用
double ChaShang(int n, vector<double>&X, vector<double>&Y);
double Newton(double x, vector<double>&X, vector<double>&Y); int main(){
int n;
cout<<"输入插值点的个数:"<<endl;
cin>>n;
// 先将X,Y填充为n个0
vector<double>X(n,0);
vector<double>Y(n,0);
cout<<"请输入X[i],Y[i]:"<<endl;
for(int i=0;i<n;i++){
cin>>X[i]>>Y[i];
}
double x;
cout<<"请输入要进行插值的点的x值:"<<endl;
cin>>x;
cout<<Newton(x,X,Y)<<endl;
return 0;
} // 此处为差商的另一种求法,可有差商定义根据数学归纳法求出
double ChaShang(int n,vector<double>&X,vector<double>&Y){
double f=0;
double temp=0;
for(int i=0;i<n+1;i++){
temp=Y[i];
for(int j=0;j<n+1;j++){
if(i!=j){temp /= (X[i]-X[j]);}
}
f += temp;
}return f; } double Newton(double x,vector<double>&X,vector<double>&Y){
double result=0;
for(int i=0;i<X.size();i++){
//此处的temp用于生成牛顿插值多项式里面的多项式乘积因子,(x-1)(x+3)这些
double temp=1;
double f=ChaShang(i,X,Y);
for(int j=0;j<i;j++){
temp=temp*(x-X[j]);
}
// 差商乘以因子得到最终的牛顿插值多项式
result += f*temp;
}return result;
}

  运行结果:

CPP,MATLAB实现牛顿插值的更多相关文章

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

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

  2. Matlab随笔之插值与拟合(上)

    原文:Matlab随笔之插值与拟合(上) 1.拉格朗日插值 新建如下函数: function y=lagrange(x0,y0,x) %拉格朗日插值函数 %n 个节点数据以数组 x0, y0 输入(注 ...

  3. Matlab随笔之插值与拟合(下)

    原文:Matlab随笔之插值与拟合(下) 1.二维插值之插值节点为网格节点 已知m x n个节点:(xi,yj,zij)(i=1…m,j=1…n),且xi,yi递增.求(x,y)处的插值z. Matl ...

  4. 拉格朗日插值和牛顿插值 matlab

    1. 已知函数在下列各点的值为   0.2 0.4 0.6 0.8 1.0   0.98 0.92 0.81 0.64 0.38 用插值法对数据进行拟合,要求给出Lagrange插值多项式和Newto ...

  5. CPP&MATLAB实现拉格朗日插值法

    开始学习MATLAB(R和Python先放一放...),老师推荐一本书,看完基础就是各种算法...首先是各种插值.先说拉格朗日插值法,这原理楼主完全不懂的,查的维基百科,好久才看懂.那里讲的很详细,这 ...

  6. Matlab曲面拟合和插值

    插值和拟合都是数据优化的一种方法,当实验数据不够多时常常须要用到这样的方法来绘图. 在matlab中都有特定的函数来完毕这些功能. 这两种方法的确别在于: 当測量值是准确的,没有误差时,一般用插值: ...

  7. matlab二维插值--interp2与griddata

    二者均是常用的二维插值方法,两者的区别是, interp2的插值数据必须是矩形域(X,Y必须分别是单调向量),即已知数据点(x,y)组成规则的矩阵,或称之为栅格,可使用meshgid生成. gridd ...

  8. [Python] 牛顿插值

    插值公式为: 差商递归公式为: # -*- coding: utf-8 -*- #Program 0.4 Newton Interpolation import numpy as np import ...

  9. 【matlab】 拉格朗日插值

    第一个函数  "lagrange1.m" 输入:X Y 与点x0 输出:插值函数对应函数值 y0 function y = lagrange1(X,Y,x0) n = length ...

随机推荐

  1. Core Data系列文章(一)Core Data基础

    在iOS开发数据库SQLite的使用介绍了iOS中使用SQLite对数据进行持久化存储,实际上是对数据库直接进行操作,而苹果专门有一套API来间接的对数据进行持久化存储,而且主要针对用户创建的对象 - ...

  2. mysql的小知识点(关于数据库的导入导出 对于windows)

    对于,一个存在的数据,我们该如何去打包成.sql属性的文件呢? 直接进行这两条语句: D:\Program Files\MySQL\mysql\bin>mysqldump -u root -p ...

  3. boxplot

    x1 = rand(20,6); x2 = .5+rand(20,6); x3 = randn(20,6); x = [x1;x2;x3]; x = x(:); g1 = [ones(size(x1) ...

  4. 转载css层级优先级。

    解读CSS样式优先级(修改门户自定义样式必读) 一.什么是CSS优先级?所谓CSS优先级,即是指CSS样式在浏览器中被解析的先后顺序.当同一个元素(或内容)被多个CSS选择符选中时,就要按照优先权取舍 ...

  5. Java多线程-新特征-锁(下)

    在上文中提到了Lock接口以及对象,使用它,很优雅的控制了竞争资源的安全访问,但是这种锁不区分读写,称这种锁为普通锁.为了提高性能,Java提供了读写锁,在读的地方使用读锁,在写的地方使用写锁,灵活控 ...

  6. Configure,make,make install详解

    转:http://my.oschina.net/qihh/blog/66113?fromerr=6ej3CfGJ   无论对于一个初学者还是一个资深的Linux程序员,编写Makefile文件都是一件 ...

  7. 转。管理Gearman

    通常,Gearman被用来分发任务,以便实现异步操作.下面捋捋如何管理Gearman. 说明:请自行安装好Gearman和PHP PECL Gearman. 准备 我们先来创建一个Worker,实现一 ...

  8. 学习shell之前你不得不了解的小知识

    1.!!命令                   # 表示上一条输出history |grep 23         #表示历史记录中的第23条!vim                     #上一 ...

  9. 类似UC天气下拉和微信下拉眼睛头部弹入淡出UI交互效果(开源项目)。

    Android-PullLayout是github上的一个第三方开源项目,该项目主页是:https://github.com/BlueMor/Android-PullLayout  原作者项目意图实现 ...

  10. js 数组去除空值

    for(var i = 0 ;i<wordarr.length;i++)                {                    if(wordarr[i] == "& ...