牛顿插值法——差商表

C++中Newton插值——计算差商表

目录

    • C++中Newton插值——计算差商表
  • 差商(difference quotient)定义
  • 一、用二维数组存放差商表
  • 二、差商的计算
  • 代码实现


差商(difference quotient)定义

牛顿插值法——差商表_第1张图片

相信看到这篇文章的你,其实在之前就了解或学习的差商的定义和知识,因此下面主要讲在c++中代码如何实现差商表的计算和输出


提示:以下是本篇文章正文内容,下面案例可供参考

一、用二维数组存放差商表

为方便牛顿插值多项式的构造,可建立下表所示各阶差商计算表。

牛顿插值法——差商表_第2张图片
我们将构造二维数组DQ[][]将与上面的表格类似。数组第一列为f(x)的值即零阶差商,第二列为二阶差商…,而第一行我们对应X的下标。
那么数组DQ[0][0]表示f[x0] 是一0阶差商 , DQ[1][1]就表示f[x0,x1]是一个1阶差商,那DQ[4][3]表示的是f[x1,x2,x3,x4]的3阶差商…
DQ数组的列元素就是对应的几阶差商,行元素就是对应的差商计算的末值
那么有N组关系的x与f(x)所建立的差商表就是一个NN的二维数组*

二、差商的计算

首先零阶差商直接存入二维数组的第一列DQ[0][i]中就行。
主要介绍1阶包括1阶之后的差商计算:
由前面定义可知:
在这里插入图片描述

在这里插入图片描述
牛顿插值法——差商表_第3张图片

对应差商表可以很容易发现:
牛顿插值法——差商表_第4张图片
这样就更直观了,后一阶的差商是由前一阶的两个差商运算得到的。
对于一个高阶差商DQ[m][n]=(DQ[m][n-1]-DQ[m-1][n-1])/(x[m]-x[m-n]);
分子部分很好理解,看见图就可以很清楚知道;分母也很好理解,但需要分析一下,不然容易写错。
我们知道分母是两个X值相减,被减数很简单,就是对应几个f(X)算得差商时末尾f(Xm)最靠后的Xm;减数就要追根溯源到0阶所用的f(X)所对应的x值,由上面的下三角表格可以不难发现,0阶对应的X值、Xm和DQ[m][n]构成“等腰直角”三角形,因此减数为:X[m-n]
到此这个简单粗暴的结构就建立起来了,下面让我们看看代码的实现吧。

代码实现

提示:这是在VS2019中的代码和运行结果

#include
#include
using namespace std;
void Dquotient(double x[], double f[],const int n) {
     
	//申请一个动态的二维数组存放差商
	double** DQ = new double* [n];

	//上面申请了行,下面就是把给每行申请一个空间
	for (int i = 0; i < n; i++)DQ[i] = new double [n];

	/******************  下面就是计算差商表的核心步骤(分为两步)***************************/
	//第一步,将fx函数的值放入第一列,这便是0阶差商
	for (int i = 0; i < n; i++)DQ[i][0] = f[i];
	//第二步,这步需要理解newton差商怎么计算
	//这部计算是最重要,计算后一介差商需要用到前一阶差商,这也是为什么先单独要把0阶差商存入DQ的0列
	for(int i=1;i<n;i++)
		for (int j = i; j < n; j++){
     
			DQ[j][i] =(DQ[j][i-1] - DQ[j-1][i - 1]) / (x[j]-x[j-i]);
		}

	//下面就是输出Newton差商表了
	for (int i = 0; i < n; i++) {
     
		for (int j = 0; j <= i; j++) {
     
			cout <<right<<setiosflags(ios::fixed) << setprecision(6) <<DQ[i][j]<<"\t";
		}
		cout << endl;
	}

	//前面动态申请的空间后面一定要释放掉,养成好习惯
	for (int i = 0; i < n; i++)delete DQ[i];
	delete[]DQ;
}
int main() {
     
	double x[] = {
      0.7,0.9,1.1,1.3,1.5,1.7 };
	double f[] = {
      0.6442,0.7833,0.8912,0.9636,0.9975,0.9917 };
	Dquotient(x,f,6);
	system("pause");
	return 0;
}

运行结果:
牛顿插值法——差商表_第5张图片
这是我在CSDAN发的第一篇blog,代码比较粗糙,讲解比较模糊,我这个萌新后期会完善的,如有不对的地方希望指正

你可能感兴趣的:(数值计算与算法,c++,算法,均值算法,数学)