拉个朗日插值

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>

/*重新排列*/
void cxpl(int n,int m,float t,float *x,float *y )
{int i,j;
float a;
for(i=0;i<m;i++)
for(j=i+1;j<n;j++)
{ if(fabs(*(x+j)-t)<fabs(*(x+i)-t))
{a=*(x+i);
*(x+i)=*(x+j);
*(x+j)=a;
a=*(y+i);*(y+i)=*(y+j);*(y+j)=a;
}
}
}

float lag(int n,float *x,float *y,float t)
{int i,j;
float p,s,la;
p=1;la=0;
for(i=0;i<n;i++)
{for(j=0;j<n;j++)
{if(j!=i)
p=p*(t-*(x+j))/(*(x+i)-*(x+j));
}
s=*(y+i)*p;
p=1;
la=la+s;
}
return(la);
}

void main()
{ int m,n,k,i;
float *x,*y,la,t;
printf("请输入给定点的数量n");
scanf("%d",&n);

x=(float*)calloc(n,sizeof(float));
if(x==NULL)
{printf("内存分配失败");
exit(1);
}
y=(float*)calloc(n,sizeof(float));
if(y==NULL)
{printf("内存分配失败");
exit(1);
}
//printf("请输入x的值");
//for(i=0;i<n;i++)
// scanf("%f",x+i);
//printf("请输入y的值,注意与x的值一一对应");
// for(i=0;i<n;i++)
// scanf("%f",y+i);
x[0]=300;x[1]=400;x[2]=500;x[3]=600;x[4]=700;x[5]=800;
y[0]=14.7; y[1]=3.85; y[2]=1.21; y[3]=0.49; y[4]=0.23;y[5]=0.11;
for(i=0;i<n;i++)
{ printf("x[%d]=%f ",i,*(x+i));
printf("y[%d]=%f/n",i,*(y+i));
}

for(i=0;;i++)
{printf("请输入t的值(退出则输入0)");
scanf("%f",&t);
if(t==0)
{printf("确认退出请输入0,计算f(0)请按输入任意数字值");
scanf("%d",&m);
if(m==0)break;

}
printf("请输入需要使用的点的个数");
scanf("%d",&k);
cxpl(n,k,t,x,y);
la=lag(k,x,y,t);
printf("插值结果是:/n");
printf(" f(%3.2f)=%3.4f/n",t,la);
}
free(x);
free(y);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值