博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
牛顿插值法及其C++实现
阅读量:4308 次
发布时间:2019-06-06

本文共 1836 字,大约阅读时间需要 6 分钟。

牛顿插值法

 

一、背景引入

 

相信朋友们,开了拉格朗日插值法后会被数学家的思维所折服,但是我想说有了拉格朗日插值法还不够,因为我们每次增加一个点都得重算所有插值基底函数,这样会增加计算量,下面我们引入牛顿插值法,这种插值法,添加一个插值结点我们只要做很小的变动便可以得到新的插值多项式。

 

二、理论推导

 

-均差的定义:

 

 

(一阶均差)

 

 

 

 

二阶均差为一阶均差再求均差。(显然是递推的)

 

一般地,函数f k阶均差定义为:

 

 

 

 

由均差的性质可以推导出:

 

k+1阶均差:

 (具体性质看:《数值分析:第5版》 page:30)

由均差的递推性,我们可以用以下表来求:

 

 

 

 

 

 

 

 

 

求表的公式:

table[i][j] = (table[i - 1][j] - table[i - 1][j - 1]) / (x[j] - x[j - i]);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

其中Px) 为插值多项式,而Rx) 为插值余项。

所以px):

(由于图片问题此处Px) N(x))

 

 

 

 

三、代码实现

由以上推导可知,求牛顿插值多项式子主要就是求均差。

均差可由上表递推求得:

求表的公式:

table[i][j] = (table[i - 1][j] - table[i - 1][j - 1]) / (x[j] - x[j - i]);

 

 

#include 
using namespace std;#include
inline double newton_solution(double x[], double y[], int n, double num, int newton_time){ vector
> table(n + 1); for (int i = 0; i <= n; i++) { table[i].resize(n + 1); } for (int i = 0; i <= n; i++) table[0][i] = y[i]; for (int i = 1; i <= n; i++) { for (int j = i; j <= n; j++) { table[i][j] = (table[i - 1][j] - table[i - 1][j - 1]) / (x[j] - x[j - i]); } } double res = 0.0; for (int i = 0; i <= newton_time; i++) { double temp = table[i][i]; for (int j = 0; j < i; j++) { temp *= num - x[j]; } res += temp; } return res;}int main(int argc, char const *argv[]){ int n = 0; cout << "插值节点个数-1:"; cin >> n; double x[n + 1], y[n + 1]; cout << "\n请输入x[i]:"; for (int i = 0; i <= n; i++) { cin >> x[i]; } cout << "\n请输入y[i]:"; for (int i = 0; i <= n; i++) { cin >> y[i]; } double num = 0; cout << "\n请输入要求的点的x:"; cin >> num; cout << "\n请输入所求的插值多项式次数:"; double newton_time = 0; cin >> newton_time; cout << newton_solution(x, y, n, num, newton_time) << endl; return 0;

 

 

转载于:https://www.cnblogs.com/jake9402/p/7593694.html

你可能感兴趣的文章
互斥锁 synchronized分析
查看>>
java等待-通知机制 synchronized和waity()的使用实践
查看>>
win10 Docke安装mysql8.0
查看>>
docker 启动已经停止的容器
查看>>
order by 排序原理及性能优化
查看>>
Lock重入锁
查看>>
docker安装 rabbitMq
查看>>
git 常用命令 入门
查看>>
关闭selinx nginx无法使用代理
查看>>
shell 脚本部署项目
查看>>
spring cloud zuul网关上传大文件
查看>>
springboot+mybatis日志显示SQL
查看>>
工作流中文乱码问题解决
查看>>
maven打包本地依赖包
查看>>
spring boot jpa 实现拦截器
查看>>
jenkins + maven+ gitlab 自动化部署
查看>>
Pull Request流程
查看>>
Lambda 表达式
查看>>
函数式数据处理(一)--流
查看>>
java 流使用
查看>>