CPP,MATLAB实现牛顿插值
牛顿插值法的原理,在维基百科上不太全面,具体可以参考这篇文章。同样贴出,楼主作为初学者认为好理解的代码。
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实现牛顿插值的更多相关文章
- 多项式函数插值:全域多项式插值(一)单项式基插值、拉格朗日插值、牛顿插值 [MATLAB]
全域多项式插值指的是在整个插值区域内形成一个多项式函数作为插值函数.关于多项式插值的基本知识,见“计算基本理论”. 在单项式基插值和牛顿插值形成的表达式中,求该表达式在某一点处的值使用的Horner嵌 ...
- Matlab随笔之插值与拟合(上)
原文:Matlab随笔之插值与拟合(上) 1.拉格朗日插值 新建如下函数: function y=lagrange(x0,y0,x) %拉格朗日插值函数 %n 个节点数据以数组 x0, y0 输入(注 ...
- Matlab随笔之插值与拟合(下)
原文:Matlab随笔之插值与拟合(下) 1.二维插值之插值节点为网格节点 已知m x n个节点:(xi,yj,zij)(i=1…m,j=1…n),且xi,yi递增.求(x,y)处的插值z. Matl ...
- 拉格朗日插值和牛顿插值 matlab
1. 已知函数在下列各点的值为 0.2 0.4 0.6 0.8 1.0 0.98 0.92 0.81 0.64 0.38 用插值法对数据进行拟合,要求给出Lagrange插值多项式和Newto ...
- CPP&MATLAB实现拉格朗日插值法
开始学习MATLAB(R和Python先放一放...),老师推荐一本书,看完基础就是各种算法...首先是各种插值.先说拉格朗日插值法,这原理楼主完全不懂的,查的维基百科,好久才看懂.那里讲的很详细,这 ...
- Matlab曲面拟合和插值
插值和拟合都是数据优化的一种方法,当实验数据不够多时常常须要用到这样的方法来绘图. 在matlab中都有特定的函数来完毕这些功能. 这两种方法的确别在于: 当測量值是准确的,没有误差时,一般用插值: ...
- matlab二维插值--interp2与griddata
二者均是常用的二维插值方法,两者的区别是, interp2的插值数据必须是矩形域(X,Y必须分别是单调向量),即已知数据点(x,y)组成规则的矩阵,或称之为栅格,可使用meshgid生成. gridd ...
- [Python] 牛顿插值
插值公式为: 差商递归公式为: # -*- coding: utf-8 -*- #Program 0.4 Newton Interpolation import numpy as np import ...
- 【matlab】 拉格朗日插值
第一个函数 "lagrange1.m" 输入:X Y 与点x0 输出:插值函数对应函数值 y0 function y = lagrange1(X,Y,x0) n = length ...
随机推荐
- 安装 request模块
python3 requests 安装包下载安装[windows] 听语音 | 浏览:54 | 更新:2016-07-25 17:09 windows下直接使用:easy_install reques ...
- C#抓包
抓包過程中發現頁面<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" v ...
- content.boundingRectWithSize计算出来的高度不准
计算出来的高度会少一行的高度,最后一行会显示不全.减掉padding会解决这个问题. let padding = self.reviewText.textContainer.lineFragm ...
- OLE填充EXCEL
先把基本的FORM写好: 1.行列属性 FORM row_column USING p_r p_width p_type. CASE p_type. WHEN 'R'. "行高 = p_r ...
- PDF 补丁丁 0.4.1.804 测试版发布:合并文件夹的图片和PDF文件,自由生成多层次书签
新的测试版增强了合并文件的功能,可以合并文件夹内的图片和PDF文件,还可以在合并文件列表上直接指定与合并文件对应的PDF书签标题.通过拖放文件项目生成多层次的PDF书签.如下图所示: 另外,新的测试版 ...
- POJ 3687 逆序拓扑
额.题目大意:有N个球.编号和重量都是唯一不重复的.然后.给你m个pair a和b,表示编号为a的点一定比编号为b的点轻.然后捏.输出每个点对应的重量.关键是要求.如果有多种可能性的话,输出让序号小的 ...
- spring mvc如何获取问号后的url参数
@RequestMapping(method=RequestMethod.GET) public ModelAndView allUsers(@RequestParam int page){ Mode ...
- flash builder的编译缓存
C:\Users\Administrator\AppData\Roaming 因为我的一个项目是手机.浏览器都支持的项目,所以我经常删除项目然后修改成别的类型: 可能是这个原因,导致我的程序或者加载的 ...
- mapreduce job提交流程源码级分析(三)
mapreduce job提交流程源码级分析(二)(原创)这篇文章说到了jobSubmitClient.submitJob(jobId, submitJobDir.toString(), jobCop ...
- PowerMock使用遇到的一些问题
首先使用PowerMock Mock对象如果不成功的话首先要检查在测试类上是否有这两个声明@RunWith(PowerMockRunner.class) ...