拉格朗日插值法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;}。
拉格朗日和牛顿插值法的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、欲速则不达。
拉格朗日插值法C语言的实现
实验 一 .拉格朗日插值法C 语言的实现1.实验目的:进一步熟悉拉格朗日插值法。
掌握编程语言字符处理程序的设计和调试技术。
2.实验要求:已知:某些点的坐标以及点数。
输入:条件点数以及这些点的坐标 。
输出:根据给定的点求出其对应的拉格朗日插值多项式的值 。
3.程序流程:(1)输入已知点的个数;(2)分别输入已知点的X 坐标;(3)分别输入已知点的Y 坐标;(4)通过调用函数lagrange 函数,来求某点所对应的函数值。
拉格朗日插值多项式如下:0L ()()0,1,nn 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 <conio.h>#include <malloc.h>float lagrange(float *x,float *y,float xx,int n) /*拉格朗日插值算法*/ {int i,j;float *a,yy=0.0; /*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(1.5)的值。
lagrange插值函数 C语言算法
//mathanaly.c//一元n次Lagrange插值,无需手动数值#include"stdio.h"#include"stdlib.h"double newton(const unsigned int N,const double x[],const double y[],const double t) //插值函数{unsigned int i,j;double sum=0.0,muly=1.0;for(i=0;i<=N-1;i++) //连加循环{for(j=0;j<=N-1;j++){if(j!=i)muly=muly*(t-*(x+j))/(*(x+i)-*(x+j));continue;}sum+=muly*(*(y+i));muly=1.0;}return sum;}int main(){char j; //"char j"用于显示结果,若visual无显示问题,可以删去unsigned int NUM=6;double *a=NULL,*b=NULL,t=0.668,clu;a=(double *)malloc(NUM*sizeof(double));*(a+0)=0.4;*(a+1)=0.5;*(a+2)=0.6;*(a+3)=0.7;*(a+4)=0.8;*(a+5)=0.9;b=(double *)malloc(NUM*sizeof(double));*(b+0)=0.38942;*(b+1)=0.47943;*(b+2)=0.56464;*(b+3)=0.64422;*(b+4)=0.71736;* (b+5)=0.23781;clu=newton(NUM,a,b,t); //调用函数计算结果printf("the conclusion is %lf\n",clu);getchar(); //用来显示结果,若visual无显示问题,可以删去 j=getchar();return 0;}//mathanaly.c//一元n次Lagrange插值,手动输入#include"stdio.h"#include"stdlib.h"double newton(const unsigned int N,const double x[],const double y[],const double t) //插值函数{unsigned int i,j;double sum=0.0,muly=1.0;for(i=0;i<=N-1;i++) //连加循环{for(j=0;j<=N-1;j++){if(j!=i)muly=muly*(t-*(x+j))/(*(x+i)-*(x+j));continue;}sum+=muly*(*(y+i));muly=1.0;}return sum;}int main(){int i; char j; //"char j"用于显示结果,若visual无显示问题,可以删去unsigned int NUM;double *a=NULL,*b=NULL,t,clu;printf("How many nodes is the function?\n");//输入节点个数scanf("%d",&NUM);a=(double *)malloc(NUM*sizeof(double));for(i=0;i<NUM;i++){printf("enter No.%d value of x ",i); //输入节点自变量值scanf("%lf",(a+i));}b=(double *)malloc(NUM*sizeof(double));for(i=0;i<NUM;i++){printf("enter No.%d value of y ",i); //节点函数值scanf("%lf",(b+i));}printf("what's the value of t?\n"); //任给自变量tscanf("%lf",&t);clu=newton(NUM,a,b,t); //调用函数计算结果printf("the conclusion is %lf\n",clu);getchar(); //用来显示结果,若visual无显示问题,可以删去 j=getchar();return 0;}//mathanaly.c//一元n次Lagrange插值,用数组实现#include"stdio.h"#define NUM 6 //NUM=N,是数组长度(常量),结点个数,插值多项式的次数是N-1//不能用const int NUM=6;double newton(const unsigned int N,const double x[],const double y[],const double t) //插值函数{unsigned int i,j;double sum=0.0,muly=1.0;for(i=0;i<=N-1;i++) //连加循环{for(j=0;j<=N-1;j++){if(j!=i)muly=muly*(t-x[j])/(x[i]-x[j]);continue;}sum+=muly*y[i];muly=1.0;}return sum;}int main(){int i; char j; //"char j"用于显示结果,若visual版本无显示问题,可以删去unsigned int n;double a[NUM],b[NUM],t,clu;printf("How many nodes is the function?\n");//输入节点个数scanf("%d",&n);for(i=0;i<NUM;i++){printf("enter No.%d value of x ",i); //输入节点自变量值scanf("%lf",&a[i]);}for(i=0;i<NUM;i++){printf("enter No.%d value of y ",i); //节点函数值scanf("%lf",&b[i]);}printf("what's the value of t?\n"); //任给自变量tscanf("%lf",&t);clu=newton(n,a,b,t); //调用函数计算结果printf("the conclusion is %lf\n",clu);getchar(); //用来显示结果,若visual版本无显示问题,可以删去j=getchar();return 0;}。
拉格朗日插值和牛顿插值多项式的C程序算法毕业论文
本科生毕业论文题目: 拉格朗日插值和牛顿插值多项式的C程序算法原创性声明本人郑重声明: 所提交的学位论文是本人在导师指导下, 独立进行研究取得的成果. 除文中已经注明引用的内容外, 论文中不含其他人已经发表或撰写过的研究成果, 也不包含为获得**大学或其他教育机构的学位证书而使用过的材料. 对本文的研究做出重要贡献的个人和集体, 均已在文中以明确方式标明. 本人承担本声明的相应责任.学位论文作者签名: 日期指导教师签名: 日期目录拉格朗日插值多项式的C程序算法 (1)1引言 (1)1.1插值问题的提出 (1)1.2插值法 (2)1.3插值法思想 (2)2拉格朗日插值法 (3)2.1拉格朗日插值法的由来 (3)2.2n次插值基函数 (4)2.3拉格朗日插值多项式 (4)3牛顿插值法 (5)3.1均差: (5)3.2牛顿插值多项式: (6)4C程序设计 (7)4.1算法设计: (7)4.2程序源码编写 (8)5程序检测 (12)5.1对拉格朗日插值的检测 (12)5.2对牛顿插值的检测 (13)总结 (15)参考文献 (16)致谢 (17)摘要本论文着重研究了用C语言编写程序计算拉格朗日插值和牛顿插值的方法。
在前人已有的研究成果的基础上,首先介绍了拉格朗日插值和牛顿插值的思想和方法,通过添加可以循环计算功能和输入非法数值时的纠错功能,改进了已有文献的方法,对其进行了推广,使之更加的合理和完美,并且通过实际的例子进行了具体的验证。
最后,总结了一下本论文的主要研究成果和应用前景。
关键词:拉格朗日插值,牛顿插值,C算法,精确解AbstractThis article discuss the method to calculate Lagrange interpolation and Newton interpolation with C program. Base on the results of predecessors' research, firstly, this article introduces the thoughts and methods of Lagrange interpolation and Newton interpolation. Improving the old method by adding functions which can repeatedly computing interpolation and correct illegal data. Then spreading it and making it more reasonable and perfect, checking it with some examples. Finally, summing up the main results of this article and application prospect.Key words:Lagrange interpolation; Newton interpolation ; C program;拉格朗日插值多项式的C 程序算法1引言插值法是一种古老的数学研究方法,他的产生来自与社会的生产实践活动。
拉格朗日插值--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);
拉格朗日插值法课程设计
摘要插值法是函数逼近的一种重要方法,是数值计算的基本课题.数学上来说,拉格朗日插值法可以给出一个恰好穿过二维平面上若干个已知点的多项式函数.Lagrange 插值是n次多项式插值,其成功地用构造插值基函数的方法,解决了求n次多项式插值函数问题.Lagrange插值的基本思想是将待求的n次多项式插值函数改写成另一种表示方式,再利用插值条件确定其中的待定函数,从而求出插值多项式.拉格朗日插值法是一种很实用的插值方法,可以应用在渔业资源评估中、化学中、工程中、工业中、机械设计与制造领域,以及计算机方面.本课题意在将拉格朗日插值法应用到实际中,主要通过程序的编写(有拉格朗日插值法的Matlab和C语言实现)将算法在计算机中实现,求得相应的解.进一步体现拉格朗日插值法在解决问题时的实际意义.关键词插值基函数;插值多项式;Lagrange插值;算法AbstractInterpolation function approximation is a kind of important method, numerical calculation is the basic subject.Mathematical speaking,Lagrange interpolation method can give a right through the two dimensional plane several known point polynomial grange interpolation is n times polynomial interpolation,which succeeded in structure interpolation basis function method,solve the on times polynomial interpolation function problem. Lagrange interpolation basic idea is to will stay for n times polynomial interpolation function rewritten into another means,reuse interpolation condition to determine the required function,so as to find out the interpolation polynomial.Lagrange interpolation method is a very practical interpolation method, can be used in fishery resources evaluation,chemistry,engineering, industry, mechanical design and manufacturing,and computers to.This topic will be Lagrange interpolation method was used to practice,mainly through the process of writing(with Lagrange interpolation method of Matlab and C language implementation)algorithm is realized in computer,get the corresponding solution.Further reflected Lagrange interpolation method in solving problems of practical significance.Keywords interpolation basis function;Interpolation polynomial;Lagrange interpolation;algorithm目录引言 (1)第一章拉格朗日插值法 (2)§1.1 基本概念 (2)§1.2 拉格朗日插值法 (2)§1.2.1 基函数 (2)§1.2.2拉格朗日插值公式 (3)§1.2.3 余项与误差估计 (4)第二章拉格朗日插值法的程序设计及应用 (8)§2.1拉格朗日插值法的Matlab实现 (8)§2.2拉格朗日插值法的C语言实现 (9)§2.2.1 流程图 (9)§2.2.2 C语言编程 (10)§2.3 拉格朗日插值法的应用 (11)§2.3.1 在渔业资源评估上的应用 (11)§2.3.2 利用拉格朗日插值法解决传热过程中的导热系数 (12)参考文献 (14)附录A (15)附录B (16)引言在数值分析中,拉格朗日插值法是以法国十八世纪数学家约瑟夫·路易斯·拉格朗日命名的一种多项式插值方法.约瑟夫·拉格朗日(Joseph Louis Lagrange),法国数学家、物理学家.他在数学、力学和天文学三个学科领域中都有历史性的贡献,其中尤以数学方面的成就最为突出.拉格朗日对流体运动的理论也有重要贡献,提出了描述流体运动的拉格朗日方法.1795年,拉格朗日在其著作《师范学校数学基础教程》中发表了这个插值方法,从此他的名字就和这个方法联系在一起.数据建模有两大方法:一类是插值方法,另一类是拟合函数,一般的说,插值法比较适合数据准确或数据量小的情形.然而Lagrange 插值有很多种,1阶,2阶,…n 阶.我们可以利用拉格朗日插值求方程,根据它的程序求原方程的图像.拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值.实际问题中所遇到的许多函数很难找到它的解析表达式.有时通过实验或数值计算所得到的也只是一些离散的(一般是互不相同)点i x (i=0,1,...,n )上的函数值,在实际应用中,一般将这些数据列成数据表格的形式.通常,将这种用数据表格形式给出的函数称为列表函数,其中点n x x x ,...,,10称为结点.根据函数)(x f 已有的数据表格来计算函数)(x f 在一些新的点x 处的函数值,这就是插值法所要解决掉问题.插值法的基本思想是,首先设法根据表格中已有的函数值值来构造一个简单的函数)(x y 作为)(x f 的近似表达式,然后再用)(x y 来计算新的点上的函数值作为)(x f 的近似值.通常可以选多项式函数作为近似函数)(x y ,因为多项式具有各阶导数,求值也比较方便.本课题研究的是拉格朗日插值法的程序设计,计算机实现,以及拉格朗日插值法的应用.第一章 拉格朗日插值法§1.1 基本概念下面介绍有关拉格朗日插值法的相关概念. 定义1.1 设函数)(x f y =在区间],[b a 上有定义,且已知在点b x x x a n ≤<<<≤...10上的值n y y y ,...,,10,若存在一简单函数,使n i y x P i i ,...,1,0,)(== (1.1)成立,就称)(x P 为)(x f 的插值函数,点n x x x ,...,,10称为插值节点,包含插值节点的区间],[b a 称为插值区间,求插值函数)(x P 的方法称为插值法. 若)(x P 是次数不超过n 的代数多项式,即,...)(10n n x a x a a x P +++=其中i a 为实数,就称)(x P 为插值多项式,相a a a x P ++=21)(应的插值法称为多项式插值.定义1.2 设给定数据点),(i i y x ,n i ,...,1,0=(互异),欲找二者的近似关系)(x P ,满足(1)),()(x P x P n ∈ (2)n i y x P i i ,...,1,0,)(==则称)(x P 为n 次代数插值多项式. 定理1.1 满足条件(1.1)的插值多项式)(x P 是存在唯一的.直接求解方程组就可以得到插值多项式)(x P ,但这是求插值多项式最繁杂的方法,一般是不用的,下面将给出构造插值多项式更简单的方法.§1.2 拉格朗日插值法§1.2.1 基函数为了构造插值多项式,我们先定义插值基函数.定义 1.3 设n x x x ,...,,10是给定的彼此互异的1+n 个插值结点, n i x f y i i ,...,1,0),(==为给出的函数值,则)(...)()()(1100x l y x l y x l y x P n n n +++=是唯一的次数不超过n 的,满足n i y x P i i n ,...,2,1,0,)(==的多项式.其中为拉格朗日插值基函数,)(x P n 为拉格朗日插值函数. 下面介绍基函数)(x l i 的性质.性质1.1 ⎩⎨⎧≠==,,0,,1)(j i j i x l j i性质1.2 n i x P x l n i ,...,1,0),()(=∈性质1.3 1)(0≡∑=x l ni i§1.2.2 拉格朗日插值公式定理1.2 n 次代数插值问题的解为)()()(0x L x l y x P n i ni i ==∑=称为拉格朗日插值多项式. 特殊化,得到如下插值公式. (1)线性插值)(1x L设已知0x ,1x 及0y =f(0x ) ,1y =f(1x ),)(1x L 为不超过一次多项式,且满足 )(01x L =0y ,)(11x L =1y , 几何上,)(1x L 为过(0x ,0y ),(1x ,1y )的直线,从而得到 . )()(0010101x x x x y y y x L ---+= (1.2) 为了推广到高阶问题,我们将式(1.2)变成对称式 )(1x L =0l (x )0y +1l (x)1y . 其中,0l (x )=101x x x x --,1l (x)=010x x x x --.均为1次多项式且满足 0l (x )=1且1l (x)=0.或0l (x )=0且1l (x)=1.两关系式可统一写成. ⎩⎨⎧≠==,,0,,1)(j i j i x l j i (1.3)(2)抛物线插值)(2x L假定插值结点为11,,+-i i i x x x ,要求抛物线插值(即二次插值)多项式)(2x L ,使它满足.1,,1,)(2+-==i i i j y x L i j我们知道在几何上就是通过三点),(11--i i y x ,),(i i y x ,),(11++i i y x 的抛物线.为了求出)(2x L 的表达式,可采用基函数法,此时基函数)(),(1x l x l i i -及)(1x l i +是二次函数,且在节点上分别满足条件⎪⎭⎪⎬⎫-===+-===+===+++---.,1,0)(,1)(;1,1,0)(,1)(;1,,0)(,1)(111111i i j x l x l i i j x l x l i i j x l x l j i i i j i i i j i i i (1.4)满足条件(1.4)的插值基函数是很容易求出的,例如求)(1x l i -,因它有两个零点i x 及1+i x ,故可表示为))(()(11+---=i i i x x x x A x l ,其中A 为待定系数,可由条件1)(11=--i i x l 定出))((1111+----=i i i i x x x x A ,于是))(())(()(11111+--+-----=i i i i i i i x x x x x x x x x l .同理可得))(())(()(1111+-+-----=i i i i i i i x x x x x x x x x l ,))(())(()(11111i i i i i i i x x x x x x x x x l ----=+-+-+.利用二次插值基函数)(),(1x l x l i i -,)(1x l i +,立即得到二次插值多项式)()()()(11112x l y x l y x l y x L i i i i i i ++--++=, (1.5)显然,它满足条件)1,,1()(2+-==i i i j y x L j j .将上面求得的)(),(1x l x l i i -,)(1x l i +代入(1.5)式,得))(())(())(())(())(())(()(111111111111112i i i i i i i i i i i i i i i i i i i i i x x x x x x x x y x x x x x x x x y x x x x x x x x y x L ----+----+----=+-+-++-+-+--+-.§1.2.3余项与误差估计拉格朗日插值用来求n 个节点的(n-1)次插值多项式,它就是线性插值和抛物线插值的推广和延伸.我们设有n 个节点,则拉格朗日插值的表达式表示为:1211111,1211()()()()()()()()()()()()n nn j k k n k kk k j j k k k k k k k k n k jx x x x x x x x x x x x g x y y x x x x x x x x x x x x -+===≠-+---⋅⋅⋅--⋅⋅⋅-==--⋅⋅⋅--⋅⋅⋅--∑∑∏ 若在],[b a 上用)(x L n 近似)(x f ,则其截断误差为)()()(x L x f x R n n -=,也称为插值多项式的余项.关于插值余项估计有以下定理.下面的定理说明了用插值多项式)(x L n 近似代替函数)(x f 时的余项.定理1.3 (余项定理) 设)()(x f n 在],[b a 上连续,)()1(x f n +在),(b a 内存在,节点b a x x x n ≤<<<≤...10,)(x L n 是满足条件.,...,1,0,)(n j y x L j j n ==的插值多项式,则对任何],[b a x ∈,插值余项)()!1()()()()(1)1(x n f x L x f x R n n n n +++=-=ωξ, (1.6)这里),(b a ∈ξ且依赖于x ,))...()(()(101n n x x x x x x x ---=+ω.这里需要说明如下两点.(1)在插值多项式的余项公式中,包含有)()1(ξ+n f ,其中,ξ一般与插值结点),...,1,0(n j x j =以及插值点x 有关,因此,ξ一般是无法知道的,这就对余项的估计带来了困难.(2)由插值多项式的余项公式可以看出,当被插值的函数)(x f 为次数不高于n 的多项式时,其n 次插值多项式就是它本身,因为此时0)()1(=+ξn f ,即余项为0. 应当指出,余项表达式只有在)(x f 的高阶导数存在时才能应用.ξ在),(b a 内的具体位置通常不可能给出,如果我们可以求出1)1()(max ++≤≤=n n bx a M x f ,那么插值多项式)(x L n 逼近)(x f 的截断误差限是)()!1()(11x n M x R n n n +++≤ω. 当1=n 时,线性插值余项为];,[),)()((21)()(21)(1010''2''1x x x x x x f x f x R ∈--==ξξωξ当2=n 时,抛物线插值的余项为].,[),)()()((61)(20210'''2x x x x x x x x f x R ∈---=ξξ利用余项表达式(1.6),当)()(n k x x f k ≤=时,由于)0()1(=+x f n ,于是有,0)()(0=-=∑=x l x x x R i ni k i kn由此得.,...,1,0,)(0n k xx l x ki ni k i ==∑= (1.7)特别当0=k 时,有.1)(0=∑=x l ni i (1.8)(1.7)式和(1.8)式也是插值基函数的性质,利用它们还可求一些和式的值.例1 已知函数表sin 6π=0.5000,sin 4π=0.7071,sin 3π=0.8660,分别由线性插值与抛物插值求sin92π的数值解,并由余项公式估计计算结果的精度. 解(1)这里有三个节点,线性插值需要两个节点,根据余项公式,我们选取前两个节点,易知:sin 92π≈1L (92π)=0.5000+645000.07071.0ππ--(92π-6π)=0.5000+0.207132⨯=0.6381截断误差, )92(1πR =)492)(692(2)(sinx ππππ--''310615.7361821-⨯=⨯⨯≤ππ, 得.105.010615.713--⨯<⨯=ζ知结果至少有1位有效数字. (2)易知sin 92π+⨯=≈5000.0)3-6)(4-6()33-92)(4-92()92(2πππππππππL ⨯----))(())((3464392692ππππππππ0.7071+ 8660.04363492692⨯----))(())((ππππππππ=7071.0985000.092⨯+⨯⨯-910.8660=0.6434 . 截断误差为:≤---'''==ξπππππππx x R )492)(492)(692(6)(sin )92(2210861..09361861-⨯=⨯⨯⨯πππ 得.105.010861.824--⨯<⨯=ζ知结果至少有两位数字. 比较本题精确解sin=92π0.642787609...,实际误差限分别为0.0047和0.00062.第二章拉格朗日插值法的程序设计及应用§2.1拉格朗日插值法的Matlab实现在Matlab中,利用Lagrange插值方法进行多项式插值,并将图形显式出来.实现Lagrange插值的步骤如下:Step1 定义函数f = 1./(25*x^2+1)将其保存在f.m 文件中,具体程序如下: function y = f1(x)y = 1./(25x.^2+1);Step2 定义拉格朗日插值函数,将其保存在lagrange.m 文件中,具体实现程序编程见附录A.Step3 建立测试程序,保存在text.M文件中,实现画图:x=-1:0.001:1;y=(1+25.*x.^2).^-1;p=polyfit(x,y,n);py=vpa(poly2sym(p),10);plot_x=-1:0.001:1;f1=polyval(p,plot_x);figureplot(x,y,'r',plot_x,f1)输入n=6时,出现如下面的图2.1所示.图2.1 Largange插值图像通过图2.1可以看出当n=6时,被插图像与插值图像没有很好的模拟,于是重新运行text.M,并选择n=15,运行,显示如图2.2所示.图2.2 Largange插值图像综合图2.1和图2.2的Lagrange插值图像可以看出,n=15时的被插图像与插值图像实现了很好的模拟.结果分析:由图2.1和图2.2可以看出n的次数越高,越能实现较好的模拟,从而模拟的效果越好,从图2.2就可以看出两条曲线接近重合,而图一两条直线却分开很多,误差较大,精度也不高.因此在实际的应用中应该尽量在给定的条件下增加n的次数,才能实现与原函数较好的重合,才能使计算的结果更加的准确,从而减小了误差.§2.2 拉格朗日插值法的C语言实现在Visual C++中,用C语言实现拉格朗日插值.§2.2.1 流程图要用C语言实现拉格朗日插值,先画出流程图.程序流程图:↓图2.3 流程图§2.2.2 C语言编程用C语言编程的步骤如下:Step1定义拉格朗日插值算法;Step2 int n;{如果n>=20或n<=0,则输出"Error!The value of n must in (0,20)."}for i:=0 to n-1{输入x和y的值}Step3输出根据给定的点求出其对应的拉格朗日插值多项式的值 .举例如下:已知当x=1,-1,2时f(x)=0,-3,4,求f(1.5)的值.源程序见附录B.运行结果如下:图2.4 截屏§2.3 拉格朗日插值法的应用拉格朗日插值法可以应用在各个方面.§2.3.1 在渔业资源评估上的应用:应用拉格朗日插值法拟合鱼类体长与体重之间的关系,使用计算机VB 语言进行编写程序,与常用的线性回归法、Ricker 法进行比较,得出体长与体重的关系式为k nk n kj j jk j k n k k n y x x x x x l y x P ∑∏∑=≠==--==000)()()(在资源评估过程中,当测量次数确定为n j ,...,1,0=时,将测量到同一种不同大小的鱼类样品对应的体长与体重数据),(j j y x ,其中j x 表示第j 条鱼的体长,j y 表示第j 条鱼的体重,即求作n 次多项式)(x P n ,使满足条件,,...,1,0,)(n j Y X P j j n == (2.1) 点j X (它们互不相同,若在测量中有相同的体长值归为一组数值)称为插值节点.用几何的语言来表达这类插值,就是通过体长与体重关系曲线)(x f y =上给定的1+n 个点n j y x j j ,..,1,0),,(=,求作一条n 次代数曲线)(x P y n =作为)(x f y =的近似.解决这个问题时先从构造插值基函数入手,这里的插值基函数),...,1,0)((n k x l k =是n 次多项式,且满足条件,,1,0)( ⎝⎛=≠==k j kj x l kj j k δ (2.2) 这表明除k x 以外的所有节点都是)(x l k 的零点,故∏≠=-=nk j j j k x x c x l 0)()(, (2.3)按(2.2)式中的第2个条件1)(=k k x l 确定其中的系数c ,结果有 .)(0∏≠=--=nk j j jk j k x x x x x l (2.4)利用插值基函数容易得出方程(2.1)的解 y nk nkj j jk j nk k k n y x x x x x l y x P ∑∑=≠==--==000)()()((2.5)通过这个方程,我们可以从同一种鱼类对应体长求得相应较为精确的近似体重.§2.3.2 利用拉格朗日插值法解决传热过程中的导热系数化学工程手册中通常给出的导热系数是离散数据,而此数据误差较大1为了减小导热系数的误差,我们可采用拉格朗日插值法求得准确度较高的导热系数. 以苯为例,求160℃下的λ值.根据表2-1中所给出的值,可确定为共有5个节点,能构造4次插值函数)(4t ϕ. 首先构造:)(0t L ))()()(()(43210t t t t t t t t A t L ----=, 而1)(00=t L ,故=)(0t L ))()()(())()()((403020104321t t t t t t t t t t t t t t t t --------,则,.0476.0)160(0=L同理可构造),(),(),(),(4321t L t L t L t L 求得;2105.0)160(1-=L ;4481.0)160(2=L =)160(3L 0.9592;.2380.0)160(4-=L这样,4次插值函数)(4t ϕ为=)160(4ϕ=∑=)160(4i iL λ)160()160()160()160()160(443322110L L L L L λλλλλ++++=0.0235.也就是说用拉格朗日插值法求得苯在160C 下的导热系数为0.0235)/(C m w ⋅. 拉格朗日插值法还可以应用在基于拉格朗日插值法修正地形影响的分布式降水模型研究中,基于质心拉格朗日插值的GPS 轨道标准化方法,基于高维拉格朗日插值法的三坐标测量机测量误差建模,基于拉格朗日插值的射线图像增强技术,基于拉格朗日插值的参数曲线隐式化等方面.参考文献[1]Jhon H. Mathews Kurtis D.Fink .数值方法(MATLAB版).电子工业出版社.2002年[2]关治.数值计算方法.清华大学大学出版社.2005年[3]徐士良.数值方法与计算机实现[M].清华大学出版社.2010年[4]李庆扬.数值分析[M].北京:清华大学出版社.2008年附录A Matlab编程funtion y=lagrange(x0,y0,x)m= length(x);n=length(x0)for i=1:nl(i)=1endfor i=1:mfor j=1:nfor k=1:nif j==kcontinueendl(j)=(x(i)-x0(k))/(x0(j)-x0(k))*l(j);endendendy=0for i=1:ny = y0(i)*l(i)+yEnd附录B C语言编程#include <iostream>#include <conio.h>#include <malloc.h>float lagrange(float *x,float *y,float xx,int n) /*拉格朗日插值算法*/ {int i,j;float *a,yy=0.0; /*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();}。
- 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的值。
运行结果如下:。