拉格朗日插值方法C语言编程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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("结束");

}

相关文档
最新文档