欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

有关实现牛顿插值多项式算法的过程中出现的问题

程序员文章站 2022-03-05 08:44:59
...

有关牛顿插值多项式算法的实现中出现的问题

笔者使用以下算法来实现:

#include <iostream>
using namespace std;

int main()
{

//这里是输入数据,为了方便调试,直接存入了数组中
double x[20] = { 0.10,0.15 ,0.20 ,0.25 ,0.30 ,0.35, 0.40 ,0.45 ,0.50 ,0.55 ,0.60, 0.65 ,0.70 ,0.75 ,0.80, 0.85 ,0.90 ,0.95, 1.00 ,1.05 };
	double y[20] = { 0.1103329 ,0.1736223 ,0.2426552 ,0.3176729 ,0.3989105 ,0.4865951 ,0.5809439 ,0.6821617, 0.7904390 ,0.9059492 ,1.0288456 ,1.1592592 ,1.2972951, 1.4430292 ,1.5965053, 1.7577308 ,1.9266733, 2.1032563 ,2.2873552 ,2.4787929 };

//以下为代码实现部分
	double t;
	int N, n = 20;
	int t_pos = 0;
	int  start, end, i, j, s;
	cin >> t;      
	cin >> N;    //构造N次牛顿插值

	//创建差商数组

	double** f,*X,*Y,*b;

	f= new double*[N];//差商数组
	X= new double[N];//插值点X坐标
	Y= new double[N];//插值点Y坐标
	b= new double[N];//牛顿插值多项式数值

	//为差商数组分配空间
	for ( i = 0; i < N; i++)
	{
		f[i] =  new double[N];
	}

	//确定插值点位
	while ((x[t_pos]<t) && (t_pos<n))
	{
		t_pos = t_pos + 1;
	}
	
   //选取插值点
	if (N % 2 == 0) 
	{ 
		start = t_pos - (N / 2);
	    end = t_pos + (N / 2);
	}

	else
	{ 
		start = t_pos - ((N / 2) + 1);
	    end = t_pos + (N / 2); 
	}
 
	if (start < 0)
	{
		start = 0;
		end = start + N;
	}

	if (end > n - 1)
	{
		end = n - 1;
		start = end - N;
	}


//将插值点放入插值数组
	for (s= start,i=0;  s <= end; s++)
	{
		X[i] = x[s];
		Y[i] = y[s];
		i++;
	}

//计算0阶差商
	for (i = 0; i < N; i++)
	{
		f[i][0] = Y[i];
	}

	//计算N阶差商
	for (i = 1; i < N; i++)
	{
		for (j = 1; j <= i; j++)
		{
		f[i][j] = (f[i][j - 1] - f[i - 1][j-1]) /(X[i] - X[i - j]);
		}	
	}

	//确定差商
	for (i = 0; i < N; i++)
	{
		b[i] = f[i][i];
	}

	//牛顿插值算法
	for (i = N; i >= 1; i--)
	{
		b[i - 1] = f[i - 1][i - 1]+ (t - X[i-1]) * b[i];
	}
   //输出计算结果
	cout << b[0];

	return 0;

}

并没有得到想要的结果.
有关实现牛顿插值多项式算法的过程中出现的问题
但是在按下F11键进行逐步调试的时候,却得到了想要的结果
有关实现牛顿插值多项式算法的过程中出现的问题

笔者为初学者,实在不知为何会出现这种情况,望求答之。

相关标签: 算法