编程实现拉格朗日(lagrange)插值法(C语言)
拉格朗日插值法编程
拉格朗日插值法编程一、引言拉格朗日插值法是一种常见的数值插值方法,用于根据已知的离散数据点,估计出函数的近似值。
在许多领域中,这种方法被广泛应用,如数学建模、图像处理、信号处理等。
本文将详细介绍拉格朗日插值法的原理,并给出相应的编程实现。
二、拉格朗日插值法原理拉格朗日插值法的原理基于拉格朗日函数,通过已知的离散数据点来逼近函数的值。
设已知n+1个数据点{(x0, y0), (x1, y1), … , (xn, yn)},其中xi为自变量的值,yi为因变量的值。
要通过这些数据点来逼近函数f(x)。
拉格朗日插值多项式的表达式如下:L(x) = Σ(yi * Li(x)) 其中Li(x)为拉格朗日基函数,定义为:Li(x) = Π((x - xj) / (xi - xj)), j≠iLi(x)的含义是在第i个数据点处,Li(x)取值为1,在其他数据点处,Li(x)取值为0。
通过将已知的n+1个数据点代入拉格朗日插值多项式,并求和,就可以得到一个对函数f(x)的近似。
三、拉格朗日插值法的实现步骤1.输入已知的离散数据点,包括自变量的值(xi)和因变量的值(yi)。
2.计算每个数据点处的拉格朗日基函数Li(x)。
3.将已知的n+1个数据点代入拉格朗日插值多项式,并求和,得到近似函数L(x)。
4.输入待求点的自变量值x,将其代入近似函数L(x),得到近似值f(x)。
四、示例代码实现下面是用Python实现拉格朗日插值法的示例代码:# Step 1: 输入已知的离散数据点x = [2, 4, 6, 8]y = [5, 3, 9, 1]# Step 2: 计算每个数据点处的拉格朗日基函数Li(x)def lagrange_basis(i, xi, x):basis = 1for j, xj in enumerate(xi):if j != i:basis *= (x - xj) / (xi[i] - xj)return basis# Step 3: 计算近似函数L(x)def lagrange_interpolation(xi, yi, x):L = 0for i, xi in enumerate(xi):L += yi[i] * lagrange_basis(i, xi, x)return L# Step 4: 输入待求点的自变量值x,得到近似值f(x)x_test = 5y_test = lagrange_interpolation(x, y, x_test)print("f({}) ≈ {}".format(x_test, y_test))五、优缺点分析拉格朗日插值法的优点是简单易懂、计算方便,并且可以通过增加数据点的数量来提高近似的精确度。
牛顿算法和拉格朗日插值算法的C语言实现
牛顿算法和拉格朗日插值算法的C语言实现悬赏分:200 - 解决时间:2009-1-8 07:47求如下两个算法的C语言实现:牛顿算法拉格朗日插值算法提问者:匿名最佳答案已经编译运行确认:#include<stdio.h>#include<stdlib.h>#include<iostream.h>typedef struct data{float x;float y;}Data;//变量x和函数值y的结构Data d[20];//最多二十组数据float f(int s,int t)//牛顿插值法,用以返回插商{if(t==s+1)return (d[t].y-d[s].y)/(d[t].x-d[s].x);elsereturn (f(s+1,t)-f(s,t-1))/(d[t].x-d[s].x);}float Newton(float x,int count){int n;while(1){cout<<"请输入n值(即n次插值):";//获得插值次数cin>>n;if(n<=count-1)// 插值次数不得大于count-1次break;elsesystem("cls");}//初始化t,y,yt。
float t=1.0;float y=d[0].y;float yt=0.0;//计算y值for(int j=1;j<=n;j++){t=(x-d[j-1].x)*t;yt=f(0,j)*t;//cout<<f(0,j)<<endl;y=y+yt;}return y;}float lagrange(float x,int count){float y=0.0;for(int k=0;k<count;k++)//这儿默认为count-1次插值{float p=1.0;//初始化pfor(int j=0;j<count;j++){//计算p的值if(k==j)continue;//判断是否为同一个数p=p*(x-d[j].x)/(d[k].x-d[j].x);}y=y+p*d[k].y;//求和}return y;//返回y的值}void main(){float x,y;int count;while(1){cout<<"请输入x[i],y[i]的组数,不得超过20组:";//要求用户输入数据组数cin>>count;if(count<=20)break;//检查输入的是否合法system("cls");}//获得各组数据for(int i=0;i<count;i++){cout<<"请输入第"<<i+1<<"组x的值:";cin>>d[i].x;cout<<"请输入第"<<i+1<<"组y的值:";cin>>d[i].y;system("cls");}cout<<"请输入x的值:";//获得变量x的值cin>>x;while(1){int choice=3;cout<<"请您选择使用哪种插值法计算:"<<endl;cout<<" (0):退出"<<endl;cout<<" (1):Lagrange"<<endl;cout<<" (2):Newton"<<endl;cout<<"输入你的选择:";cin>>choice;//取得用户的选择项if(choice==2){cout<<"你选择了牛顿插值计算方法,其结果为:";y=Newton(x,count);break;//调用相应的处理函数}if(choice==1){cout<<"你选择了拉格朗日插值计算方法,其结果为:";y=lagrange(x,count);break;//调用相应的处理函数}if(choice==0)break;system("cls");cout<<"输入错误!!!!"<<endl;}cout<<x<<" , "<<y<<endl;//输出最终结果}回答者:希声和寡-魔导师十一级1-7 23:18我来评论>>提问者对于答案的评价:你是第一个吧,谢谢了您觉得最佳答案好不好?目前有0 个人评价50% (0)50%(0)相关内容• 100分求高手帮我写下牛顿插值和样条插值的VB代码,急...• 拉格朗日插值工式是什么?• 拉格朗日插值里,什么是龙格现象?谢谢!• 5次拉格朗日插值多项式• 怎么用c++语言实现拉格朗日插值更多关于插值算法c的问题>>查看同主题问题:拉格朗日牛顿算法插值语言其他回答共 2 条我们做的实验课呵呵上面的是牛顿下面的是啦格朗日#include<iostream.h>void newton(){float x[100],y[100],c[100][100],x1,xp,wx;int n,i,j;cout<<"输入数据组的个数"<<endl;cin>>n;for(i=0;i<n;i++){cout<<"当前输入第"<<i<<"组数据"<<endl;cin>>x[i];cin>>y[i];}for(j=0;j<n;j++){if(j>0)for(i=0;i<n-j;i++)c[i][j]=((c[i+1][j-1]-c[i][j-1])/(x[i+j]-x[i]));elsefor(i=0;i<n;i++)c[i][0]=y[i];}xp=y[0];char m='y';while(m=='y'){cout<<"请输入你要求的点的X值:"<<endl;cin>>x1;for(i=1;i<n;i++){wx=1;for(j=0;j<=i-1;j++)wx=wx*(x1-x[j]);xp=xp+c[0][i]*wx;}cout<<"newton插值的结果为:"<<xp<<endl;cout<<"是否想继续计算(Y/N)"<<endl;cin>>m;}}void main(){newton();}-------------------------------------------------------#include "stdio.h"#include "iostream.h"#include "string.h"typedef struct{double x;double y;}point;int main(int argc, char* argv[]){double X,jg1,jg2;int i,j;int n;point point[100];cout<<"input n"<<endl;cin>>n;cout<<"input x"<<endl;for(i=0;i<n;i++)cin>>point[i].x;cout<<"input y"<<endl;for(i=0;i<n;i++)cin>>point[i].y;cout<<"input the number you want to compute:"<<endl;cin>>X;for(i=0;i<n;i++){jg1=1;for(j=0;j<n;j++){if(i!=j)jg1=jg1*((X-point[j].x)/(point[i].x-point[j].x));}jg2=jg2+(point[j].y)*jg1;}cout<<jg2;}回答者:a4321559 - 经理四级1-7 23:55分数给a4321559 吧。
拉格朗日插值牛顿插值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年的计算结果都与实际值相差较大,所以插值计算得到的数据准确性并不高。
拉格朗日插值
/* 拉格朗日插值*/# include <stdio.h>void main ( ){float li (float z,float x[100],int n,int i); /* 函数声明*/ void input (float a[100],int n);int n; /* 插值多项式的次数n */printf ("请输入插值多项式的次数n:\n");scanf ("%d",&n);float x[100]; /* 存储x */printf ("请输入数据x(插值节点):\n");input (x,n+1); /* 调用一维数组输入函数*/float y[100]; /* 存储y */printf ("请输入数据y(插值节点对应的函数值):\n");input (y,n+1); /* 调用一维数组输入函数*/float z; /* 存储插值点*/printf ("请输入插值点:\n");scanf ("%f",&z);float s=0,t; /* 计算插值点对应的函数值*/int i;for (i=0;i<=n;i++){t=y[i]*li(z,x,n,i);s=s+t;}printf ("L%d(%f)=%f\n",n,z,s); /* 输出结果*/}float li (float z,float x[100],int n,int i) /* 定义基函数*/ {float a=1,b=1,c=1,d=1,t;int j;for (j=0;j<i;j++){t=z-x[j];a=a*t;}for (j=i+1;j<=n;j++){t=z-x[j];b=b*t;}a=a*b;for (j=0;j<i;j++){t=x[i]-x[j];c=c*t;}for (j=i+1;j<=n;j++){t=x[i]-x[j];d=d*t;}c=c*d;return (a/c);}void input (float a[100],int n) /* 定义数组输入函数*/ {int i;for (i=0;i<n;i++)scanf ("%f",&a[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 方法实现(数值分析上机实验)
数值分析上机实验实验一一.上机题目:已知: 4 =2,9 =3,16 =4分别用二次Lagrange和Newton插值法求7 的近似值。
二.解题方法:1.lagrange方法:设x0=4,y0=2,x1=9,y1=3,x2=16,y2=4代入方程:(x1-X)(x2-X)/(x1-x0)(x2-x0)*y0+(x0-X)(x2-X)/(x0-x1)(x2-x1)*y1+(x1-X)(x0-X)/(x1-x2)(x0-x2)*y2令X=7代入方程得 Y=2.628572.Newton方法:设x0=4,y0=2,x1=9,y1=3,x2=16,y2=4建表4 29 3 0.216 4 0.14286 -0.00476f(x)=f(x0)+f[x0,x1](X-x0)+f[x0,x1,x2](X-x0)(X-x1)(X-x2)令X=7代入方程得Y=2.62857三.算法公式步骤:grange方法:通过公式写出算法并得出最后的值Y:for(b=0;b<m;b++)//完成公式f(Xn)外层嵌套循环f[b]=i//{double l=1;//保证每次跳出内层循环将L置1 不会将第一项的值带入下一项//for(a=0;a<m;a++)//完成公式f(Xn)内层嵌套循环f[a]=j//{if(a!=b)//完成定义i=1,i!=j//l=(f[a]-F)/(f[a]-f[b])*l;//完成(j-m)/(j-i)//la=l*g[b];//完成公式的F(X0)=f(X0)*Y0并累乘输出结果// }Y=la+Y;//累加x0y0+x1y1+...得最后结果//}2.Newton方法:先建表,通过二维数组的思想建表for(l=2;l<m+2;l++)//外层循环控制y阶数//{for(k=1;k<m+1;k++)//内层循环控制x个数//{a[k][l]=(a[k][l-1]-a[k-1][l-1])/(a[k][0]-a[k-l+1][0]);//完成f(x0,x1,...,xn)并存表//}}填表。
拉格朗日插值法c语言
实验报告实验课程名称数值计算方法实验项目名称 Lagrange插值公式年级专业学生姓名学号理学院实验时间:201 年月日学生实验室守则一、按教学安排准时到实验室上实验课,不得迟到、早退和旷课。
二、进入实验室必须遵守实验室的各项规章制度,保持室内安静、整洁,不准在室内打闹、喧哗、吸烟、吃食物、随地吐痰、乱扔杂物,不准做与实验内容无关的事,非实验用品一律不准带进实验室。
三、实验前必须做好预习(或按要求写好预习报告),未做预习者不准参加实验。
四、实验必须服从教师的安排和指导,认真按规程操作,未经教师允许不得擅自动用仪器设备,特别是与本实验无关的仪器设备和设施,如擅自动用或违反操作规程造成损坏,应按规定赔偿,严重者给予纪律处分。
五、实验中要节约水、电、气及其它消耗材料。
六、细心观察、如实记录实验现象和结果,不得抄袭或随意更改原始记录和数据,不得擅离操作岗位和干扰他人实验。
七、使用易燃、易爆、腐蚀性、有毒有害物品或接触带电设备进行实验,应特别注意规范操作,注意防护;若发生意外,要保持冷静,并及时向指导教师和管理人员报告,不得自行处理。
仪器设备发生故障和损坏,应立即停止实验,并主动向指导教师报告,不得自行拆卸查看和拼装。
八、实验完毕,应清理好实验仪器设备并放回原位,清扫好实验现场,经指导教师检查认可并将实验记录交指导教师检查签字后方可离去。
九、无故不参加实验者,应写出检查,提出申请并缴纳相应的实验费及材料消耗费,经批准后,方可补做。
十、自选实验,应事先预约,拟订出实验方案,经实验室主任同意后,在指导教师或实验技术人员的指导下进行。
十一、实验室内一切物品未经允许严禁带出室外,确需带出,必须经过批准并办理手续。
学生所在学院:专业:班级:韩非子名言名句大全,韩非子寓言故事,不需要的朋友可以下载后编辑删除!!1、千里之堤,毁于蚁穴。
——《韩非子·喻老》2、华而不实,虚而无用。
——《韩非子·难言》3、欲速则不达。
实验一lagrange插值
实验一:拉格朗日插值算法的实现实验目的:1.验证拉格朗日插值算法对于不同函数的插值效果;2.验证随着插值结点的增多插值曲线的变化情况。
实验内容:根据课本P18的一般情形的过程编写拉格朗日插值方法的程序,实现拉格朗日插值。
源程序如下:#include<iostream>using namespace std;int main(){double x_[10],y_[10],t,y=0,x;int i,n,j,k;cout<<"多少个插值点?"<<endl;cin>>n;for(i=0;i<n;i++) //输入已知条件,即已知点{cout<<"输入插值节点x和y--(x,y):";cin>>x_[i]>>y_[i];}cout<<"输入x:"<<endl; //确定插值的位置cin>>x;for(k=0;k<n;k++) //实现插值的关键程序{t=1;for(j=0;j<n;j++){if(j!=k)t=((x-x_[j])/(x_[k]-x_[j]))*t; //插值基函数的计算}y=y+t*y_[k]; //求插值的结果}cout<<"近似的y值是: "<<y<<endl; //输出插值结果return 0;}实验结果:1)对y=x进行插值,已知(1,1)(2,2,)(3,3,),求当x=5时的插值结果2)对y=x^2进行插值3)(验证随着插值结点的增多插值曲线的变化情况)对y等于根号x插值用计算器计算根号8的值:可以知道:随着插值点的增多,插值结果越精确。
四,拉格朗日算法
yy=lagrange(x,y,xx,n);
printf("x=%f,y=%f\n",xx,yy);
getch();
}
运行结果得:
即用拉格朗日算得在x=0.732的值为0.705979。
四,拉格朗日(Lagrange)算法
题目Байду номын сангаас已知函数在下列各点的值为:
0.2
0.4
0.6
0.8
1.0
f( )
0.98
0.92
0.81
0.64
0.38
试用4次拉格朗日插值多项式计算在x=0.732处的值。
工具:C++
解:程序如下:
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
{ 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;
}
main()
{ int i,n;
float x[20],y[20],xx,yy;
printf("Input n:");
for(i=0;i<=n-1;i++)
{ printf("x[%d]:",i);
scanf("%f",&x[i]);
}
printf("\n");
一次Lagrange 插值算法及程序
Lagrange 插值一、实验目的及要求实验目的:体会使用Lagrange 插值基函数构造插值多项式的特点,熟悉使用一次或二次Lagrange 插值多项式近似函数y=f(x)的算法。
掌握Lagrange 插值多项式近似函数f(x)的误差表达式,并会熟练应用。
实验要求:1. 给出一次、二次Lagrange 插值算法2. 用C 语言实现算法3. 给出误差分析。
二、实验准备:1.一次、二次Lagrange 插值算法:一次插值算法:插值节点用一维数组x[2],y[2]存放,基函数用一维数组l[2]存放,输入x,计算y=f(x);2. C 语言源程序:一次插值:#include"stdio.h"#include"math.h"#define N 5int main(void){int n,k,i,j;float x[N+1],y[N+1],u,v;printf("input n: ");scanf("%d",&n);printf("\nplease input the nodes:\n");for(i=0;i<=n;i++){scanf("%f %f",&x[i],&y[i]);}for(i=0;i<=n;i++){printf("x[%d]=%f y[%d]=%f\n",i,x[i],i,y[i]);111.,;,,k k k k step x x y y x ++输入数据所求的插值点12.:,k k step l l +计算基函数111113.()()k k k k k k k k x x x x step y f x L x y y x x x x ++++--=≈=⨯+⨯--计算}printf("input thr interplolation's node: ");scanf("%f",&u);printf("u=%f",u);for(i=0;i<=n;i++){if(u!=x[i]){if(u<x[0]){k=0;}else if(u>x[n]);{k=n-1;}else if((i<n)&&(u>x[i]&&u<x[i+1])){k=i;}}v=y[k]*(u-x[k+1])/(x[k]-x[k+1])+y[k+1]*(u-x[k])/(x[k+1]-x[k]);printf("\nv=%f\n",v);return 0;}三、实验结果分析与评价:此次实验结果的不同主要是由于运用的插值次数不同,通过实验结果,我们可以看出,(1)结果分析:本函数的原始函数为f(x)=sinx,对于题目所求函数自变量11.5,12.5,当自变量X取11.5时,f(11.5)=0.1993679;当自变量X取12.5时,f(12.5)=0.2164396.运用一次插值是所得结果分别为0.199360,0.216431,而运用二次插值时,所得结果为0.199369、0.216440。
拉格朗日插值--C语言实现
1.源程序
#include "stdlib.h"
#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "graphics.h"
#include "math.h"
typedef struct
{
float x;
float y;
{
int i;
int Max_y;
Max_y = 0.0;
for(i=0;i<n;++i)
if(Max_y<fabs(Table[i].y))
Max_y=fabs(Table[i].y);
return(Max_y);
}
void DrawCoordinate(int X1,int Y1,int X2,int Y2,float x1,float y1,float x2,float y2)
{
char String[20];
setcolor(color);
gcvt(RealNumber,Length,String);
outtextxy(x,y,String);
}
void ShowTable(POINT Table[],int n)
{
int i;
char String_x[20],String_y[20];
line1(0,20,639,20,7);
line(30,0,30,40);
outtextxy1(10,8,"x",14);
outtextxy1(10,28,"y",14);
拉格朗日插值法C语言
机械CAD/CAM技术读书报告姓名:***学号:*********班级:机械1401专业:机械设计制造及其自动化学院:机械工程学院指导老师:***日期:2017年6月3日摘要插值法是函数逼近的一种重要方法,.数学上来说,拉格朗日插值法可以给出一个恰好穿过二维平面上若干个已知点的多项式函数.Lagrange插值是n次多项式插值,其成功地用构造插值基函数的方法,解决了求n次多项式插值函数问题.Lagrange插值的基本思想是将待求的n次多项式插值函数改写成另一种表示方式,再利用插值条件确定其中的待定函数,从而求出插值多项式.拉格朗日插值法是一种很实用的插值方法,可以应用在渔业资源评估中、化学中、工程中、工业中、机械设计与制造领域,以及计算机方面.通过C语言的编写,将拉格朗日算法在计算机中实现,求得相应的解.进一步体现拉格朗日插值法在解决问题时的实际意义关键词插值基函数插值多项式 Lagrange插值;算法一、读书报告的目的进一步熟悉拉格朗日插值法。
掌握编程语言字符处理程序的设计和调试技术。
二、拉格朗日插值多项式:三、.程序流程(1)输入已知点的个数;(2)分别输入每个点的X、Y的值(3)通过程序自动显示插值点的拉格朗日函数(4)输入具体所要插入点的值(5)求得所需插值点的函数值拉格朗日插值流程图四、程序设计思路为了实现拉格朗日插值函数的运算和函数方程的显示,我设立了一个main主函数和getpoints和insert两个辅助函数。
在main主函数中我首先建立了两个数组X[]和Y[],分别用来记录所输入的点的X和Y坐标值,通过getpoints函数来从窗口读入参数并传递给main函数。
接下来为了显示拉格朗日函数我设立了两个for循环,第一个for循环是为了显示拉格朗日函数多项式的其中某一项,也就是通过连乘的方式实现,第二个for循环是把上一个循环得出的每一个多项式进行连加。
其中的if语句是由于拉格朗日插值函数中i≠j 所规定的。