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 ...
随机推荐
- javaSE之线程联合
首先定义 : 一个线程A在占有CPU资源期间 ,可以让其他线程调用join()和本线程联合. 嗯哈,像书本这个列子: 如: B.join(); 我们称A在运行期间联合了B, 如果线程A在占有CPU资源 ...
- Path Sum [LeetCode]
Problem Description: http://oj.leetcode.com/problems/path-sum/ Pretty easy. /** * Definition for bin ...
- 自定义jQuery插件Step by Step
1.1.1 摘要 随着前端和后端技术的分离,各大互联网公司对于 Mobile First理念都是趋之若鹜的,为了解决网页在不同移动设备上的显示效果,其中一个解决方案就是Responsive Desig ...
- 关闭“JDK自动更新”提示
- hdu5876 Sparse Graph(补图最短路 bfs)
题目链接:hdu5876 Sparse Graph 详见代码.. #include<cstdio> #include<cstring> #include<algorith ...
- eclipse 安装git的插件和上传项目
这里有个链接,已经很详细的写了过程 博客1以及博客2.其实遇到安装的问题,就是因为我用的eclipse版本比较老,但是eclipse里面又装了好多插件,不想在重新安装eclipse.还有一个很好的博 ...
- NetworkComms网络通信框架V3结构图
NetworkComms网络通信框架序言 来自英国的c#网络通信框架,历时五年打造,由英国剑桥的2位工程师倾情开发,最新版本V3.x版本.
- 下拉刷新列表添加SwipeDismissListViewTouchListener实现滑动删除某一列。
<Android SwipeToDismiss:左右滑动删除ListView条目Item> Android的SwipeToDismiss是github上一个第三方开源框架(github上的 ...
- C#压缩图片1
using System;using System.Collections.Generic;using System.Drawing;using System.Drawing.Drawing2D;us ...
- C#中三种定时器对象的比较
·关于C#中timer类 在C#里关于定时器类就有3个1.定义在System.Windows.Forms里2.定义在System.Threading.Timer类里3.定义在System.Timers ...