牛顿插值法
算法很简单,参考了图书馆借的指导书。
书上用的C,我把它转为C++,但是结果不对。
#include<iostream.h>
#define MAX_N 20
typedef struct tagPOINT
{
double x;
double y;
}POINT;
int main()
{
POINT points[MAX_N];
double diff[MAX_N];
cout<<"Input n value:"<<endl;
int n;
cin>>n;
if (n>MAX_N)
cout<<"The input n is larger than MAX_N,please redefine the MAX_N."<<endl;
if (n<=0)
cout<<"Please input a number between 1 and "<< MAX_N << ".";
cout << "Now input the (x_i,y_i),i=0,...,"<<n <<"."<<endl;
for (int i=0;i<=n;i++)
cin>>points[i].x>>points[i].y;
cout<< "Now input the x value:"<<endl;
double x;
cin>>x;
for (i=0;i<=n;i++)
diff[i]=points[i].y;
for(i=0;i<=n;i++)
diff[i]=points[i].y;
for(int k=0; k<n; k++)
{
for (int j=n;j>k;j--)
{ diff[j]=(diff[j]-diff[j-1])/(points[j].x-points[j-1-k].x);
}
}
double tem=1;
double newton=diff[0];
for(i=0; i<n; i++)
{
tem=tem*(x-points[i].x);
newton=newton+tem*diff[i+1];
}
cout<< "newton("<<x<<")="<< newton<<endl;
return 0;
}
算法分析:
很郁闷,运行没有错误,
仔细查找后发现书上一个FOR语句中变量错了,在计算K阶差商时用变量K控制循环,
在两个FOR嵌套中j变量是从大到小,好多程序都喜欢这样,我想知道这样做有什么好处?
难点是设计DIFF[]和TEM