double newton(double *x, double *y, int n, double num, int cur, int pointNum, double answer)
创新互联拥有十余年成都网站建设工作经验,为各大企业提供成都做网站、成都网站制作服务,对于网页设计、PC网站建设(电脑版网站建设)、成都APP应用开发、wap网站建设(手机版网站建设)、程序开发、网站优化(SEO优化)、微网站、申请域名等,凭借多年来在互联网的打拼,我们在互联网网站建设行业积累了很多网站制作、网站设计、网络营销经验,集策划、开发、设计、营销、管理等网站化运作于一体,具备承接各种规模类型的网站建设项目的能力。
{
//计算均差
for(int i = pointNum -1; icur; i--)
{
y[i] = ( y[i] - y[i-1] ) / ( x[i] - x[i-1] );
}
//已经计算完cur自加
cur++;
//temp进行临时计算
double temp = y[cur];
for(int i= 0; icur; i++)
{
temp *= ( num - x[i] );
}
//将临时计算的结果加到answer
answer += temp;
//如果得到想要的结果就返回答案 否则继续计算
if(cur==n)
return answer;
else
return newton(x,y,n,num,cur,pointNum,answer); /// 少了 return
}
{
double x[20],fx[20],f[20][20],xx,Nx,t; //定义双精度的3个一维数组、一个二维数组、3个变量
int i,j,k,n; //定义4个整型变量
printf(" 请输入插值点的个数n:");
scanf("%d",n); //点的个数存入n
printf(" 请输入插值节点值和插值点函数值:\n");
for(i=0;i=n-1;i++) //接收各个点的值
{
printf("x%d f(%d)分别为:",i,i);
scanf("%lf%lf",x[i],fx[i]); //循环接收各个点的x、y的值并存入
}
for(i=0;i=n-1;i++)
f[i][0]=fx[i]; //把f[20][20]看成一个表,表的第一列按顺序存入因变量的各个值
for(j=1;j=n-1;j++)
for(i=j;i=n-1;i++)
f[i][j]=(f[i][j-1]-f[i-1][j-1])/(x[i]-x[i-j]); //公式,结合书上的图和上面一句话。。
for(k=0;k20;k++)
{
printf("x=");
scanf("%lf",xx); //用户输入的要求解的自变量值
if(xx==9999)
break; //如果自变量值太大了 就跳出去
Nx=f[0][0];
for(i=1;i=n-1;i++)
{ t=1.0;
for(j=0;j=i-1;j++) t=t*(xx-x[j]); //又是公式,就是(x-x0)*(x-x1)*...(x-xn)
Nx=Nx+t*f[i][i]; //公式的尽头
}
printf("N(%f)=%f\n",xx,Nx); //输出用户输入的自变量对应的因变量的值()
}
}
break;
大概这样
已经编译运行确认:
#includestdio.h
#includestdlib.h
#includeiostream.h
typedef struct data
{
float x;
float y;
}Data;//变量x和函数值y的结构
Data d[20];//最多二十组数据
float f(int s,int t)//牛顿插值法,用以返回插商
{
if(t==s+1)
return (d[t].y-d[s].y)/(d[t].x-d[s].x);
else
return (f(s+1,t)-f(s,t-1))/(d[t].x-d[s].x);
}
float Newton(float x,int count)
{
int n;
while(1)
{
cout"请输入n值(即n次插值):";//获得插值次数
cinn;
if(n=count-1)// 插值次数不得大于count-1次
break;
else
system("cls");
}
//初始化t,y,yt。
float t=1.0;
float y=d[0].y;
float yt=0.0;
//计算y值
for(int j=1;j=n;j++)
{
t=(x-d[j-1].x)*t;
yt=f(0,j)*t;
//coutf(0,j)endl;
y=y+yt;
}
return y;
}
float lagrange(float x,int count)
{
float y=0.0;
for(int k=0;kcount;k++)//这儿默认为count-1次插值
{
float p=1.0;//初始化p
for(int j=0;jcount;j++)
{//计算p的值
if(k==j)continue;//判断是否为同一个数
p=p*(x-d[j].x)/(d[k].x-d[j].x);
}
y=y+p*d[k].y;//求和
}
return y;//返回y的值
}
void main()
{
float x,y;
int count;
while(1)
{
cout"请输入x[i],y[i]的组数,不得超过20组:";//要求用户输入数据组数
cincount;
if(count=20)
break;//检查输入的是否合法
system("cls");
}
//获得各组数据
for(int i=0;icount;i++)
{
cout"请输入第"i+1"组x的值:";
cind[i].x;
cout"请输入第"i+1"组y的值:";
cind[i].y;
system("cls");
}
cout"请输入x的值:";//获得变量x的值
cinx;
while(1)
{
int choice=3;
cout"请您选择使用哪种插值法计算:"endl;
cout" (0):退出"endl;
cout" (1):Lagrange"endl;
cout" (2):Newton"endl;
cout"输入你的选择:";
cinchoice;//取得用户的选择项
if(choice==2)
{
cout"你选择了牛顿插值计算方法,其结果为:";
y=Newton(x,count);break;//调用相应的处理函数
}
if(choice==1)
{
cout"你选择了拉格朗日插值计算方法,其结果为:";
y=lagrange(x,count);break;//调用相应的处理函数
}
if(choice==0)
break;
system("cls");
cout"输入错误!!!!"endl;
}
coutx" , "yendl;//输出最终结果
}
#include iostream.h
#include math.h
void main()
{
char L;
do
{
double M[100][100];
double x[100],y[100];
double X=1,xx=0,w=1,N=0,P,R=1;
int n;
cout"请输入所求均差阶数:";
cinn;
for(int i=0;i=n;i++)
{
cout"请输入x"i"的值:"endl;
cinx[i];
cout"请输入y"i"的值:"endl;
ciny[i];
M[i][0]=x[i];
M[i][1]=y[i];
}
for( int j=2;j=n+1;j++)
{
for( i=1;i=n;i++)
{
M[i][j]=(M[i][j-1]-M[i-1][j-1])/(M[i][0]-M[i-j+1][0]);
}
}
for(i=1;i=n;i++)
{
cout"其"i"阶均差为:"M[i][i+1]endl;
}
cout"请输入x的值:x=";
cinxx;
for(i=0;in;i++)
{
X*=xx-x[i];
N+=M[i+1][i+2]*X;
P=M[0][1]+N;
}
cout"其函数值:y="Pendl;
for(i=0;in;i++)
{
w*=xx-x[i];
R=fabs(M[n][n+1]*w);
}
cout"其截断误差:R="Rendl;
coutendl"还想算其它插值吗?是请按'y'否则按'n'"endl;
cinL;
}while(L=='y');
}