计算方法——牛顿插值方法的C++实现

牛顿插值多项式:

f(x)=f(x_{0})+f[0,1]*(x-x_{0})+f[0,1,2]*(x-x_{0})*(x-x_{1})+f[0,1,2,3]*(x-x_{0})*(x-x_{1})*(x-x_{2})+...

差商表:

牛顿插值多项式中的f[...]表示差商表中的项,具体[0...n]里是0至n,f[...]就是差商表中的坐标[n][n]项。

差商表的计算:

需要按列计算,即第一列、第二列按这个顺序计算。下面以已知插值节点是x[N]={0.4,0.55,0.65,0.8,0.9} ,y[N]={0.41075,0.57815,0.69675,0.88811,1.02652};为例,计算差商表。

第0列:

0
0y[0]=0.41075
1y[1]=0.57815
2y[2]=0.69675
3y[3]=0.88811
4y[4]=1.02652

第1列:

x0,a1,b
x[0]=0.40y[0]=0.41075
x[1]=0.551y[1]=0.57815b[1]=(y[1]-y[0])/(x[1]-x[0])
x[2]=0.652y[2]=0.69675b[2]=(y[2]-y[1])/(x[2]-x[1])
x[3]=0.83y[3]=0.88811b[3]=...
x[4]=0.94y[4]=1.02652b[4]=...

第2列:

x0,a0,b0,c
x[0]=0.40y[0]=0.41075
x[1]=0.551y[1]=0.57815b[1]=(y[1]-y[0])/(x[1]-x[0])
x[2]=0.652y[2]=0.69675b[2]=(y[2]-y[1])/(x[2]-x[1])c[2]=(b[2]-b[1])/(x[2]-x[0])
x[3]=0.83y[3]=0.88811b[3]=...c[3]=(b[3]-b[2])/(x[3]-x[1])
x[4]=0.94y[4]=1.02652b[4]=...c[4]=...

第3,4列注意下标之间的规律后可自行计算

x0,a1,b2,c3,d4,e
x[0]=0.40y[0]=0.41075
x[1]=0.551y[1]=0.57815b[1]=(y[1]-y[0])/(x[1]-x[0])
x[2]=0.652y[2]=0.69675b[2]=(y[2]-y[1])/(x[2]-x[1])c[2]=(b[2]-b[1])/(x[2]-x[0])
x[3]=0.83y[3]=0.88811b[3]=...c[3]=(b[3]-b[2])/(x[3]-x[1])d[3]=(c[3]-c[2])/(x[3]-x[0])
x[4]=0.94y[4]=1.02652b[4]=...c[4]=...d[4]=(c[4]-c[3])/(x[4]-x[1])e[4]=(d[4]-d[3])/(x[4]-x[0])

        从上面的计算方法中我们可以看出,要想编程实现,可以用一个二维数组(这里设为z[n][n])存储差商表的数值,将数组初始化第0列为y的值后,可以按表格规律z[j][i]=(z[j-1][i-1]-z[j][i-1])/(x[j]-x[i-j]),计算出后面其他列的值。

        最后把差商表中的值带入牛顿插值多项式公式,计算出x取值下插值多项式的值。

代码:

#include<iostream>
#define N 5
using namespace std;
int main(){
	int i,j;
	float varx =0.895,yx=0;
	float x[N]={0.4,0.55,0.65,0.8,0.9};
	float y[N]={0.41075,0.57815,0.69675,0.88811,1.02652};
	float z[N][N]={0};
//  计算差商表
//  初始化第一列
	for(i=0;i<N;i++){
		z[i][0]=y[i];
	}
//  计算后续列
	for(i=1;i<N;i++){
		for(j=i;j<N;j++){
			z[j][i]=(z[j][i-1]-z[j-1][i-1])/(x[j]-x[j-i]);
		}
	}
//  利用差商表中有用的值,计算插值多项式的值
	for(i=0;i<N;i++){
		float t=1;
		for(j=0;j<i;j++)
			t*=(varx-x[j]);	
		yx+=z[i][i]*t;
	}
	cout<<"Nn("<<varx<<")="<<yx<<endl;
}

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值