用C语言编一个线性插值的小程序,很着急
#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;//输出最终结果
}
分段线性插值问题
#includestdio.h
#includemath.h
double Lagrange1(double *x, double *y, double xx) //拉格郎日插值
{
int i,j;
double *a,yy=0.000;
a=new double[6];
for(i=0;i 6;i++)
{
a[i]=y[i];
for(j=0;j 6;j++)
if(j!=i)
a[i]*=(xx-x[j])/(x[i]-x[j]);
yy+=a[i];
}
delete a;
return yy;
}
double Lagrange2(double *x, double *y, double input) //分段线性插值
{
double output;
int i;
for (i=0;i5;i++)
{
if (x[i] = input x[i+1] = input)
{
output=y[i] +(y[i+1]-y[i])*(input-x[i])/(x[i+1]-x[i]);
break;
}
}
return output;
}
double Lagrange3(double *x,double *y,double u) //分段二次插值
{
int i,k=0;
double v;
for(i=0;i6;i++)
{
if(ux[1])
{
k=0;
v=y[k]*(u-x[k+1])*(u-x[k+2])/((x[k]-x[k+1])*(x[k]-x[k+2]))+y[k+1]*(u-x[k])*(u-x[k+2])/((x[k+1]-x[k])*(x[k+1]-x[k+2]))+y[k+2]*(u-x[k])*(u-x[k+1])/((x[k+2]-x[k])*(x[k+2]-x[k+1]));
}
if((x[i]uu=x[i+1])(fabs(u-x[i])=fabs(u-x[i+1])))
{
k=i-1;
v=y[k]*(u-x[k+1])*(u-x[k+2])/((x[k]-x[k+1])*(x[k]-x[k+2]))+y[k+1]*(u-x[k])*(u-x[k+2])/((x[k+1]-x[k])*(x[k+1]-x[k+2]))+y[k+2]*(u-x[k])*(u-x[k+1])/((x[k+2]-x[k])*(x[k+2]-x[k+1]));
}
if ((x[i]uu=x[i+1])fabs(u-x[i])fabs(u-x[i+1]))
{
k=i;
v=y[k]*(u-x[k+1])*(u-x[k+2])/((x[k]-x[k+1])*(x[k]-x[k+2]))+y[k+1]*(u-x[k])*(u-x[k+2])/((x[k+1]-x[k])*(x[k+1]-x[k+2]))+y[k+2]*(u-x[k])*(u-x[k+1])/((x[k+2]-x[k])*(x[k+2]-x[k+1]));
}
if(ux[4])
{
k=3;
v=y[k]*(u-x[k+1])*(u-x[k+2])/((x[k]-x[k+1])*(x[k]-x[k+2]))+y[k+1]*(u-x[k])*(u-x[k+2])/((x[k+1]-x[k])*(x[k+1]-x[k+2]))+y[k+2]*(u-x[k])*(u-x[k+1])/((x[k+2]-x[k])*(x[k+2]-x[k+1]));
}
}
return v;
}
void main()
{
double x[6] = {0.0, 0.1, 0.195, 0.3, 0.401, 0.5},y[6] = {0.39894,0.39695,0.39142,0.38138,0.36812,0.35206};
double u;
scanf(“%lf”,u);
printf(“%f\n”,Lagrange1(x,y,u)); //拉格郎日插值
printf(“%f\n”,Lagrange2(x,y,u)); //分段线性插值
printf(“%f\n”,Lagrange3(x,y,u)); //分段二次插值
}
求C#分段线性插值算法代码
///summary
///分段线性插值,将一组数插值为所需点数
////summary
///param name=”dataIn”待插值的数据数组/param
///param name=”n”插值点数/param
///returns插值后的数据数组/returns
public static double[] Interpolation(double[] dataIn,int n)
{
double[] dataOut = new double[n];
int lenIn = dataIn.Length;
double[] a = new double[lenIn];
double[] divIn = new double[lenIn];
double[] divOut = new double[n];
divIn[0] = 0;
for (int i = 1; i lenIn; i++)
{
divIn[i] = divIn[i – 1] + 1;
}
divOut[0] = 0;
for (int i = 1; i n; i++)
{
divOut[i] = divOut[i – 1] + lenIn / Convert.ToDouble(n);
}
int k = 0;
for (int i = k; i n; i++)
{
for (int j = 0; j lenIn – 1; j++)
{
if (divOut[i] = divIn[j] divOut[i] divIn[j + 1])
{
dataOut[i] = (dataIn[j + 1] – dataIn[j]) * (divOut[i] – divIn[j]) / (divIn[j + 1] – divIn[j]) + dataIn[j];
k = i;
}
}
}
return dataOut;
}
用C语言编写一个线性插值程序
#include stdio.h
double Lerp(double x0,double y0,double x1,double y1,double x)
{
double dy = y1 – y0;
if(dy == 0){
printf(“除0错误!\n”);
return 0;
}
return x * (x1 – x0) / dy;
}
int main()
{
double x0,x1,y1,y0,x,y;
printf(“Inptu x0 y0 x1 y1 x:”);
scanf(“%lf %lf %lf %lf %lf”,x0,y0,x1,y1,x);
y = Lerp(x0,y0,x1,y1,x);
printf(“y = %lf\n”,y);
return 0;
}