拉格朗日插值方法C语言编程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#define M 20;
int n=0;
int p=1;
int num=0;
double *x;
double *y;
double Calculate(double tt) ;
void Insert(int m);
void Print( );
void NewTon(int m)
{
double tt;
Insert(m);
Print( );
printf("是否继续进行插值、计算还是结束?继续插值请输入1,结束请输入0,求值计算请输入2;p=");
scanf("%d",&p);
printf("\n");
while(p!=0)
{
if(p==1)
{
printf("请输入再次插值点个数num=");
scanf("%d",&num);
NewTon(num);
}
else if(p==2)
{
printf("请输入x=");
scanf("%lf",&tt);
tt=Calculate(tt);
printf("Q(x)=%lf",tt);
printf("\n");
printf("是否继续进行插值、计算还是结束?继续插值请输入1,结束请输入0,求值计算请输入2;p=");
scanf("%d",&p);
printf("\n");
}
else break;
}
}
void Print( )
{
int k,j;
printf("插值多项式为:Q(x)=%lf",y[0]);
for(j=1;j { if(y[j]>=0) printf("+"); printf("%lf",y[j]); for(k=0;k } printf("\n"); } void Insert(int m) { int j,k,t,N;N=n; n+=m; double *x1; double *y1; x1=(double*)malloc(n*sizeof(double)); y1=(double*)malloc(n*sizeof(double)); for(j=0;j { x1[j]=x[j]; y1[j]=y[j]; } for(j=0;j { printf("请输入第%d个插值点x[%d]=",j+1,N+j); scanf("%lf",&x1[N+j]); printf("请输入第%d个插值点y[%d]=",j+1,N+j); scanf("%lf",&y1[N+j]); } x=x1; y=y1; printf("\n"); if(N>1) for(j=0;j { double ss=1; for(k=0;k ss*=x[N+j]-x[k]; for(k=0;k { double rr=y[k]; for(t=0;t rr*=x[N+j]-x[t]; y[N+j]-=rr; } y[N+j]/=ss; } else for(j=1;j { double ss=1; for(k=0;k ss*=x[N+j]-x[k]; for(k=0;k { double rr=y[k]; for(t=0;t rr*=x[N+j]-x[t]; y[N+j]-=rr; } y[N+j]/=ss; } } double Calculate(double tt) { int i,j; double yy=0; double xx;for(i=0;i { xx=y[i]; for(j=0;j { xx=xx*(tt-x[j]); } yy+=xx; } return yy; } void main() { printf("请输入插值点个数num="); scanf("%d",&num); NewTon(num); printf("结束"); }