《Lagrange插值法的编程实现》由会员分享,可在线阅读,更多相关《Lagrange插值法的编程实现(5页珍藏版)》请在金锄头文库上搜索。
1、Lagrange 插值法的编程实现Lagrange 插值法。在实际工程问题中,往往需要由已知的少数几个数据点去求一个不知道函数解析式的函数在其它一些点上的值。这就要求对离散的数据建立一个连续的数学模型,构造插值函数去近似代替一个复杂的或未知解析表达式的函数。Lagrange 插值属于代数插值,实际中高次插值用得不多,常用的是低次插值和分段低次插值,最基本的是两点线性插值和三点抛物线插值。两点线性插值的表达式为:y=y0*(x-x1)/(x0-x1)+y1*(x-x0)/(x1-x0);三点抛物线插值的表达式为:y=y0*(x-x1)*(x-x2)/(x0-x1)*(x0-x2)+y1*(x-x
2、0)*(x-x2)/(x1-x0)*(x1-x2)+y2*(x-x0)*(x-x1)/(x2-x0)*(x2-x1);n 点高次插值的表达式为:y=y0*(x-x1)*(x- x2)* *(x -xn)/(x0-x1)*(x0- x2)* *(x0 -xn)+y1*(x-x0)*(x-x2)* *(x -xn)/(x1-x0)*(x1- x2)* *(x1 -xn)+ +yn*(x-x0)*(x-x1)* *(x -xn-1)/(xn-x0)*(xn- x1)* *(xn -xn-1) 。Lagrange 插值法的 matlab 程序如下:function y0,N,m=Lagrange_ev
3、al(X,Y,x0) m=length(X); N=zeros(m,1); y0=0; for i=1:m N(i)=1; for j=1:m if j=i N(i)=N(i)*(x0-X(j)/(X(i)-X(j); end end y0=y0+Y(i)*N(i); end 程序很简洁, 短短几行代码就把这个算法表示出来,运行时输入初始参数也很简单。 matlab 对于不定长数组的处理,以及对返回参数的灵活处理让我感到很震撼。另外,matlab 的数组下标是以 1 开始的,这可能会带来一些不方便。相应的 C 语言代码如下:#include #include #include float la
4、grange(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=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(
5、i=0;i=n-1;i+) printf(“x%d:“,i); scanf(“%f“, /* 依次输入 x数组*/ printf(“n“); for(i=0;i=n-1;i+) printf(“y%d:“,i); scanf(“%f“, /* 依次输入 y数组*/ printf(“n“); printf(“Input xx:“); scanf(“%f“, /* 输入初始值 xx*/ yy=lagrange(x,y,xx,n); printf(“x=%f,y=%fn“,xx,yy); getch(); C 语言中被调用函数使用不定长数组,必须以指针作为形参, 而实参采用数组,数组长度应作为一个参数传递。用代码显式给定义的临时数组开辟存储空间 ,在函数的最后还要把临时数组占用的内存单元释放掉。函数返回值需在被调用函数代码中使用return 语句,且只可以有一个返回值。明显看出, matlab 在算法设计方面的巨大优势,这还只是matlab强大功能的一个很小的方面。这个软件能这么流行,应用这么广泛,绝不是偶然的 。我只是初窥门径 ,要学的还很多 ,有机会把它学精通,会很有用的了。