线性插值、抛物插值、拉格朗日、牛顿插值代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机数值计算方法及程序设计
P63
函数值为
//拉格朗日插值P63
#include <stdio.h>
float czl(int n,float x1,float *px,float *py);
int main()
{
float x1,y1;
int n;
float *p1,*p2;
float x[10]={1,2,3,4,5,6,7};
float y[10]={1,1.414214,1.732051,2,2.236068,2.449490,2.645751};
printf("Input numbers:x1 n=\n");
scanf("%f%d",&x1,&n);
p1=x;
p2=y;
y1=czl(n,x1,p1,p2);
printf("y1=%f\n",y1);
getch();
return 0;
}
float czl(int n,float x1,float *px,float *py)
{
int i,j;
float x[10],y[10],t,y1;
y1=0.0;
for(i=0;i<n;i++,px++,py++)
{
x[i]=*px;
y[i]=*py;
}
for(i=0;i<n;i++)
{
t=1.0;
for(j=0;j<n;j++)
if(i!=j)t=t*(x1-x[j])/(x[i]-x[j]);
y1=y1+t*y[i];
}
return(y1);
}
//输入为
//2.5 4
//输出为
//y=1.582274
//线性插值P58
#include <stdio.h>
float cz(float x0,float x1,float y0,float y1,float x); int main(void)
{
float x0,x1,y0,y1,x,y;
printf("Input numbers:x0,x1,y0,y1,x=?\n");
scanf("%f%f%f%f%f",&x0,&x1,&y0,&y1,&x);
y=cz(x0,x1,y0,y1,x);
printf("y=%f\n",y);
}
float cz(float x0,float x1,float y0,float y1,float x) {
float l0,l1,y;
l0=(x-x1)/(x0-x1);
l1=(x-x0)/(x1-x0);
y=l0*y0+l1*y1;
return (y);
}
/*输入:
1 5 1 2.6.68 2.5
输出
y=1.463526 */
///抛物插值P60
#include<stdio.h>
float cz(float x0,float x1,float x2,float y0,float y1,float y2,float x); float cz(float x0,float x1,float x2,float y0,float y1,float y2,float x) {
float l0,l1,l2,y;
l0=(x-x1)*(x-x2)/((x0-x1)*(x0-x2));
l1=(x-x0)*(x-x2)/((x1-x0)*(x1-x2));
l2=(x-x0)*(x-x1)/((x2-x0)*(x2-x1));
y=l0*y0+l1*y1+l2*y2;
return(y);
}
int main(void)
{
float x0,x1,x2,y0,y1,y2,x,y;
printf("Input numbers:x0 x1 x2 y0 y1 y2 x=?\n");
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
scanf("%f%f%f%f%f%f%f",&x0,&x1,&x2,&y0,&y1,&y2,&x);
y=cz(x0,x1,x2,y0,y1,y2,x);
printf("y=%f\n",y);
getch();
getch();
return 0;
}
/*输入:
1 3 5 1 1.732051 2.236068 2.5
输出
y=1.570416 */
//牛顿插值P83
#include<stdio.h>
#include<math.h>
#define N 6
float sub(float a[],float b[],float x,float e); main()
{
float u[N]={100,121,122,169,196,225}; float v[N]={10,11,12,13,14,15};
float x,y,e,*p1,*p2;
printf("Input number x e= ");
scanf("%f%e",&x,&e);
p1=u;
p2=v;
y=sub(p1,p2,x,e);
printf("y=%f\n",y);
getch();
getch();
}
float sub(float *pp1,float *pp2,float x,float e) {
float a[N],b[N],t[N],y,y1,c;
int i,k;
for(i=0;i<N;i++,pp1++) {
a[i]=*pp1;
printf("%12.6",a[i]);
}
printf("\n");
for(i=0;i<N;i++,*pp2++) {
b[i]=*pp2;
printf("%12.6f",b[i]);
}
printf("\n");
y1=b[0];y=0;
c=1.0;
for(k=1;k<N;k++) {
for(i=k;i<N;i++){
t[i]=(b[i]-b[i-1])/(a[i]-a[i-k]);
}
c=c*(x-a[k-1]);
y1=y1+c*t[k];
if(fabs(y-y1)<e) y=y1;
for(i=k;i<N;i++){
b[i]=t[i];
}
}
return(y);
}。