拉格朗日插值法C语言的实现(实验报告)
拉格朗日实验报告
09信息郭凯 39号拉格朗日插值实验报告#include<stdio.h>int main(){int i,n,j;float a[50],b[50],x,l,y;printf("enter n:");scanf("%d",&n);for(i=0;i<=n;i++){printf("x[%d] y[%d]:",i,i);scanf("%f%f",&a[i],&b[i]);}printf("enter x:");scanf("%f",&x);y=0;for(i=0;i<=n;i++){l=1;for(j=0;j<=n;j++){if(j!=i)l=l*(x-a[j])/(a[i]-a[j]);}y=y+l*b[i];}printf("y=%f\n",y);return 0;}例:给出函数f(x)=sinx的3组对应的函数值如下表:利用线性插值及抛物插值计算sin0.3367的值并估计截断误差。
解:(1.1)利用以上程序,由于是利用线性插值,则首先输入n的值为1,由于0.3367介于0.32与0.34之间,故依次输入2对x与相对应的f(x)的值,再输入x的值即0.3367,即可得如下测试结果:即计算所得的sin0.3367的值为0.330365误差分析:余项R1(x)=f(x)-L1(x)=f(2)(q)(x-x0)(x-x1) /2!|R2(x)|≦M2|(0.3367-0.32)(0.3367-0.34) |/2,其中 M2=max0.32≦x≦0.34| f(2)(x)|=sin0.34<0.3335于是|R2(0.3367)|=|sin0.3367- L1(0.3367)|≦0.3335*0.0167*0.033/2<0.92*10-5(1.2)由于题目中给出了3个x的值,故可选用比0.3367大的两个x的值来计算,测试结果如下:误差分析同上类似,计算得|R2(0.3367)|<0.1266*10-4(2)利用以上程序,由于是利用抛物插值,则首先输入n的值为2,然后依次输入3对x 与相对应的f(x)的值,再输入x的值即0.3367,即可得如下测试结果:即计算所得的sin0.3367的值为0.330374误差分析:余项R2(x)=f(x)-L2(x)=f(3)(q)(x-x0)(x-x1)(x-x2)/3!| R2(x)|≦M3|(0.3367-0.32)(0.3367-0.34)(0.3367-0.36)|/6,其中M3=max0.32≦x≦0.36| f(3)(x)|=cos0.32<0.9493,于是| R2(0.3367)|=|sin0.3367- L2(0.3367)|≦0.9493*0.0167*0.033*0.0233/6<2.0132*10-6实验心得:由上述例子可以看出,(1.1)与(1.2)比较时,(1.1)的结果优于(1.2),即一般情况下,内插优于外推。
拉格朗日插值法C语言的实现(实验报告)
3.程序流程:
(1)输入已知点的个数; (2)分别输入已知点的 X 坐标; (3)分别输入已知点的 Y 坐标; (4)通过调用函数 lagrange 函数,来求某点所对应的函数值。
拉格朗日插值多项式如下:
L n ( x j ) yk lk ( x j ) y j j 0,1, ……n
1、进一步熟悉拉格朗日插值法。 2、掌握编程语言字符处理程序的设计和调试技术。
【实验内容】 (题目)作出插值点(-2.00,0.00) , (2.00,5.00) , (5.00,6.00)的二次 Lagrange 插值多项式 L2 (x) ,并计算 L2 (-1.2), L2 (1.2)。 解题思路:
k 0 n
其中 lk ( x )
( x x0 )……(x-x k-1 )(x-x k+1 )……(x-xn ) ( xk x0 )……(xk -xk-1 )(xk -xk+1 )……(xk -xn )
k 0,1, …… ,n
程序流程图:
开始
↓
输入已知点个数 n
↓
输入已知点的 X 坐标以及输 入已知点的 Y 坐标
第 9 页 共 9 页
第 5 页 共 9 页
韩山师范学院
C 语言程序设计
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(); }
拉格朗日插值牛顿插值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年的计算结果都与实际值相差较大,所以插值计算得到的数据准确性并不高。
计算方法实验四拉格朗日插值实验报告
实验报告学院:电子信息工程实验课程:计算方法学生姓名:学号:专业班级:通信工程17-3班级实验四 Lagrange 插值1 目的与要求(1)进一步理解和掌握Lagrange 插值的数值算法。
(2)能够根据给定的函数值表求出插值多项式和函数在某一点的近似值以解决实际问题2 实验内容已知函数表如下,通过编制程序,试用拉格朗日插值多项式求0.5,0.7,0.85三点处的近似函数值。
3 实验原理拉格朗日插值多项式:4 程序设计 (1)流程图拉格朗日插值程序流程图∑===ni 0i ii )x (l y y )x x ()x x )(x x ()x x ()x x ()x x )(x x ()x x ()x (l n i 1i i 1i i 0i n 1i 1i 0i --------=+-+-(2)程序代码#include<stdio.h>#include<math.h>#define n 5double lagrange(long double a[n],long double b[n],double x){int k,l;long double y1,m;y1=0.0;for(k=0;k<n;k++){m=1.0;for(l=0;l<n;l++){if(l!=k){m=m*(x-a[l])/(a[k]-a[l]);}}y1=y1+m*b[k];}return y1;}void main(){double x,y;long double a[n]={0.4,0.55,0.8,0.9,1};long double b[n]={0.41075,0.57815,0.88811,1.02652,1.17520};printf("\n输入要求的自变量的值\n");scanf("%lf",&x);y=lagrange(a,b,x);printf ("拉格朗日插值后的近似值%lf",y); }5 实验结果与分析0.5处的近似函数值为:0.7处的近似函数值为:0.85处的近似函数值为:分析:(1)通过完成拉格朗日插值法的编程实验,在对程序的修改中,我认为我最大的收获是我对C语言中数据类型具有了更为深刻的认识,进一步掌握了拉格朗日插值法。
拉格朗日插值实验报告
引言概述:
拉格朗日插值是一种常用的数值分析方法,旨在通过已知的离散数据点来近似拟合出一个多项式函数,从而实现对未知数据点的预测和估计。
该方法在信号处理、图像处理、金融模型和机器学习等领域具有广泛的应用。
本实验报告将详细介绍拉格朗日插值的原理、算法和实验结果。
正文内容:
1.拉格朗日插值的原理
1.1多项式插值的概念
1.2拉格朗日插值多项式的形式
1.3拉格朗日插值多项式的唯一性证明
2.拉格朗日插值的算法
2.1插值多项式的计算方法
2.2插值多项式的复杂度分析
2.3多点插值方法的优缺点
3.拉格朗日插值的实验设计
3.1实验目的和步骤
3.2数据采集和预处理
3.3插值多项式的建模
3.4实验环境和工具选择
3.5实验结果分析和评估
4.拉格朗日插值的应用案例
4.1信号处理领域中的插值应用
4.2图像处理中的插值算法
4.3金融模型中的拉格朗日插值
4.4机器学习中的插值方法
5.拉格朗日插值的改进和发展
5.1经典拉格朗日插值的局限性
5.2最小二乘拉格朗日插值的改进
5.3多项式插值的其他方法
5.4拉格朗日插值在新领域的应用前景
总结:
拉格朗日插值作为一种经典的数值分析方法,在实际应用中具有广泛的用途。
本文通过介绍拉格朗日插值的原理和算法,以及实验设计和应用案例,全面展示了该方法的特点和优势。
同时,本文还指出了经典拉格朗日插值的局限性,并介绍了一些改进和发展的方向。
可以预见,拉格朗日插值在信号处理、图像处理、金融模型和机器学习等领域将继续发挥重要作用。
拉格朗日插值法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通过对以上测试实例的验证,发现实验结果和预期结果完全一致。
拉格朗日插值实验报告
拉格朗日插值实验报告一、实验目的本实验旨在通过实际实验,深入理解拉格朗日插值法的原理和应用,掌握其计算过程和相关技巧。
二、实验原理Pn(x) = ∑ [yi * li(x)]其中,li(x)称为拉格朗日基函数,具体的计算公式如下:li(x) = ∏ [(x-xj)/(xi-xj)] (i≠j)利用拉格朗日插值法可以对数据进行插值计算,从而得到原函数未知的点的函数值。
三、实验步骤1.根据实验要求,选择一组离散的数据点,确保它们在横坐标轴上不共线。
2. 使用拉格朗日插值法计算插值多项式的各个基函数li(x)。
3.对插值多项式进行求和,得到最终的插值多项式Pn(x)。
4.在给定的范围内选择一些未知数据点,利用插值多项式Pn(x)计算其函数值。
5.将实际计算的函数值与原函数值进行对比,评估插值方法的准确性和精确度。
四、实验结果以实验要求给定的数据点为例,具体数据如下:x:1,2,3,4,5,6y:5,19,43,79,127,187根据拉格朗日插值法的计算公式,可以得到以下结果:l0(x)=(x-2)(x-3)(x-4)(x-5)(x-6)/(-120)l1(x)=(x-1)(x-3)(x-4)(x-5)(x-6)/120l2(x)=(x-1)(x-2)(x-4)(x-5)(x-6)/(-48)l3(x)=(x-1)(x-2)(x-3)(x-5)(x-6)/48l4(x)=(x-1)(x-2)(x-3)(x-4)(x-6)/(-20)l5(x)=(x-1)(x-2)(x-3)(x-4)(x-5)/20插值多项式Pn(x)=5*l0(x)+19*l1(x)+43*l2(x)+79*l3(x)+127*l4(x)+187*l5(x)综合以上计算结果,可以对给定范围内的未知数据点进行插值计算,从而得到相应的函数值。
五、实验分析与结论在实际实验中,我们可以利用拉格朗日插值法对任意给定的函数进行逼近计算,从而得到函数在离散数据点之间的近似值。
拉格朗日插值法实验报告
拉格朗日插值法实验报告一、实验目的本实验旨在通过使用拉格朗日插值法,以给定的一些数据点为基础,来预测其他未给定数据点的函数值。
通过实验,掌握拉格朗日插值法的具体计算步骤和应用范围。
二、实验原理给定 n+1 个互异的点 (x0, y0), (x1, y1), ..., (xn, yn),其中n 为自然数,我们希望通过这些点来构建一个多项式函数 P(x),满足P(xi) = yi,其中 i = 0, 1, ..., n。
构建多项式的具体步骤如下:1. 对于每个 xi,令Li(x) = ∏ (x - xj) / (xi - xj),其中 j ≠ i。
2. 最终的多项式P(x) = ∑ yi * Li(x)。
三、实验步骤1. 给定一组数据点 (x0, y0), (x1, y1), ..., (xn, yn)。
2. 对于每个 xi,计算Li(x) = ∏ (x - xj) / (xi - xj),其中 j ≠ i。
3. 构建多项式P(x) = ∑ yi * Li(x)。
4.给定一个新的x值,使用多项式P(x)预测对应的函数值。
四、实验结果和分析在本实验中,我们给定了如下的一组数据点:(0,1),(1,5),(2,17),(3,41),(4,83)。
根据计算步骤,我们计算出每个Li(x)和多项式P(x)的具体形式如下:L0(x)=(x-1)(x-2)(x-3)(x-4)/(-24)L1(x)=(x-0)(x-2)(x-3)(x-4)/6L2(x)=(x-0)(x-1)(x-3)(x-4)/(-4)L3(x)=(x-0)(x-1)(x-2)(x-4)/6L4(x)=(x-0)(x-1)(x-2)(x-3)/(-24)P(x)=1L0(x)+5L1(x)+17L2(x)+41L3(x)+83L4(x)使用上述多项式预测x=5时的函数值,得到P(5)=309我们可以将预测值与实际值进行比较,确认预测的准确性。
如果有多组数据点,我们可以使用更多的数据点来构建多项式,提高预测的精度。
拉格朗日和牛顿插值法的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)并存表//}}填表。
数值分析拉格朗日插值法上机实验报告
课题一:拉格朗日插值法1.实验目的1.学习和掌握拉格朗日插值多项式。
2.运用拉格朗日插值多项式进行计算。
2.实验过程作出插值点(,),(,),(,)二、算法步骤已知:某些点的坐标以及点数。
输入:条件点数以及这些点的坐标。
输出:根据给定的点求出其对应的拉格朗日插值多项式的值。
3.程序流程:(1)输入已知点的个数;(2)分别输入已知点的X坐标;(3)分别输入已知点的Y坐标;程序如下:#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<=0){printf(Error! The value of n must in (0,20).);getch();return 1;}for(i=0;i<=n-1;i++){牰湩晴尨學搥???※scanf(%f,&x[i]);}printf(\);for(i=0;i<=n-1;i++) {printf(y[%d]:,i);scanf(%f,&y[i]); } printf(\);printf(Input xx:);scanf(%f,&xx);yy=lagrange(x,y,xx,n);牰湩晴尨?春礬┽屦湜?硸礬? getch();}运的值。
用C语言实现拉格朗日插值
用C语言实现拉格朗日插值拉格朗日插值是一种在给定有限个数据点的函数值的情况下,用一个多项式函数逼近这些数据点,从而在数据点之间进行插值和外推的方法。
这个多项式函数称为拉格朗日插值多项式。
拉格朗日插值多项式的形式如下:P(x) = Σ L(x) * yi其中,i的取值范围是从0到n,n为给定的数据点的数量。
L(x)代表拉格朗日基函数,可以表示为:L(x) = Π (x - xj) / (xi - xj), 其中i ≠ j接下来,我们将用C语言实现拉格朗日插值。
首先,我们定义一个结构体来存储数据点的x和y坐标:```ctypedef structdouble x;double y;} DataPoint;```然后,我们定义一个函数来计算拉格朗日基函数的值:```cdouble lagrange_basis(double x, DataPoint* data_points, int data_count, int index)double result = 1.0;for (int i = 0; i < data_count; i++)if (i != index)result *= (x - data_points[i].x) / (data_points[index].x - data_points[i].x);}}return result;```接下来,我们定义一个函数来计算拉格朗日插值多项式的值:```cdouble lagrange_interpolation(double x, DataPoint*data_points, int data_count)double result = 0.0;for (int i = 0; i < data_count; i++)result += data_points[i].y * lagrange_basis(x, data_points, data_count, i);}return result;```最后,我们可以在主函数中使用这些函数来进行插值。
拉格朗日插值实验报告
实验名称: 实验一 拉格朗日插值1 引言我们在生产生活中常常会遇到这样的问题:某个实际问题中,函数f (x)在区间[a,b]上存在且连续,但却很难找到其表达式,只能通过实验和观测得到有限点上的函数表。
显然,根据这些点的函数值来求其它点的函数值是非常困难的。
有些情况虽然可以写出表达式,但结构复杂,使用不方便。
所以我们总是希望根据已有的数据点(或函数表)来构造某个简单函数P (x)作为f (x)的近似值。
插值法是解决此类问题的一种比较古老的、但却很常用的方法。
它不仅直接广泛地应用于生产实际和科学研究中,而且也是进一步学习数值计算方法的基础。
2 实验目的和要求运用Matlab 编写三个.m 文件,定义三种插值函数,要求一次性输入整张函数表,并利用计算机选择在插值计算中所需的节点。
分别通过分段线性插值、分段二次插值和全区间上拉格朗日插值计算f (0.15),f (0.31),f (0.47)的近似值。
已知函数表如下:3 算法原理与流程图(1)原理设函数y=在插值区间[a,b]上连续,且在n+1个不同的插值节点a≤x 0,x 1,…,x n ≤b 上分别取值y 0,y 1,…,y n 。
目的是要在一个性质优良、便于计算的插值函数类Φ中,求一简单函数P (x),满足插值条件P (x i )=y i (i=0,1,…,n),而在其他点x≠x i 上,作为f (x)近似值。
求插值函数P (x)的方法称为插值法。
在本实验中,采用拉格朗日插值法。
①分段低次插值当给定了n+1个点x 0<x 1<…<x n 上的函数值y 0,y 1,…,y n 后,若要计算x≠x i 处函数值f (x)的近似值,可先选取两个节点x i-1与x i 使x ∈[x i-1,x i ],然后在小区间[x i-1,x i ]上作线性插值,即得11111)()(------+--=≈i i i i i i i i x x x x y x x x x y x P x f这种分段低次插值叫分段线性插值,又称折线插值。
实验一 拉格朗日插值法
三次差值试验结果:
— 4 —
实 验 一: 拉格朗日插值
实验目的: 1. 熟悉拉格朗日插值方法的程序设计; 2. 学会拉格朗日插值方法求函数值的近似值, 以解决其它科学实验的计算问题。 实验内容: 已知函数值表
xi f (xi )
-0.6 1.6
-0.2 2.4
0.2 1.2
0.4 3.2
ቤተ መጻሕፍቲ ባይዱ
试分别建立二次插值多项式和三次插值多项式,计算 f (0) 的近似值。 实验要求:屏幕显示 f (0) 的近似值。
=
k 1 k
结 束
— 2 —
实 验 报 告 (一)
辽宁科技大学 研究生 学院(系) 课名:数值分析 班级:研 12 姓名: 张贺 题目:拉格朗日插值 学号:12208190**** 专业: 矿业工程 任课教师:熊 焱 2012 年 09 月 20 日
实验程序:
— 3 —
实验结果: 二次差值试验
— 1 —
附件:拉格朗日插值算法框图
开 始
输 入 ( x i , y i ) , ( i= 0 ,1 , … , n )
0 y 0 k
1 t
x xj xk x j
t t
j 0 , , k 1, k 1, , n
y t yk y
k n?
输 出 y
拉格朗日插值算法及应用实验报告
拉格朗日插值算法及应用实验报告一、引言拉格朗日插值法是一种常用的数值插值方法,可用于在已知数据点之间估计函数值。
该方法的基本思想是通过构造一个多项式来逼近给定的数据点集合,从而实现对函数的插值。
本实验旨在通过实际计算的方式探讨拉格朗日插值法的基本原理与应用。
二、拉格朗日插值法原理拉格朗日插值法利用多项式的性质来对给定的数据进行插值。
给定n+1个不同的数据点(x_0,y_0),(x_1,y_1),...,(x_n,y_n),其中x_i表示自变量,y_i表示因变量。
拉格朗日插值多项式的表达式为:P_n(x)=y_0*L_0(x)+y_1*L_1(x)+...+y_n*L_n(x)其中L_i(x)为拉格朗日基函数,定义如下:L_i(x)=(x-x_0)(x-x_1)...(x-x_i-1)(x-x_i+1)...(x-x_n)/[(x_i-x_0)(x_i-x_1)...(x_i-x_i-1)(x_i-x_i+1)...(x_i-x_n)]三、应用实验本实验选取了不同的数据点集合,并利用拉格朗日插值法计算相应的拟合多项式,从而对函数进行插值。
数据点集合1:(x_0,y_0)=(0,1)(x_1,y_1)=(1,2)(x_2,y_2)=(2,3)(x_3,y_3)=(3,5)利用拉格朗日插值法得到的多项式为:P_3(x)=1*L_0(x)+2*L_1(x)+3*L_2(x)+5*L_3(x)将基函数带入,得到多项式表达式为:P_3(x)=1/6*x^3-3/2*x^2+11/6*x+1数据点集合2:(x_0,y_0)=(0,1)(x_1,y_1)=(1,4)(x_2,y_2)=(2,9)(x_3,y_3)=(3,16)利用拉格朗日插值法得到的多项式为:P_3(x)=1*L_0(x)+4*L_1(x)+9*L_2(x)+16*L_3(x)将基函数带入,得到多项式表达式为:P_3(x)=1/6*x^3+1/2*x^2+1/3*x+1四、实验结果与讨论通过利用拉格朗日插值法,我们得到了不同数据点集合的拟合多项式。
拉格朗日插值法 实验
实验九 Lagrange 插值法求近似函数实验一、实验内容:设2.12)(2+-=x x x f ,数据点取值如下表分别构造)(),(),(432x L x L x L 来近似)(x f .二、算法原理:插值法是函数逼近的一种重要方法,解决对于只提供离散数据点 ))(,(i i i y x f x =, i=0,1,...,n,而希望在函数空间{}n s p a n ϕϕϕ,...,,2=Φ中选择,)(1i ni i c x S ϕ∑==来近似于真实函数)(x f 的问题,其中i c 是可选择参数,可通过要求曲线)(x S 经过数据点,即满足插值条件n i x f x S i i ,...,1,0),()(==来确定.所谓的代数插值指以代数多项式)(x P n 作为插值函数,即函数空间取为 {}n x x s p a n ,...,,1=Φ,代数插值多项式)(x P n 的表达式,在理论上可通过求解参数i c 满足的1+n 个方程⎪⎪⎩⎪⎪⎨⎧=++++=++++=++++n n n n n n n n n n y x c x c x c c y x c x c x c c y x c x c x c c ...... (22101121211000202010)唯一确定,但实际上不可取。
Lagrange 插值法巧妙利用了基函数法,直接构造出该插值多项式 ),()(x P x L n n =它适用于非等距节点.其基本思想是通过满足在节点i x 处值取1,其余处取0的插值基函数),(x l i 将)(x L n 表达为一个线性结合,)()(1i ni i n y x l x L ∑==其中 n i x x x x x l n i j j j i j i ≤≤--=∏≠=0,)(0 具体算法如下Step1输入数据点总数1+n (即输入n 值),节点i x ,相应的函数值i y ,i =0,1,…,n,令;0)(=x L nStep2 for 0=i to n{计算∏≠=--=n i j j j i j i x x x x x l 0)(s=1,for 0=j to n {如果i j =,s s =, 否则, j i j x x x x s s --=})(x l s i →)())()((x L y x l x L n i i n →+ }Step3输出插值多项式)(x L n .三、实验要求:(1)编制Lagrange 插值法程序,得出实验结果,并进行比较;(2)观察高次代数插值的Runge 现象:1901年,德国数学家runge 考察函数22511)(x x f += 在[]1,1- 上n 等分做等距节点插值时,观察到插值节点∞→n ,插值多项式)(x P n 仅在726.0≤x 内收敛于)(x f ,而此区间以外都发散. 请用10=n ,计算Lagrange 插值多项式10P ,通过图示(在一个坐标上画出10P 和)(x f 的对比图) ,观察这一现象, 并写出你所得到的启示.四、源代码:#include<stdio.h>#include<math.h>void main(){int i,j,n=4;float y=0.7,Ln=0;float s;float x[5]={-1,-0.5,0,0.5,1},f[5]={4.2,2.45,1.2,0.45,0.2},l[5];for(i=0;i<=n;i++){s=1;for(j=0;j<=n;j++){if(j==i)s=s;elses*=(y-x[j])/(x[i]-x[j]);}l[i]=s;Ln+=l[i]*f[i];}printf("%f",Ln);}五、实验结果截图:六、上机体会:。
拉格朗日实验报告
实验报告课程:数值计算方法与计算班级:实验名称:拉格朗日插值实验姓名实验日期: 2011.09.23 学号实验报告日期: 2011.09.23实验一拉格朗日插值实验一、实验目的1.学习编程拉格朗日插值公式2.运用编程进行计算插值函数二、实验设备及实验环境在机房用WIN-TC程序进行编程。
三、实验原理应用拉格朗日插值公式四、程序源代码#include "stdio.h"main(int argc,char*argv[]){ int i,j,n;float x[10],y[10],lang=0.0,u;printf("input number n=:\n");scanf("%d",&n);printf("input x[i]");for(i=0;i<n;i++)scanf("%f",&x[i]);printf("input y[i]");for(i=0;i<n;i++)scanf("%f",&y[i]);printf("input u");scanf("%f",&u);for(i=0;i<n;i++){float tmp=1.0;for(j=0;j<n;j++)if(i!=j)tmp=tmp*(u-x[j])/(x[i]-x[j]);lang=lang+tmp*y[i];}printf("lagrange=%f",lang);getch();}五、实验结果对一组数据(-2.00,17)(0.00,1.0)(1.00,2.00)(2.00,17.00)进行实验得到拉格朗日插值公式结果如下:六、实验心得体会虽然考了二级,但太久没碰程序,今天开始时还真无从下手,有点混乱,在写程序过程中,因为粗心打错符号,重复符号,导致程序出错,经过细心观察,检查出错误,成功完成程序,好开心呀。
实验四拉格朗日法插值
实验四用VC显示一定范围的确定函数及拉格朗日法插值得到的逼近函数的图像学院:计算机与信息工程学院班级: 计算机科学与技术师范汉班学号: 20081121107姓名: 黄志强指导老师: 马季驌算法分析:本程序运用计算机图形学的基本绘图函数进行画点绘图。
SetPixel(int(x+0.5),int (f(x)+0.5),colorref);我们剩下的工作就是求出f(x) 的各种插值逼近函数(原函数已经给出)的。
任务要求做三个近似函数:拉格朗日插值近似,分段线性插值近似,和Hermite分段三点二次插值。
本程序的算法核心是用程序实现形式较为繁杂的插值函数的表示。
拉格朗日插值函数的形式为在插值点处的函数值于二次插值基函数的线性组合;程序实现细则如下。
源代码:插值基函数double CMyView::L(int i, double x){double m=1;int j;for(j=0;j<N;j++){if(j==i)continue;m=m*(x-cx[j])/(cx[i]-cx[j]);}return m;}拉格朗日逼近函数(插值基函数与原函数在形值点处的线性组合)double CMyView::fai(double x){int i;double y=0;for(i=0;i<N;i++){y+=f(cx[i])*L(i,x);//L(i,x)有累积效应出错}return y;}结果截图:原函数图像拉格朗日插值函数图像拉格朗日插值函数图像与原函数图像的对照结果分析:拉格朗日插值逼近函数由于使用了10 个形值点,插值函数的次数高达9,函数的稳定性差产生了非常严重的荣格现象。
拉格朗日插值--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);
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(1)输入已知点的个数;
(2)分别输入已知点的X坐标;
(3)分别输入已知点的Y坐标;
(4)通过调用函数lagrange函数,来求某点所对应的函数值。
拉格朗日插值多项式如下:
其中
程序流程图:
↓
↓
↓
↓
源程序:
#include <stdio.h>
#include <malloc.h>
float lagrange(float *x,float *y,float xx,int n)
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;
(3)分别输入已知点的Y坐标;
(4)通过调用函数lagrange函数,来求某点所对应的函数值。
拉格朗日插值多项式如下:
其中
程序流程图:
↓
↓
↓
↓
程序如下:
#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]);
算法2实验一.拉格朗日插值法C语言的实现
1.实验目的:
进一步熟悉拉格朗日插值法。
掌握编程语言字符处理程序的设计和调试技术。
2.实验要求:
已知:某些点的坐标以及点数。
输入:条件点数以及这些点的坐标。
输出:根据给定的点求出其对应的拉格朗日插值多项式的值。
3.程序流程:
(1)输入已知点的个数;
(2)分别输入已知点的X坐标;
printf("请输入插值点个数num=");
scanf("%d",&num);
NewTon(num);
printf("结束");
}
}
else
for(j=1;j<m;j++)
{
double ss=1;
for(k=0;k<N+j;k++)
ss*=x[N+j]-x[k];
for(k=0;k<N+j;k++)
{
double rr=y[k];
for(t=0;t<k;t++)
rr*=x[N+j]-x[t];
y[N+j]-=rr;
}
y[N+j]/=ss;
{
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();
}
运行结果:
{
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)的值。
运行结果如下:
算法三#include<stdio.h>
#include <stdlib.h>
#define M 20;
int n=0;
int p=1;
int num=0;
double *x;
double *y;
double Calculate(double tt) ;
{
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("\n");
while(p!=0)
{
if(p==1)
{
printf("请输入再次插值点个数num=");
scanf("%d",&num);
NewTon(num);
}
else if(p==2)
{
printf("请输入x=");
scanf("%lf",&tt);
tt=Calculate(tt);
}
}
double Calculate(double tt)
{
int i,j;
double yy=0;
double xx;for(i=0;i<n;i++)
{
xx=y[i];
for(j=0;j<i;j++)
{
xx=xx*(tt-x[j]);
}
yy+=xx;
}
return yy;
}
void main()
{
if(N>1)
for(j=0;j<m;j++)
{
double ss=1;
for(k=0;k<N+j;k++)
ss*=x[N+j]-x[k];
for(k=0;k<N+j;k++)
{
double rr=y[k];
for(t=0;t<k;t++)
rr*=x[N+j]-x[t];
y[N+j]-=rr;
}
y[N+j]/=ss;
{
int j,k,t,N;N=n;
n+=m;
double *x1;
double *y1;
x1=(double*)malloc(n*sizeof(double));
y1=(double*)malloc(n*sizeof(double));
for(j=0;j<N;j++)
{
x1[j]=x[j];
y1[j]=y[j];
{
int i,j;
float *a,yy=0.0;
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()
}
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("Q(x)=%lf",tt);
printf("\n");
printf("是否继续进行插值、计算还是结束?继续插值请输入1,结束请输入0,求值计算请输入2;p=");
scanf("%d",&p);
printf("\n");
}
else break;
}
}
void Print( )