#include<stdio.h>
#include<alloc.h>
float Language(float *x,float *y,float xx,int n)
{
int i,j
float *a,yy=0.0
a=(float *)malloc(n*sizeof(float))
for(i=0i<=n-1i++)
{
a[i]=y[i]
for(j=0j<=n-1j++)
if(j!=i)a[i]*=(xx-x[j])/(x[i]-x[j])
yy+=a[i]
}
free(a)
return yy
}
void main()
{
float x[4]={0.56160,0.5628,0.56401,0.56521}
float y[4]={0.82741,0.82659,0.82577,0.82495}
float xx=0.5635,yy
float Language(float *,float *,float,int)
yy=Language(x,y,xx,4)
printf("x=%f,y=%f\n",xx,yy)
getchar()
}
2.牛顿插值法#include<stdio.h>
#include<math.h>
#define N 4
void Difference(float *x,float *y,int n)
{
float *f
int k,i
f=(float *)malloc(n*sizeof(float))
for(k=1k<=nk++)
{
f[0]=y[k]
for(i=0i<ki++)
f[i+1]=(f[i]-y[i])/(x[k]-x[i])
y[k]=f[k]
}
return
}
main()
{
int i
float varx=0.895,b
float x[N+1]={0.4,0.55,0.65,0.8,0.9}
float y[N+1]={0.41075,0.57815,0.69675,0.88811,1.02652}
Difference(x,(float *)y,N)
b=y[N]
for(i=N-1i>=0i--)b=b*(varx-x[i])+y[i]
printf("Nn(%f)=%f",varx,b)
getchar()
}
留下个邮箱,我发给你:牛顿插值法的程序设计与应用
程序代码如下。希望能帮助到你!
牛顿插值法
#include<stdio.h>
#include<math.h>
#define
n
4
void
difference(float
*x,float
*y,int
n)
{
float
*f
int
k,i
f=(float
*)malloc(n*sizeof(float))
for(k=1k<=nk
)
{
f[0]=y[k]
for(i=0i<ki
)
f[i
1]=(f[i]-y[i])/(x[k]-x[i])
y[k]=f[k]
}
return
}
main()
{
int
i
float
varx=0.895,b
float
x[n
1]={0.4,0.55,0.65,0.8,0.9}
float
y[n
1]={0.41075,0.57815,0.69675,0.88811,1.02652}
difference(x,(float
*
#include<stdio.h>#include<stdlib.h>
#include<iostream.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次插值):"//获得插值次数
cin>>n
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=1j<=nj++)
{
t=(x-d[j-1].x)*t
yt=f(0,j)*t
//cout<<f(0,j)<<endl
y=y+yt
}
return y
}
float lagrange(float x,int count)
{
float y=0.0
for(int k=0k<countk++)//这儿默认为count-1次插值
{
float p=1.0//初始化p
for(int j=0j<countj++)
{//计算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组:"//要求用户输入数据组数
cin>>count
if(count<=20)
break//检查输入的是否合法
system("cls")
}
//获得各组数据
for(int i=0i<counti++)
{
cout<<"请输入第"<<i+1<<"组x的值:"
cin>>d[i].x
cout<<"请输入第"<<i+1<<"组y的值:"
cin>>d[i].y
system("cls")
}
cout<<"请输入x的值:"//获得变量x的值
cin>>x
while(1)
{
int choice=3
cout<<"请您选择使用哪种插值法计算:"<<endl
cout<<" (0):退出"<<endl
cout<<" (1):Lagrange"<<endl
cout<<" (2):Newton"<<endl
cout<<"输入你的选择:"
cin>>choice//取得用户的选择项
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
}
cout<<x<<" , "<<y<<endl//输出最终结果
}