拉格朗日插值法C语言的实现
线性插值、抛物插值、拉格朗日、牛顿插值代码

计算机数值计算方法及程序设计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 6float 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);}。
拉格朗日插值牛顿插值C语言实验报告

实验报告:数学与统计学系信息与计算科学专业实验报告一、题目1、上机作业题程序12、上机作业题程序2二、算法1、Lagrange 插值//输入被插值点的数目POINT;int main(){int n;inti,j;POINT points[MAX_N+1];double diff[MAX_N+1];doublex,tmp=0,lagrange=0,tx,ty;printf("\nInput n value:");scanf("%d",&n);if(n>MAX_N){printf("The input n is larger thenMAX_N,please redefine the MAX_N.\n");return 1;}if(n<=0){printf("Please input a number between 1 and %d\n",MAX_N);return 1;}//输入被插值点printf("Now input the (x_i,y_i),i=0,...,%d:\n",n);for(i=0;i<=n;i++)scanf("%lf%lf",&points[i].x,&points[i].y);printf("Now input the x value:"); //输入计算Lagrange插值多项式的x值scanf("%lf",&x);for(i=0;i<=n;i++){diff[i]=0;tx=1;ty=1;for(j=0;j<=n;j++){if(i!=j){tx=tx*(x-points[j].x);ty=ty*(points[i].x-points[j].x);}}diff[i]=tx/ty;}for(i=0;i<=n;i++){tmp=points[i].y*diff[i];printf("%f",tmp);lagrange+=tmp;}printf("lagrange(%f)=%f\n",x,lagrange);return 0;}2、Newton 插值//输入被插值点的数目POINT;int main(){ int n;inti,j;POINT points[MAX_N+1];double diff[MAX_N+1];doublex,tmp,newton=0;printf("\nInput n value: ");scanf("%d",&n);if (n>MAX_N){printf("The input n is larger thenMAX_N,please redefine the MAX_N.\n");return 1;}if(n<=0){printf("Please input a number between 1 and %d\n",MAX_N);// getch(); return 1;}//输入被插值点printf("Now input the (x_i,y_i),i=0,...,%d:\n",n);for (i=0;i<=n;i++)scanf("%lf%lf",&points[i].x,&points[i].y);printf("Now input the x value: ");//输入计算Newton插值多项式的x值scanf("%lf",&x);for (i=0;i<=n;i++)diff[i]=points[i].y;for (i=0;i<n;i++){for (j=n;j>i;j--){diff[j]=(diff[j]-diff[j-1])/(points[j].x-points[j-1-i].x);}//计算f(x_0,…,x_n)的差商}tmp=1;newton=diff[0];for(i=0;i<n;i++){tmp=tmp*(x-points[i].x);newton=newton+tmp*diff[i+1];}printf("newton(%f)=%f\n",x,newton);return 0;}三、C程序1、Lagrange 插值#include <stdio.h>#define MAX_N 20typedefstructtagPOINT{double x;double y;}POINT;int main(){int n;inti,j;POINT points[MAX_N+1];double diff[MAX_N+1];doublex,tmp=0,lagrange=0,tx,ty;printf("\nInput n value:");scanf("%d",&n);if(n>MAX_N){printf("The input n is larger thenMAX_N,please redefine the MAX_N.\n");return 1;}if(n<=0){printf("Please input a number between 1 and %d\n",MAX_N); return 1;}printf("Now input the (x_i,y_i),i=0,...,%d:\n",n);for(i=0;i<=n;i++)scanf("%lf%lf",&points[i].x,&points[i].y);printf("Now input the x value:");scanf("%lf",&x);for(i=0;i<=n;i++){diff[i]=0;tx=1;ty=1;for(j=0;j<=n;j++){if(i!=j){tx=tx*(x-points[j].x);ty=ty*(points[i].x-points[j].x);}}diff[i]=tx/ty;}for(i=0;i<=n;i++){tmp=points[i].y*diff[i];printf("%f",tmp);lagrange+=tmp;}printf("lagrange(%f)=%f\n",x,lagrange);return 0;}2、Newton 插值#include <stdio.h>#define MAX_N 20typedefstructtagPOINT{ double x;double y;} POINT;int main(){ int n;inti,j;POINT points[MAX_N+1];double diff[MAX_N+1];doublex,tmp,newton=0;printf("\nInput n value: ");scanf("%d",&n);if (n>MAX_N){printf("The input n is larger thenMAX_N,please redefine the MAX_N.\n");return 1;}if (n<=0){printf("Please input a number between 1 and %d.\n",MAX_N);return 1;}//输入被插值点(x_i,y_i)printf("Now input the (x_i,y_i),i=0,...,%d:\n",n);for (i=0;i<=n;i++)scanf("%lf%lf",&points[i].x,&points[i].y);printf("Now input the x value: ");scanf("%lf",&x);for (i=0;i<=n;i++)diff[i]=points[i].y;for (i=0;i<n;i++){for (j=n;j>i;j--){diff[j]=(diff[j]-diff[j-1])/(points[j].x-points[j-1-i].x);}}tmp=1;newton=diff[0];for(i=0;i<n;i++){tmp=tmp*(x-points[i].x);newton=newton+tmp*diff[i+1];}printf("newton(%f)=%f\n",x,newton);return 0;}四、运行结果1、Lagrange 插值1910年Larange插值计算得到的人口数:1965年Larange插值计算得到的人口数:2002年Larange插值计算得到的人口数:从插值计算得出的结果1910年的人口数是31872000人,1965年的人口数约为193081511人,2002年的人口数约为26138748,而1910年的实际人口数为91772000人,1960年的实际人口数为179323000人,1970年的人口数为203212000人,所以拉格朗日插值计算得出的结果只有1965年的人口数与实际值相差较近,而1910年和2002年的计算结果都与实际值相差较大,所以插值计算得到的数据准确性并不高。
c++拉格朗日插值法

c++拉格朗日插值法
C++程序实现Lagrange插值公式
Lagrange插值公式,是属于数值分析方面的内容。
此处我想用C++语言程序来实现n各插值节点插值公式的求解,并求出在某一个插值节点对应的函数值。
对于Lagrange插值算法的基本思想,在这里我只想略提两点,一个是拉格朗日插值公式,一个是拉格朗日插值基函数的求解。
因为这两者才是算法需要解决的最根本的问题。
(1)采用插值多项式来近似的逼近拉格朗日差值多项式。
(2)上面的插值多项式中的L(x)即为拉格朗日插值多项式的插值基函数的通项。
该版本可根据输入的插值点自动选取其周围的8个点进行7次插值运算。
拉格朗日插值法C语言的实现

拉格朗日插值法C语言的实现实验报告:拉格朗日插值法的C语言实现一、引言拉格朗日插值法是一种常见的数值插值方法,用于通过已知数据点的函数值,估计在其他点上的函数值。
其基本思想是依据已知数据点构造一个满足通过这些点的多项式,并使用这个多项式来估计其他点上的函数值。
本实验旨在实现拉格朗日插值法的C语言代码,并通过实例进行验证和分析。
二、原理介绍拉格朗日插值法的基本原理是通过已知数据点的函数值,计算一个多项式,使得该多项式通过这些数据点,从而估计其他点上的函数值。
具体而言,对于给定的n个数据点 (x0, y0), (x1, y1), ..., (xn, yn),其中xi和yi分别表示自变量和因变量在第i个数据点上的取值,我们要计算一个多项式:P(x) = y0 * L0(x) + y1 * L1(x) + ... + yn * Ln(x)其中,Lk(x)是拉格朗日基函数,定义为:Lk(x) = Π(j=0,j≠k,n) (x - xj) / (xk - xj)三、实验设计本实验设计了一个C语言函数lagrange_interpolation,该函数以已知数据点和待插值的点作为输入,输出待插值点的函数值。
1.函数接口设计:```double lagrange_interpolation(double *x, double *y, int n, double xi);```参数说明:x表示已知数据点的自变量数组,y表示对应的因变量数组,n为已知数据点的个数,xi表示待插值点的自变量。
返回值:返回待插值点的函数值。
2.函数实现步骤:(1)定义变量和数组(2)构建拉格朗日插值多项式(3)计算待插值点的函数值(4)返回结果四、实验结果与分析为了验证lagrange_interpolation函数的准确性和稳定性,我们列举了以下测试实例,并对结果进行了分析:实例1:已知数据点:(0,1),(1,2),(2,1),(3,0)待插值点:x=0.5实例2:已知数据点:(0,1),(1,2),(2,1),(3,0)待插值点:x=1.5实例3:已知数据点:(0,1),(1,2),(2,1),(3,0)待插值点:x=2.5实例4:已知数据点:(0,1),(1,2),(2,1),(3,0)待插值点:x=4.5通过对以上测试实例的验证,发现实验结果和预期结果完全一致。
拉格朗日插值c++代码

#include
using namespace std;
#define L 2
int main()
{
int C,i,k;
double x;
double y=0.0;
double t=1.0;
cout<<"请输入已知有多少个点对"<<endl;< p="">
cin>>C;
double (*p)[L]=new double[C][L];
cout<<"输入各个点对的值"<<endl;< p="">
for(i=0;i<c;i++)< p="">
for(k=0;k<l;k++)< p="">
cin>>p[i][k];
cout<<"输入你要估算的x的值";
cin>>x;
for(k=0;k<c;k++)< p="">
{ቤተ መጻሕፍቲ ባይዱ
for(i=0;i<c;i++)< p="">
{
if(i==k) continue ;
t=(x-p[i][0])/(p[k][0]-p[i][0])*t;
}
y=y+t*p[k][1];
t=1;
}
cout<<"当x="<<x<<" delete[]="" p="" p;<="" 时,估计的结果为:"<<y<
Lagrange插值的C语言编程

} } for(ii=0;ii<nn;ii++) *(pyy+ii)=*(result+ii); free(result); return 0; } void main() { //用 Lagrange 高次插值、分段线性插值、分段抛物插值对数据进行插值 int n=8,nn=15; double *x=(double *)malloc(n*sizeof(double)); x[0]=0; for(int i=1;i<n;i++) x[i]=x[i-1]+2; double *y=(double *)malloc(n*sizeof(double)); y[0]=0; for(i=1;i<n;i++) y[i]=y[i-1]+0.005; double *xx=(double *)malloc(nn*sizeof(double)); xx[0]=0; for(i=1;i<nn;i++) xx[i]=xx[i-1]+1; double *yy=(double *)malloc(nn*sizeof(double)); printf("插值前:\n"); printf("x= "); for(i=0;i<=n-1;i++) printf("%lf ",x[i]); printf("\n"); printf("y= "); for(i=0;i<=n-1;i++) printf("%lf ",y[i]); printf("\n"); //LInterp(x,y,n,xx,yy,nn); //PLInterp(x,y,n,xx,yy,nn); PPInterp(x,y,n,xx,yy,nn); printf("插值后:\n"); printf("x= "); for(i=0;i<=n-1;i++) printf("%lf ",x[i]); printf("\n"); printf("y= "); for(i=0;i<=n-1;i++) printf("%lf ",y[i]); printf("\n"); printf("xx= "); for(i=0;i<=nn-1;i++) printf("%lf ",xx[i]); printf("\n"); printf("yy= "); for(i=0;i<=nn-1;i++)
拉格朗日(Lagrange)插值算法

拉格朗⽇(Lagrange)插值算法拉格朗⽇插值(Lagrange interpolation)是⼀种多项式插值⽅法,指插值条件中不出现被插函数导数值,过n+1个样点,满⾜如下图的插值条件的多项式。
也叫做拉格朗⽇公式。
这⾥以拉格朗⽇3次插值为例,利⽤C++进⾏实现:1//利⽤lagrange插值公式2 #include<iostream>3using namespace std;45double Lx(int i,double x,double* Arr)6 {7double fenzi=1,fenmu=1;8for (int k=0;k<4;k++)9 {10if (k==i)11continue;12 fenzi*=x-Arr[k];13 fenmu*=Arr[i]-Arr[k];14 }15return fenzi/fenmu;16 }1718int main()19 {20double xArr[4]={};21double yArr[4]={};22//输⼊4个节点坐标23 cout<<"请依次输⼊4个节点的坐标:"<<endl;24for (int i=0;i<4;i++)25 cin>>xArr[i]>>yArr[i];2627//输⼊要求解的节点的横坐标28 cout<<"请输⼊要求解的节点的横坐标:";29double x;30 cin>>x;31double y=0;32for (int i=0;i<4;i++)33 y+=Lx(i,x,xArr)*yArr[i];34 printf("x=%lf时,y=%lf\n",x,y);3536//分界,下⾯为已知y求x37 cout<<"请输⼊要求解的节点的纵坐标:";38 cin>>y;39 x=0;40for (int i=0;i<4;i++)41 x+=Lx(i,y,yArr)*xArr[i];42 printf("y=%lf时,x=%lf\n",y,x);4344 system("pause");45return0;46 }作者:耑新新,发布于转载请注明出处,欢迎邮件交流:zhuanxinxin@。
拉格朗日插值法(c++)

拉格朗⽇插值法(c++)已给sin0.32=0.314567,sin0.34=0.333487,sin0.36=0.352274,计算sin0.3367的值#include <iostream>#include<iomanip>#include <cmath>using namespace std;int main(){double numerator_cofficient; //⽤来记录插值分⼦的乘积结果double denominator_coefficient; //⽤来记录插值分母乘积的结果double input_x; //需要输⼊的x的值double x[3]={0.32,0.34,0.36}; //已知x的值double y[3]={0.314567,0.333487,0.352274}; //已知y的值double result=0; //⽤来记录插值结果cout<<"通过拟合得到的拉格朗⽇多项式为:"<<endl;for (int i=0;i<3;i++){denominator_coefficient=1;cout<<y[i]<<"*";for (int j=0;j<3;j++){if (i==j)continue;cout<<"("<<"x-"<<x[j]<<")";}cout<<"/";for (int j=0;j<3;j++){if (i==j)continue;denominator_coefficient*=(x[i]-x[j]);}cout<<denominator_coefficient<<"*"<<"("<<"x-"<<x[i]<<")";if (i<3){cout<<"+";}}cout<<endl;cout<<"请输⼊需要插值的x:";cin>>input_x;for (int i=0;i<3;i++){numerator_cofficient=1;denominator_coefficient=1;for (int j=0;j<3;j++){if (i==j)continue;numerator_cofficient*=(input_x-x[j]);}for (int j=0;j<3;j++){if (i==j)continue;denominator_coefficient*=(x[i]-x[j]);}result+=(y[i]*numerator_cofficient/denominator_coefficient);}cout<<"插值结果为:"<<setiosflags(ios::fixed)<<setprecision(10)<<result<<endl;cout<<"函数的真实值:"<<sin(0.3367)<<endl;cout<<"计算误差为:"<<100*(abs(result-sin(0.3367))/sin(0.3367))<<"%"<<endl; return 0;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验 一 .拉格朗日插值法C 语言的实现
1.实验目的:
进一步熟悉拉格朗日插值法。
掌握编程语言字符处理程序的设计和调试技术。
2.实验要求:
已知:某些点的坐标以及点数。
输入:条件点数以及这些点的坐标 。
输出:根据给定的点求出其对应的拉格朗日插值多项式的值 。
3.程序流程:
(1)输入已知点的个数;
(2)分别输入已知点的X 坐标;
(3)分别输入已知点的Y 坐标;
(4)通过调用函数lagrange 函数,来求某点所对应的函数值。
拉格朗日插值多项式如下:
0L ()()0,1,n
n j k k j j k x y l x y j n ====∑…… 其中00()()0,1,,()k k x x l x k n x x -=
=-k-1k+1n k k-1k k+1k n ……(x-x )(x-x )?…(x-x )…………(x -x )(x -x )?…(x -x )
程序流程图:
↓
程序如下:
#include <iostream>
#include <>
#include <>
float lagrange(float *x,float *y,float xx,int n) /*拉格朗日插值算法*/ {
int i,j;
float *a,yy=; /*a作为临时变量,记录拉格朗日插值多项式*/
a=(float *)malloc(n*sizeof(float));
for(i=0;i<=n-1;i++)
{
a[i]=y[i];
for(j=0;j<=n-1;j++)
if(j!=i) a[i]*=(xx-x[j])/(x[i]-x[j]);
yy+=a[i];
}
free(a);
return yy;
}
int main()
{
int i;
int n;
float x[20],y[20],xx,yy;
printf("Input n:");
scanf("%d",&n);
if(n>=20)
{
printf("Error!The value of n must in (0,20)."); getch();return 1; }
if(n<=0)
{
printf("Error! The value of n must in (0,20)."); getch(); return 1; }
for(i=0;i<=n-1;i++)
{
printf("x[%d]:",i);
scanf("%f",&x[i]);
}
printf("\n");
for(i=0;i<=n-1;i++)
{
printf("y[%d]:",i);scanf("%f",&y[i]); }
printf("\n");
printf("Input xx:");
scanf("%f",&xx);
yy=lagrange(x,y,xx,n);
printf("x=%f,y=%f\n",xx,yy);
getch();
}
举例如下:
已知当x=1,-1,2时f(x)=0,-3,4,求f的值。
运行结果如下:。