有关实现牛顿插值多项式算法的过程中出现的问题
程序员文章站
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键进行逐步调试的时候,却得到了想要的结果
笔者为初学者,实在不知为何会出现这种情况,望求答之。