当前位置:文档之家› Lagrange插值基函数构造插值多项式

Lagrange插值基函数构造插值多项式

Lagrange插值基函数构造插值多项式
Lagrange插值基函数构造插值多项式

数学与软件科学学院实验报告

学期:至第学期年月日

课程名称:___计算机数值方法___ 专业: 级班

实验编号:1 实验项目一次、二次Lagrange 插值多项式指导教师__张莉_ 姓名:学号:实验成绩:

一、实验目的及要求

实验目的:体会使用Lagrange插值基函数构造插值多项式的特点,熟悉使用一次或二次Lagrange插值多项式近似函数y=f(x)的算法。掌握Lagrange插值多项式近似函数f(x)的误差表达式,并会熟练应用。

实验要求:

1. 给出一次、二次Lagrange插值算法

2. 用C语言实现算法

3. 给出误差分析。

二、实验内容

用下列插值节点数据,构造一次和二次Lagrange插值多项式,并计

三、实验步骤(该部分不够填写.请填写附页)

步骤一:用为代码描述lagrange插值多项式的算法

Step 1:输入:插值节点控制数n,插值点序列(xi,yi),i=0,1,…n,要计算的函数点x.

Step 2: for j=0 to n

{ { for j=0 to n 对于给定的x,计算lagrange基函数li(x)

然后求tmp=tmp*(x-xj)/(xi-xj);

}

fx=fx+tmp*yi;

}

Step 3:输出结果。

步骤二:编辑程序如下:

#include

#define MAX_N 3 // 定义点的最大维数

typedef struct tagPOINT /*the structer of point */

{

double x;

double y;

}POINT;

//点的结构

int main()

{

int n,i,j;

POINT points[MAX_N+1];

double tmp=1.0;

double x;

double lagrange=0.0;

clrscr();

printf("\nInput n value :"); /*the number of the points inserted*/

scanf("%d",&n); //输入被插值点的个数

if(n>MAX_N)

{

printf("The input n is larger than MAX_N,please redefine the MAX_N.\n");

return 1;

}

if(n<=0)

{

printf("Please input a number between 1 and %d.\n",MAX_N);

}

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:"); /*the value of x*/

scanf("%lf",&x); //输入待求的点的第一个分量

for(i=0;i<=n;i++)

{

for(j=0;j<=n && j!=i;j++)

tmp*=(x-points[j].x)/(points[i].x-points[j].x);

lagrange+=tmp*points[i].y;

} //用lagrange来求多项式

printf("the results is %lf",lagrange);

return 0;

}

实验报告附页

四、实验结果分析与评价(该部分不够填写.请填写附页)

构造lagrange一次插值多项式,求点f(11.5),选取前两个插值点

构造lagrange一次插值多项式,求点f(12.5),选取后两个插值点

构造lagrange 二次插值多项式,求点f(11.5),结果为:

构造lagrange 二次插值多项式,求点f(12.5),结果为:

误差分析:

当x=11.5时, lagrange一次插值多项式的误差为:

①|R(x)|=|f(2)(a)(x-x0)(x-x1)/2|=|sin(x)(11.5-11)(11.5-12)/2|<=0.125

②当x=12.5时,lagrange一次插值多项式的误差为:

|R(x)|=|f(2)(a)(x-x1)(x-x2)|=|sin(x)(12.5-12)(12.5-13)/2|<=0.125

③当x=11.5时,lagrange二次插值多项式的误差为:

|R(x)|=|f(3)(a)(x-x0)(x-x1)(x-x2)/(3*2)|<=|(11.5-11)(11.5-12)(11.5-13 )/6|=0.0625

④当x=12.5时,lagrange二次插值多项式的误差为:R(x)=

|f(3)(a)(x-x3)(x-x1)(x-x2)/(3*2)|<=|(12.5-12)(12.5-12)(12.5-13)/(3*2) |=0.0625

发现:二次插值的误差要小于一次插值的误差。

注:实验成绩等级分为(90-100分)优,(80-89分)良,(70-79分)中,(60-69分)及格,(59分)不及格

Lagrange插值基函数构造插值多项式

数学与软件科学学院实验报告 学期:至第学期年月日 课程名称:___计算机数值方法___ 专业: 级班 实验编号:1 实验项目一次、二次Lagrange 插值多项式指导教师__张莉_ 姓名:学号:实验成绩: 一、实验目的及要求 实验目的:体会使用Lagrange插值基函数构造插值多项式的特点,熟悉使用一次或二次Lagrange插值多项式近似函数y=f(x)的算法。掌握Lagrange插值多项式近似函数f(x)的误差表达式,并会熟练应用。 实验要求: 1. 给出一次、二次Lagrange插值算法 2. 用C语言实现算法 3. 给出误差分析。 二、实验内容 用下列插值节点数据,构造一次和二次Lagrange插值多项式,并计 三、实验步骤(该部分不够填写.请填写附页) 步骤一:用为代码描述lagrange插值多项式的算法 Step 1:输入:插值节点控制数n,插值点序列(xi,yi),i=0,1,…n,要计算的函数点x. Step 2: for j=0 to n { { for j=0 to n 对于给定的x,计算lagrange基函数li(x) 然后求tmp=tmp*(x-xj)/(xi-xj); } fx=fx+tmp*yi; } Step 3:输出结果。 步骤二:编辑程序如下:

#include #define MAX_N 3 // 定义点的最大维数 typedef struct tagPOINT /*the structer of point */ { double x; double y; }POINT; //点的结构 int main() { int n,i,j; POINT points[MAX_N+1]; double tmp=1.0; double x; double lagrange=0.0; clrscr(); printf("\nInput n value :"); /*the number of the points inserted*/ scanf("%d",&n); //输入被插值点的个数 if(n>MAX_N) { printf("The input n is larger than MAX_N,please redefine the MAX_N.\n"); return 1; } if(n<=0) { printf("Please input a number between 1 and %d.\n",MAX_N); } 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:"); /*the value of x*/ scanf("%lf",&x); //输入待求的点的第一个分量 for(i=0;i<=n;i++) { for(j=0;j<=n && j!=i;j++) tmp*=(x-points[j].x)/(points[i].x-points[j].x); lagrange+=tmp*points[i].y; } //用lagrange来求多项式 printf("the results is %lf",lagrange);

五种插值法的对比研究---开题报告

五种插值法的对比研究 1. 选题依据 1.1 选题背景 插值法是一种古老的数学方法,插值法历史悠久。据考证,在公元六世纪时, 我国焯(zhuo) 已经把等距二次插值法应用于天文计算。十七世纪时,Newton 和 Gregory(格雷格里) 建立了等距节点上的一般插值公式,十八世纪时,Lagrange(拉格朗日) 给出了更一般的非等距节点插值公式。 而它的基本理论是在微积分产生以后逐渐完善的,它的实际应用也日益增多,特别是在计算机工程中。许多库函数的计算实际上归结于对逼近函数的计算。 1.2 研究的目的和意义 插值法是数值分析中最基本的方法之一。 在实际问题中碰到的函数是各种各样的,有的甚至给不出表达式,只提供了一些离散数据,例如,在查对数表时, 要查的数据在表中找不到,就先找出它相邻的数,再从旁边找出它的修正值, 按一定关系把相邻的数加以修正,从而找出要找的数,这种修正关系实际上就是一种插值。 在实际应用中选用不同类型的插值函数,逼近的效果也不同。在数值计算方法中,我们学习过五种基本的插值方法,即Lagrange 插值、Newton 插值、分段线性插值、分段三次Hermite 插值、样条插值函数。所以通过从这五种插值法的基本思想、特征、性质和具体实例入手,探讨五种插值法的优缺点和适用围,让学习者能够迅速而准确的解决实际问题,掌握插值法的应用。 2. 研究的方法 从具体实例入手并结合Matlab 在科学计算中的优势,通过实验对它们的精度和效率进行比较分析。 3. 论文结构 3.1 论文的总体结构 第一部分 导言 主要介绍选题的背景、目的及意义、研究现状、文献综述等。 第二部分 五种插值法的基本思想、性质及特点 在数值计算方法中,插值法是计算方法的基础,数值微分、数值积分和微分方程数值解都建立在此基础上。 插值问题的提法是:已知f(x)(可能未知或非常复杂函数)在彼此不同的n+1 个实点0x ,1x ,…n x 处的函数值是f(0x ),f(1x ),…,f(n x ),这时我们简单的说f(x)有n+1 个 离散数据对0n i i )}y ,{(x i .要估算f(x)在其它点x 处的函数值,最常见的一种办法就是插值, 即寻找一个相对简单的函数y(x),使其满足下列插值条件:y(i x )=f(i x ),i=0,1,…,n.,并以y(x)作为f(x)的近似值.其中y(x)称为插值函数,f(x)称为被插函数。

函数的插值方法及matlab程序

6.1 插值问题及其误差 6.1.2 与插值有关的MATLAB 函数 (一) POLY2SYM函数 调用格式一:poly2sym (C) 调用格式二:f1=poly2sym(C,'V') 或f2=poly2sym(C, sym ('V') ), (二) POLYVAL函数 调用格式:Y = polyval(P,X) (三) POLY函数 调用格式:Y = poly (V) (四) CONV函数 调用格式:C =conv (A, B) 例 6.1.2求三个一次多项式、和的积.它们的零点分别依次为0.4,0.8,1.2. 解我们可以用两种MATLAB程序求之. 方法1如输入MATLAB程序 >> X1=[0.4,0.8,1.2]; l1=poly(X1), L1=poly2sym (l1) 运行后输出结果为 l1 = 1.0000 - 2.4000 1.7600 -0.3840 L1 = x^3-12/5*x^2+44/25*x-48/125 方法2如输入MATLAB程序 >> P1=poly(0.4);P2=poly(0.8);P3=poly(1.2); C =conv (conv (P1, P2), P3) , L1=poly2sym (C) 运行后输出的结果与方法1相同. (五) DECONV 函数 调用格式:[Q,R] =deconv (B,A) (六) roots(poly(1:n))命令 调用格式:roots(poly(1:n)) (七) det(a*eye(size (A)) - A)命令 调用格式:b=det(a*ey e(size (A)) - A) 6.2 拉格朗日(Lagrange)插值及其MATLAB程序 6.2.1 线性插值及其MATLAB程序 例 6.2.1 已知函数在上具有二阶连续导数,,且满足条件 .求线性插值多项式和函数值,并估计其误差. 解输入程序 >> X=[1,3];Y=[1,2]; l01= poly(X(2))/( X(1)- X(2)), l11= poly(X(1))/( X(2)- X(1)), l0=poly2sym (l01),l1=poly2sym (l11), P = l01* Y(1)+ l11* Y(2), L=poly2sym (P),x=1.5; Y = polyval(P,x) 运行后输出基函数l0和l1及其插值多项式的系数向量P(略)、插值多项式L和插值Y为l0 = l1 = L = Y = -1/2*x+3/2 1/2*x-1/2 1/2*x+1/2 1.2500 输入程序 >> M=5;R1=M*abs((x-X(1))* (x-X(2)))/2

插值法原理

附:插值法原理 我们知道化学工程中用来描述客观现象的函数f(x)往往是很复杂的,通过实验可以得到的一系列离散点xi及其相应的函数值yi,而xi和yi之间有时不能表达成一个适宜的数学关系式。这种情况下,可以用表格来反应xi和yi之间的关系。但表格法不便于分析其性质和变化规律,不能连续表达变量之间的关系,特别是不能直接读取表中数据点之间的数据。例如水的物理性质(黏度、密度、焓、比热容、热导率、动力黏度、运动黏度等)是在化工过程研究与计算中常用的参数,教科书或手册上往往只给出每隔10℃的相关物理性质数据,而实际应用中常常需要知道任意给定点处的函数值,或者利用已知的测试值来推算非测试点上的函数值,这就需要通过函数插值法来解决。 插值法的基本思想就是构造一个简单函数y = P(x)作为f(x)的近似表达式,以P(x)的值作为函数f(x)的近似值,而且要求P(x)在给定点xi与取值相同,即P(xi) = f(xi)通常称P(x)为f(x)的插值函数,xi称为插值节点。插值的方法很多,这里介绍一元线性插值和二次插值。 1.一元线性插值 已知函数y = f(x),在x0,x1上的值为y0,y1,如何构造一个插值函数y =P(x),使之满足P(x0) = y0,P(x1) = y1,从而使得函数P(x)可以近似地代替f(x)的数据。 一元线性插值法是最简单的插值方法,即该插值函数P(x)是通过A(x0,y0) 与B(x1,y 1)两点的一条直线,以此来近似地表示函数f(x),此直线的方程为 y = P1(x) = y0+ (1) 式(1)中P1(x)是x的一次多项式,即一次函数,这种插值称为线性插值。 将上式整理,可以改写为

拉格朗日插值公式的证明及其应用讲解

拉格朗日插值公式的证明及其应用 摘要: 拉格朗日(Lagrange)插值公式是多项式中的重要公式之一,在理论和实践中都有着广泛的应用.本文阐述了Lagrange 插值的基本理论,譬如:线形插值,抛物插值,Lagrange 多项式等.然后将线形插值,抛物插值,Lagrange 多项式插值分别应用到高中知识中,并且学会用计算机程序来编写.插值法的思想与中国剩余定理一脉相承, 体现了代数中"线性化" (即表示为求和和数乘的形式) 这一基本思路, 大巧若拙.本文的目的是通过介绍拉格朗日插值公式的推导,唯一性,证明过程及其在解题与实际生活问题中的应用来寻找该公式的优点,并且引人思考它在物理,化学等领域的应用.通过实际鉴定过程,利用插值公式计算生活中的成本问题,可以了解它的计算精度高,方法快捷. 关键词: 拉格朗日插值公式 唯一性 证明 解题应用 资产评估 曲线插值问题,直观地说,认为已知的一批数据点()n k k k f x 0,=是准确的,这些数据点所表现的 准确函数关系()x f 是未知的,在这种情况下要作一条近似曲线()x P 且点点通过这些点,插值问题不仅要讨论这种近似曲线()x P 的构造方法,还要讨论点增多时这种近似曲线()x P 是否稳定地收敛于未知函数()x f ,我们先研究一种简单常用的插值——拉格朗日插值. 一.定义,推导及其在解题中的应用 1.线性插值 1.1. 线性插值的定义 假定已知区间[]1,+k k x x 的端点处的函数值()k k x f y =, ()11++=k k x f y ,要求线性插值多项式()x L 1使它满足()k k y x L =1, ()111++=k k y x L . ()x L y 1=的几何意义:通过两点()k k y x ,和()11,++k k y x 的直线, 如图1所示,()x L 1的表达式由几何意义直接给出,即 ()()k k k k k k x x x x y y y x L ---+ =++111 (点斜式), 图1 ()11111++++--+--= k k k k k k k k y x x x x y x x x x x L (两点式). y=L 1x () y=f x () y k+1 y k x k+1 x k o y x

Lagrange插值基函数构造插值多项式.docx

数学与软件科学学院实验报告 学期?至第学期年月日 课!呈名称:计算机数值务法专业:级班 实验编号:1实验项目一次、二次Lagrange插值多项式指导教师张莉 姓名:学号:实验成绩: 一、实验目的及要求实验目的:体会使用Lagrange插值基函数构造插值多项式的特点,熟悉使用一次或二次Lagrange插值多项式近似函数y=f(x)的算法。掌握Lagrange插值多项式近似函数f(x)的误差表达式,并会熟练应用。 实验要求: 1.给出一次、二次Lagrange插值算法 2?用C语言实现算法 3?给出误差分析。 二、实验内容 用下列插值节点数据,构造一次和二次Lagrange插值多项式,并计算 f(11.5),f(12.5)的值。(f(x)=sinx) 要求:所需数据都从键盘读入,最后输出结果. 三、实验步骤(该部分不够填写?请填写附页) 步骤一:用为代码描述lagrange插值多项式的算法 Step 1:输入:插值节点控制数n,插值点序列(xi,yi) ,i=O,l,...n,要计算的函数点x. Step 2: for j=0 to n { { forj=0 to n对于给定的x,计算lagrangc基函数li(x) 然后求tmp=tmp* (x-xj) /(xi-xj); fx=fx+tmp*yi; Step 3:输111结果。步骤二:编辑程序如下:

# includc #define MAX N 3 // 定义点的最大维数 typedef struct tagPOINT { /*the structer of point */ double x; double y; } POINT; 〃点的结构 int main() { int n,i,j; POINT pointsLMAX_N+lJ; double tmp=1.0; double x; double lagrange=0.0; clrscr(); printf(”\nlnput n value scanf(n%d n,&n); /*the number of the points inserted*/ 〃输入被插值点的个数 if(n>MAX_N) { printf("The i叩ut n is larger than MAX_N,please redefine the MAX_N.\n"); return 1; 1 if(n<=0) { printf("Please i叩ut a number between 1 and %d.\n",MAX_N); } printf("Now input the (x_i,y_i),i=O,...%d:\n",n); fbr(i=O;i<=n ;i++) scanf("%lf %lf',&points[i].x,&points[i].y); 〃输入被插值点 printf("Now input the x value:*'); /*the value of x*/ scanf(“%f,&x); 〃输入待求的点的第一个分量 for(i=0;i<=n;i++) { for(j=0;j<=n && j!=i;j++) tmp*=(x-pointsfj].x)/(points[i].x-points[jl.x); lagrange+=tmp*points[i].y; } 〃用lagrange來求多项式 printf(M the results is %lf',lagrange);

相关主题
文本预览
相关文档 最新文档