文档库 最新最全的文档下载
当前位置:文档库 › 二元拉格朗日插值Fortran程序设计实验

二元拉格朗日插值Fortran程序设计实验

二元拉格朗日插值Fortran程序设计实验
二元拉格朗日插值Fortran程序设计实验

二元拉格朗日插值

一 实验目的-程序功能

利用FORTRAN 编程实现二元拉格朗日插值求解函数在给定点的函数值。

设已知插值节点(xi,yi )(i=1,…,m,j=1,…,n)及对应函数值zij=f(xi,yi) (i=1,…,m,j=1,…,n),用拉格朗日插值法求函数在给定点(x,y )处的对应函数值z 。 二 实验内容

1、 了解和学习FORTRAN 程序语言,会编写一些小程序;

2、 学习和理解拉格朗日插值的原理及方法,并拓展至二元拉格

朗日插值方法;

3、 利用FORTRAN 编程实现二元拉格朗日插值法;

4、 举例进行求解,并对结果进行分析。 三 实验原理及方法 1、基本概念

已知函数y=f(x)在若干点i x 的函数值i y =()i x f (i=0,1,???,n )一个差值问题就是求一“简单”的函数p(x):

p(i x )=i y ,i=0,1,???,n, (1)

则p(x)为f(x)的插值函数,而f(x)为被插值函数会插值原函数,0

x ,1x ,2x ,...,n x 为插值节点,式(1)为插值条件,如果对固定点-

x 求f(-

x )

数值解,我们称-x 为一个插值节点,f(-x )≈p(-x )称为-

x 点的插值,当

-

x ∈[min(0x ,1x ,2x ,...,n x ),max(0x ,1x ,2x ,...,n x )]时,称为内插,

否则称为外插式外推,特别地,当p(x)为不超过n 次多项式时称为n 阶Lagrange 插值。

2、Lagrange 插值公式 2.1 线性插值)1(1L

设已知0x ,1x 及0y =f(0x ) ,1y =f(1x ),)(1x L 为不超过一次多项式且满足)(01x L =0y ,)(11x L =1y ,几何上,)(1x L 为过(0x ,0y ),(1x ,1y )的直线,从而得到

)(1x L =0y +

10

1x x y y --(x-0x ). (2) 为了推广到高阶问题,我们将式(2)变成对称式

)(1x L =0l (x )0y +1l (x)1y . (3)

其中,

l (x )=101x x x x --,1l (x)=010x x x x --。

均为1次多项式且满足

l (0x )=1且1l (0x )=0;0l (1x )=0且1l (1x )=1。

两关系式可统一写成

i 1()0i l x ?=?

? 2.2 n 阶Lagrange 插值)(x L n

设已知0x ,1x ,2x ,...,n x 及i y =f(i x )(i=0,1,.....,n),)(x L n 为不超过n 次多项式且满足i i n y x L =)((i=0,1,...n ).

易知

000

()()()()n

n n n i i

L x l x y l x y l x y =+

+=∑

其中,)(x l i 均为n 次多项式且满足式(4)(i,j=0,1,...,n ),再由j

x (j ≠i )

为n 次多项式)(x l i 的n 个根,知)(x l i =c

∏≠=-n

i

i j j

x

x 0

.最后,由

(4)

i j ≠()

i j =()

(5)

?=-=∏≠=1)()(0n

i

j j j i j i x x c x l c=

∏≠=-n

i

j j j

i

x x 0)

(1

,i=0,1,...,n.

总之得到:

()()n

n i i

i L x l x y ==∑

0().

n

j i j i j

j i

x x l x x x =≠-=-∏

(6)式为n 阶Lagrange 插值公式,其中,)

(x l i (i=0,1,…,n )称为n

阶Lagrange 插值的基函数。 3 二元拉格朗日插值方法

对于一元函数y=f(x),得到n+1个数据点(i x ,i y )(i=0,1,…,n),可由(6)、(7)式求得n 阶Lagrange 插值公式,然后求函数在y=f(x)在x 点的函数值。

对于二元函数(,)z f x y =,若知道数据点

,(,)i j i j z f x y =(i=1,…,m ,j=1,…,n ),可利用两次拉格朗日插值计算(,)z f x y =在点(x,y )的函数值,方法如下: (1)对每个

i

x ( i=1,…,m),以

j

y ( j=1,…,n )为插值节点,

ij

z

( j=1,…,n )为对应函数值,y 为插值变量,作一元函数插值得

i

u ( i=1,…,m); (2) 以

i

x ( i=1,…,m)为插值节点,i u

( i=1,…,m)为对应函数值,

x 为插值变量,作一元函数插值求得(x,y )点的值z 。 四 FORTRAN 编程

(6)

(7)

a)开发环境

使用Compaq Visual Fortran 6.6进行程序设计,编程实现二元拉格朗日插值算法。

b)使用说明

先编出一元拉格朗日差值算法子程序lagrange,然后编写二元拉格朗日插值算法程序lagrange2,其中两次调用lagrange子程序。

Lagrange(xa,ya,n,x,y)

n 整型变量,输入参数,节点个数

xa n个元素的一维实数型数组,输入参数,存放自变量插值节点x i(i=1,…,n)

ya n个元素的一维实数型数组,输入参数,存放函数值(y1,…,y n)T

x 实型变量,输入参数,插值自变量

y 实型变量,输出参数,所求值

****************************************************** Lagrange2(x1a, x2a,ya,m,n,x1, x2,y)

m 整型变量,输入参数,x自变量节点个数

n 整型变量,输入参数,y自变量节点个数

x1a m个元素的一维实数型数组,输入参数,存放x自变量插值节点x i(i=1,…,m)

x2a n个元素的一维实数型数组,输入参数,存放y自变量插值节点y j(j=1,…,n)

x1 实型变量,输入参数,插值x自变量

x2 实型变量,输入参数,插值y自变量

ya m×n个元素的二维实数型数组,输入参数,存放(x i,y j)(i=1,…,m,j=1,…,n)函数值(y1,…,y n)T

y 实型变量,输出参数,所求插值结果

c)程序代码

Lagrange子程序

SUBROUTINE lagrange(xa,ya,n,x,y)

integer n,nmax

real x,y,xa(n),ya(n),l(n),dy

parameter(nmax=10)

integer i,j

l(1)=1

do j=2,n

l(1)=l(1)*(x-xa(j))/(xa(1)-xa(j)) !计算l1(x) end do

do i=2,n-1

l(i)=1

do j=1,i-1

l(i)=l(i)*(x-xa(j))/(xa(i)-xa(j))

end do

do j=i+1,n

l(i)=l(i)*(x-xa(j))/(xa(i)-xa(j)) !计算li(x),1

end do

end do

l(n)=1

do j=1,n-1

l(n)=l(n)*(x-xa(j))/(xa(n)-xa(j)) !计算ln(x)

end do

y=0

do i=1,n

y=y+l(i)*ya(i) !计算y=求和li(x)*ya(i)

end do

end subroutine lagrange

Lagrange 子程序说明:

已知数据点(xa(i),ya(i))(i=0,1,…,n),求插值多项式

()(i)

i y l x ya =*∑,其中0

().

n

j i j i j

j i

x x l x x x =≠-=-∏

先求12((j))

()(xa(1)(j))

n

x xa l x xa -=-∏,程序中l(n)为一维实型数组,存放

插值基函数,l(1)即为1()l x ; 然后,对于i=2, …,n-1,

1

11((j))((j))

(i)()[](xa()(j))(xa()(j))

i n

i j j i x xa x xa l l x i xa i xa -==+--==?--∏∏

最后计算1

1

((j))

()()(xa(n)(j))n n j x xa l n l x xa -=-==-∏

求和得到

()(i)

i y l x ya =*∑ (i=1,2,…,n )

对于每一个自变量x 输入参数,可以得到一个y 输出参数。

Lagrange2子程序

SUBROUTINE lagrange2(x1a,x2a,ya,m,n,x1,x2,y) integer n,nmax,m,mmax

real x1,x2,y,x1a(m),x2a(n),ya(m,n) parameter(nmax=100,mmax=100) integer i,j

real ym(mmax),yn(nmax) do i=1,m do j=1,n

yn(j)=ya(i,j) !对每一个xi,以(yj,zij )作为插值节点 end do

call lagrange(x2a,yn,n,x2,ym(i)) !求得(xi,y )的函数值ui end do

call lagrange(x1a,ym,m,x1,y) !以(xi,ui )插值点求(x,y )函数值 end subroutine lagrange2

Lagrange2子程序说明:

首先对每一个x1=x1a(i)(i=1,2,…,m),也就是x=xi,以(yj,zij)作为插值节点,得到插值多项式,以y为变量,可求得(xi,y)点的函数值ui,程序中调用一次lagrange子程序,以x2a (即为yj,j=1,2,…,n)、yn(即为zij, j=1,2,…,n)输入得到x2=y点(对应点(xi,y))的值ym(i)(即为ui) (i=1,2,…,m);

然后以(xi,ui) (i=1,2,…,m)为插值点,得到插值多项式,以x为变量,求得点(x,y)点的函数值z=f(x,y),程序中再次调用lagrange子程序,以x1a(即为xi,i=1,2,…,m)、ym(即为ui, i=1,2,…,m)输入得到x1=x点(对应点(x,y))的值y,也就是z=f(x,y)使用二元拉格朗日插值法的计算值。

五举例验证

Lagrange子程序参考了参考书《Visual Basic常用数值算法集》(何光渝,北京航科学出版社,2002)73页~75页,但不相同,参考书中使用了Neville算法,而以上子程序则是使用的拉格朗日插值得基本定义算法。

与参考书75页使用相同的例子进行验证,f(x)=sinx,验证程序如下(见附件la2.f90):

图1 验证一元拉格朗日算法f(x)=sinx

program l1

parameter(n=10,pi=3.1415926)

real dy

dimension xa(n),ya(n)

write(*,*)'y=sin(x) 0

write(*,*)'sin function from 0 to PI'

do i=1,n

xa(i)=i*pi/n ! 输入xi

ya(i)=sin(xa(i)) ! 输入yi

end do

write(*,'(T10,A1,T20,A4,T28,A12,T46,A5)')'x','f(x)','interpolated','error' do i=1,10

x=(-0.05+i/10.0)*pi ! 自变量x

f=sin(x) ! f(x)真实值

call lagrange(xa,ya,n,x,y) !调用子程序lagrange,求解y dy=y-f !dy为误差,即插值求解值与真实值之差write(*,'(1x,3F12.6,F15.6)')x,f,y,dy

end do

end program

运行后,得到:

图2 验证f(x)=sinx结果

以上结果与参考书(下图)进行对照

图3 参考书f(x)=sinx验证结果(P76~P77)

通过对比可以看到,误差数量级差不多,说明本子程序是可行的。

同样对f(x)=e^x进行验证,只需将以上程序中的sin更改为exp,变量x进行相应更改(见附件la1.f90);

图4 f(x)=e^x验证程序

图5 f(x)=e^x验证结果

图6 参考书77页f(x)=e^x验证结果

对比两个验证结果可以看到参考书的插值程序计算的误差比较小(10-11~10-8),而本实验的对f(x)=e^x验证结果误差较大(10-6~10-5,其中误差为0的除外),说明Neville插值方法改善了精度。

下面进行二元拉格朗日插值计算验证,同样实用参考书P104的例子进行验证,函数为f(x,y)=e y sinx,0

编写验证程序如下(见附件l2.f90):

program l2

parameter(n=5,pi=3.1415926)

real dy

dimension x1a(n),x2a(n),ya(n,n)

write(*,*)'f(x)=sin(x)e^y 0

write(*,*)'f(x)=sinx*e^y function from 0 to PI,0 to 1'

do i=1,n

x1a(i)=i*pi/n !输入xi

do j=1,n

x2a(j)=1.0*j/n !输入yj

ya(i,j)=sin(x1a(i))*exp(x2a(j)) !输入ya(i,j),即zij

end do

end do

write(*,'(T10,A1,T22,A,T32,A,T40,A,T58,A)')'x','y','f(x)','interpolated','error'

do i=1,5

x1=(-0.1+i/5.0)*pi !赋予自变量x值

do j=1,5

x2=-0.1+j/5.0 !赋予自变量y值

f=sin(x1)*exp(x2) !f(x,y)真实值

call lagrange2(x1a,x2a,ya,n,n,x1,x2,y) !调用程序lagrange2计算z=f(x,y)

dy=y-f !计算二元拉格朗日插值法的误差

write(*,'(1x,4F12.6,F14.7)')x1,x2,f,y,dy !输出

end do

write(*,*)'*************************************************************' end do

end program l2

程序中输入数据节点(xi,yj)及函数值zij,调用lagrange2子程序进行求解(x,y)点的函数值z(即为程序中的y),其中x≠xi,y≠yj,

函数在(x,y)处的真实值为f(x,y)(程序中为f),并求解插值

法的误差dy=z-f。

图7 f(x)=sin(x)e^y验证程序运行后得到的验证结果:

图8 二元拉格朗日插值法输出结果

图9 参考书f(x)=sin(x)e^y 验证结果

参考书给自变量赋值4×4个点,本实验赋值了5×5个数据点,可看出该实验程序计算的误差值比参考书误差值小,取得了良好的效果。

最后来用几个其他函数进行验证。 1、f(x,y)=(x+y)3

程序见图10(见附件l22.f90),验证结果见图11。

图10 二元拉格朗日插值法计算程序:f(x,y)=(x+y)3

图11 验证结果:f(x,y)=(x+y)3

2、f(x,y)=(x+y5)sin(xy)

程序见图12(见附件l23.f90),验证结果见图13。

图12 二元拉格朗日插值法计算程序:f(x,y)= (x+y5) sin(xy)

图13 验证结果:f(x,y)= (x+y5) sin(xy)

由以上验证结果可以看出用二元拉格朗日插值法计算较简单的函数f(x,y)=(x+y)3值时误差较小(10-6),而用其计算较复杂的函数f(x,y)= (x+y5) sin(xy)时,误差较大(10-3~10-2),这也是符合插值法计算的原理的。

六实验总结

通过本次的程序语言实验设计,对Fortran程序语言有了一定的认识和了解,能够编写较简单的程序,实现一定的功能;用Fortran 编程实现了一元及二元拉格朗日插值法求解函数在某点的值。

学习一种程序语言是充满乐趣和挑战的,在实际工作中将会得到更大的应用,X所XXX研究员给我们介绍了丰富且实用的面向科学计算的软件包,开拓了我们的视野,让我们能认识到还有很多很多好用、实用的知识需要去学习和掌握。

参考文献:

[1] 白云,李学哲,陈国新,贾波等,FORTRAN 95程序设计,清华

大学出版社,2011

[2] 何光渝等,Visual Basic常用数值算法集,科学出版社,2002

[3] 颜庆津等,数值分析,北京航空航天大学出版社,1999

[4] 何光渝,高永利等,Visual Fortran常用数值算法集,科学出版社,

2002

数值分析拉格朗日插值法上机实验报告

课题一:拉格朗日插值法 1.实验目的 1.学习和掌握拉格朗日插值多项式。 2.运用拉格朗日插值多项式进行计算。 2.实验过程 作出插值点(1.00,0.00),(-1.00,-3.00),(2.00,4.00)二、算法步骤 已知:某些点的坐标以及点数。 输入:条件点数以及这些点的坐标。 输出:根据给定的点求出其对应的拉格朗日插值多项式的值。 3.程序流程: (1)输入已知点的个数; (2)分别输入已知点的X坐标; (3)分别输入已知点的Y坐标; 程序如下: #include #include #include 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<=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)插值公式是多项式中的重要公式之一,在理论和实践中都有着广泛的应用.本文阐述了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

拉格朗日插值实验报告

实验名称: 实验一拉格朗日插值 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 o ,x 1,…,x wb 上分别取 值 y o ,y 1,…,y n 。目的是要在一个性质优良、便于计算的插值函数类 ①中,求一简单函数P(x), 满足插值条 件P(X i )=y i (i=0,1,…”n)而在其他点x I 上,作为f(x)近似值。求插值函数P(x)的 方法称为插值法。在本实验中,采用拉格朗日插值法。 ①分段低次插值 当给定了 n+1个点X 0VXK …

实验一拉格朗日插值法

实验一 拉格朗日插值法 基本信息 实验课程:计算方法 设课形式:非独立 课程学分:3 实验项目:拉格朗日插值法 项目类型:基础 项目学时:2 目的和要求 该实验在计算机上实现拉格朗日插值法并进行验证。要求对拉格朗日插值法的流程进行分析,设计算法,并使用一种编程语言实现,最后通过具体例子进行验证,得到正确结果。 实验条件 装有编程语言的计算机一台、项目相关材料。 实验内容和原理或涉及的知识点 公式: 基点x i 的n 次插值基函数( i=0,1,…,n): n i x x x x x x x x x x x x x x x x x x x x x x x x x l j i j n i j j n i i i i i i i n i i i ,,1,0) ())(())(() ())(())(()(011101110 =--∏ =----------= ≠=+-+- n 次拉格朗日插值多项式: ∑∏ =≠=--=+++=n i n i j j j i j i n n n x x x x y x l y x l y x l y x P 0 01100)()()()(

流程图: 输入及x y x i i i n ,,,,,=012 P i ??00 ,L ?1 L L x x x x j i j j n j i ?--=≠()() ,,,() 01 P P y L i ?+i i ?+1 开始T F 输出P 结束 i n = 验证例子 已知如下的函数表,试编写程序,用拉格朗日插值多项式求0.5,0.7,0.85三点处的函数值。 x 0.40.550.80.91y 0.410750.578150.88811 1.02652 1.1752 实验结果: 插值点的个数 m=3

数值计算方法—拉格朗日插值

数值计算方法作业 专业:测控1002 学号:10540226 姓名:崔海雪

拉格朗日插值的算法及应用 【摘要】 本文简介拉格朗日插值,它的算法及程序和拉格朗日在实际生活中的运用。运用了拉格朗日插值的公式,以及它在MATLAB 中的算法程序,并用具体例子说明。拉格朗日插值在很多方面都可以运用,具有很高的应用价值。 【关键词】 拉格朗日;插值;公式;Matlab 算法程序; 一、绪论 约瑟夫·拉格朗日(Joseph Louis Lagrange),法国数学家、物理学家。他在数学、力学和天文学三个学科领域中都有历史性的贡献,其中尤以数学方面的成就最为突出。拉格朗日对流体运动的理论也有重要贡献,提出了描述流体运动的拉格朗日方法。数据建模有两大方法:一类是插值方法,另一类是拟合函数一般的说,插值法比较适合数据准确或数据量小的情形。然而Lagrange 插值有很多种,1阶,2阶,…n 阶。我们可以利用拉格朗日插值求方程,根据它的程序求原方程的图像。下面我具体介绍分析一下拉格朗日插值的算法设计及应用。 二、正文 1、基本概念 已知函数y=f(x)在若干点i x 的函数值i y =()i x f (i=0,1,???,n )一个差值问题就是求一“简单”的函数p(x):p(i x )=i y ,i=0,1,???,n, (1) 则p(x)为f(x)的插值函数,而f(x)为被插值函数会插值原函数,0x ,1x ,2x ,...,n x 为插值节点,式(1)为插值条件,如果对固定点-x 求f(-x )数值解,我们称- x 为一个插值节点,f(-x )≈p(-x )称为-x 点的插值,当-x ∈[min(0x ,1x ,2x ,...,n x ),max(0x ,1x ,2x ,...,n x )]时,称为内插,否则称为外插式外推,特别地,当p(x)为不超过n 次多项式时称为n 阶Lagrange 插值。 2、Lagrange 插值公式 (1)线性插值)1(1L 设已知0x ,1x 及0y =f(0x ) ,1y =f(1x ),)(1x L 为不超过一次多项式且满足 )(01x L =0y ,)(11x L =1y ,几何上,)(1x L 为过(0x ,0y ) ,(1x ,1y )的直线,从而得到 )(1x L =0y +0101x x y y --(x-0x ). (2)

拉格朗日插值法理论及误差分析

浅析拉格朗日插值法 目录: 一、 引言 二、 插值及多项式插值的介绍 三、 拉格朗日插值的理论及实验 四、 拉格朗日插值多项式的截断误差及实用估计式 五、 参考文献 一、引言 插值在数学发展史上是个古老问题。插值是和拉格朗日(Lagrange )、牛顿(Newton )、高斯(Gauss )等著名数学家的名字连在一起的。在科学研究和日常生活中,常常会遇到计算函数值等一类问题。插值法有很丰富的历史渊源,它最初来源人们对天体研究——有若干观测点(我们称为节点)计算任意时刻星球的位置(插值点和插值)。现在,人们在诸如机械加工等工程技术和数据处理等科研都有很好的应用,最常见的应用就是气象预报。插值理论和方法能解决在实际中当许多函数表达式未知或形式复杂,如何去构造近似表达式及求得在其他节点处的值的问题。 二、插值及多项式插值 1、插值问题的描述 设已知某函数关系()y f x =在某些离散点上的函数值: 插值问题:根据这些已知数据来构造函数()y f x =的一种简单的近似表达式,以便于计算点,0,1,,i x x i n ≠= 的函数值()f x ,或计算函数的一阶、二阶导数值。 x 0x 0 y y 1 y 1 n y -n y 1 x 1 n x -n x

2、插值的几何意义 插值的几何意义如图1所示: 图1 3、多项式插值 3.1 基本概念 假设()y f x =是定义在区间,a b ????上的未知或复杂函数,但一直该函数在点01n a x x x b ≤<<<≤ 处的函数值01,,n y y y 。找一个简单的函数,例如函数 ()P x ,使之满足条件 (),0,1,2,, i P x y i n == (3.1) 通常把上述01n x x x <<< 称为插值节点,把()P x 称为()f x 的插值多项式,条件(3.1)称为插值条件,并把求()P x 的过程称为插值法。 3.2 插值多项式的存在性和唯一性 如果插值函数是如下m 次的多项式: 1 011()m m m m m P x a x a x a x a --=+++ 那么插值函数的构造就是要确定()m P x 表达式中的m+1个系数 011,,,m m a a a a - 。由于插值条件包含n+1独立式,只要m=n 就可证明插值函数多项式是唯一存在。 实际上,由n+1个插值条件可得

插值法实验报告

实验二插值法 1、实验目的: 1、掌握直接利用拉格郎日插值多项式计算函数在已知点的函数值;观察拉格郎日插值的龙格现象。 2、了解Hermite插值法、三次样条插值法原理,结合计算公式,确定函数值。 2、实验要求: 1)认真分析题目的条件和要求,复习相关的理论知识,选择适当的解决方案和算法; 2)编写上机实验程序,作好上机前的准备工作; 3)上机调试程序,并试算各种方案,记录计算的结果(包括必要的中间结果); 4)分析和解释计算结果; 5)按照要求书写实验报告; 3、实验内容: 1) 用拉格郎日插值公式确定函数值;对函数f(x)进行拉格郎日插值,并对f(x)与插值多项式的曲线作比较。 已知函数表:(0.56160,0.82741)、(0.56280,0.82659)、(0.56401,0.82577)、(0.56521,0.82495)用三次拉格朗日插值多项式求x=0.5635时函数近似值。 2) 求满足插值条件的插值多项式及余项 1) 4、题目:插值法 5、原理: 拉格郎日插值原理: n次拉格朗日插值多项式为:L n (x)=y l (x)+y 1 l 1 (x)+y 2 l 2 (x)+…+y n l n (x)

n=1时,称为线性插值, L 1(x)=y (x-x 1 )/(x -x 1 )+y 1 (x-x )/(x 1 -x )=y +(y 1 -x )(x-x )/(x 1 -x ) n=2时,称为二次插值或抛物线插值, L 2(x)=y (x-x 1 )(x-x 2 )/(x -x 1 )/(x -x 2 )+y 1 (x-x )(x-x 2 )/(x 1 -x )/(x 1 -x 2 )+y 2 (x -x 0)(x-x 1 )/(x 2 -x )/(x 2 -x 1 ) n=i时, Li= (X-X0)……(X-X i-1)(x-x i+1) ……(x-x n) (X-X0)……(X-X i-1)(x-x i+1) ……(x-x n) 6、设计思想: 拉格朗日插值法是根据n + 1个点x0, x1, ... x n(x0 < x1 < ... x n)的函数值f (x0), f (x1) , ... , f (x n)推出n次多項式p(x),然后n次多項式p (x)求出任意的点x对应的函数值f (x)的算法。 7、对应程序: 1 ) 三次拉格朗日插值多项式求x=0.5635时函数近似值 #include"stdio.h" #define n 5 void main() { int i,j; float x[n],y[n]; float x1; float a=1; float b=1; float lx=0; printf("\n请输入想要求解的X:\n x="); scanf("%f",&x1); printf("请输入所有点的横纵坐标:\n"); for(i=1;i

实验1拉格朗日插值与牛顿插值

数学与计算机学院上机实践报告 课程名称:计算方法A年级:上机实践成绩: 指导教师:姓名: 上机实践名称:拉格朗日插值和牛顿插值法学号:上机实践日期: 上机实践编号:1上机实践时间: 一、目的 1.通过本实验加深对拉格朗日插值和牛顿插值法构造过程的理解; 2.能对上述两种插值法提出正确的算法描述编程实现。 二、内容与设计思想 自选插值问题,编制一个程序,分别用拉格朗日插值法和牛顿插值法求解某点的函数近似值。(从课件或教材习题中选题) 已知y=f( 三、使用环境 操作系统:windows XP 软件环境:Microsoft Visual C++6.0 四、核心代码及调试过程 (一) 拉格朗日插值法: lude double product(double *p,double newx,int k,int n); main() { /*divisor,dividend double x[10]={0.10,0.15,0.25,0.40,0.50,0.57,0.70,0.85,0.93,1.00}; double newx[3]={0.45,0.6,0.80},divisor,dividend,quotient,result; double y[10]={0.904837,0.860708,0.778801,0.670320,0.606531,0.565525,0.496585,0.427415,0.394554; int i,th; for(th=0;th<3;th++) { result=0; for(i=0;i<10;i++)

{ dividend=product(x,newx[th],i,9); divisor=product(x,x[i],i,9); quotient=dividend/divisor; result+=quotient*y[i]; } printf("%lf处的近似值为%lf\n",newx[th],result); } } double product(double *p,double newx,int k,int n) { int cycle_times; double result=1; for(cycle_times=0;cycle_times<=n;cycle_times++) if(cycle_times!=k) result=result*(newx-p[cycle_times]); return result; } (二)牛顿插值法: #include #define total_points 10 void fill_in_the_blank(double *p,int x,int y); double newton(double (*p)[total_points+1],double newx); main() { double table[total_points][total_points+1], newx; int x,y; printf("Please notice (x,y) is from (x1,y1) to (x%d,y%d)!\n",total_points,total_points); for(x=0;xy) fill_in_the_blank(table,x,y); } printf("input a number you want to calculate:"); scanf("%lf",&newx); printf(" the result is:%lf\n",newton(table,newx)); } void fill_in_the_blank(double (*p)[total_points+1],int x,int y) { double diff_up,diff_down; diff_up=*(*(p+x)+y-1)-*(*(p+x-1)+y-1); diff_down=*(*(p+x))-*(*(p+x-y+1)); *(*(p+x)+y)=diff_up/diff_down; }

计算方法上机实验报告——拉格朗日插值问题

计算方法上机实验报告——拉格朗日插值问题 一、方法原理 n次拉格朗日插值多项式为:Ln(x)=y0l0(x)+y1l1(x)+y2l2(x)+…+ynln(x) n=1时,称为线性插值,L1(x)=y0(x-x1)/(x0-x1)+y1(x-x0)/(x1-x0)=y0+(y1-x0)(x-x0)/(x1-x0) n=2时,称为二次插值或抛物线插值,精度相对高些 L2(x)=y0(x-x1)(x-x2)/(x0-x1)/(x0-x2)+y1(x-x0)(x-x2)/(x1-x0)/(x1-x 2)+y2(x-x0)(x-x1)/(x2-x0)/(x2-x1) 二、主要思路 使用线性方程组求系数构造插值公式相对复杂,可改用构造方法来插值。 对节点xi(i=0,1,…,n)中任一点xk(0<=k<=n)作一n次多项式lk(xk),使它在该点上取值为1,而在其余点xi(i=0,1,…,k-1,k+1,…,n)上为0,则插值多项式为Ln(x)=y0l0(x)+y1l1(x)+y2l2(x)+…+ynln(x) 上式表明:n个点xi(i=0,1,…,k-1,k+1,…,n)都是lk(x)的零点。可求得lk 三.计算方法及过程:1.输入节点的个数n 2.输入各个节点的横纵坐标 3.输入插值点 4.调用函数,返回z 函数语句与形参说明 程序源代码如下: 形参与函数类型 参数意义 intn 节点的个数 doublex[n](double*x) 存放n个节点的值 doubley[n](double*y) 存放n个节点相对应的函数值 doublep 指定插值点的值 doublefun() 函数返回一个双精度实型函数值,即插值点p处的近似函数值 #include #include usingnamespacestd; #defineN100 doublefun(double*x,double*y,intn,doublep); voidmain() {inti,n; cout<<"输入节点的个数n:"; cin>>n;

数值分析实验一——拉格朗日插值算法报告

拉格朗日插值算法的实现 实验报告 姓名:** 年级:****专业:计算机科学与技术科目:数值分析题目:拉格朗日插值算法的实现 实验时间: 2014年5月27日实验成绩: 实验教师: 一、实验名称:拉格朗日插值算法的实现 二、实验目的: a. 验证拉格朗日插值算法对于不同函数的插值 b. 验证随着插值结点的增多插值曲线的变化情况。 三、实验内容: 拉格朗日插值基函数的一般形式: 也即是: 所以可以得出拉格朗日插值公式的一般形式: 其中, n=1时,称为线性插值,P1(x) = y0*l0(x) + y1*l1(x) n=2时,称为二次插值或抛物插值,精度相对高些,P2(x) = y0*l0(x) + y1*l1(x) + y2*l2(x) 四、程序关键语句描写 double Lagrange(int n,double X[],double Y[],double x) { double result=0; for (int i=0;i

for(int j=0;j #include using namespace std; int main() { double Lagrange(int n,double X[],double Y[],double x); //插值函数double x;//要求插值的x的值 double result;//插值的结果 char a='n'; double X[20],Y[20]; do { cout<<"请输入插值次数n的值:"<>n; cout<<"请输入插值点对应的值及函数值(xi,yi):"<>X[k]>>Y[k]; } cout<<"请输入要求值x的值:"<>x; result=Lagrange(n,X,Y,x); cout<<"由拉格朗日插值法得出结果:"<>a; }while(a=='yes'); return 0; }

插值算法之拉格朗日插值

记一下拉格朗日插值公式的推导和一些要点【这里说的都是二维插值,多维上的以此类推】 1、插值问题:在做实验的过程中,往往得到一堆离散的数据,现在想用数学公式模拟这堆离散数据。怎么办,数学家们提出了插值问题。插值问题的提法是这样的给定一堆数据点(x0, y0), (x1, y1), (x2, y2)...(xn, yn),要求一个函数y = f(x) ,要求该函数经过上面所有的数据点。 2、多项式插值及其唯一性:在所有的函数中,多项式函数是最简单的函数,所以只要是人就会想到用多项式函数来作为插值函数,好,以上给定了n+1个点,现在要求一个n次多项式y = an * x^n + ... a1 * x + a0, 使它们经过这n+1个点;通过范德蒙行列式和克莱姆法则,可以判定如果这n+1个点的x值各不相同,那么这个多项式是唯一的。结果唯一,但是用直接法很不好求。现在用别的办法来求之。这就是:拉格朗日多项式 3、拉格朗日多项式的构造,以四个点为例子进行说明 由于函数经过4个点(x0, y0),(x1, y1),(x2, y2),(x3, y3),所以可以设函数为: f(x) = b0(x) * y0 + b1(x) * y1 + b2(x) * y2 + b3(x) * y3 注意:b0(x),...,b3(x)都是x的3次多项式,称之为拉格朗日插值基函数。 由于要求当x为x0时候,f(x) = y0, 所以最简单的做法就是让b0(x0) = 1, b1(x0) = b2(x0) = b3(x0) = 0; 同理可知,在x1,x2,x3点上,插值基函数的值构造如下:

b0(x) b1(x) b2(x) b3(x) x=x0 1 0 0 0 x=x1 0 1 0 0 x=x2 0 0 1 0 x=x3 0 0 0 1 问题1、根据这些值来确定b0(x)的表达式, 由于b0(x1) = b0(x2) = b0(x3) = 0,所以x1, x2, x3是b0(x)的零点,由于b0(x)是三次多项式,所以设 b0(x) = c0 * (x-x1) * (x-x2) * (x-x3) 由于b0(x0) = 1,所以1 = c0 * (x0-x1) * (x0-x2) * (x0-x3) 得到c0 = 1/[(x0-x1)(x0-x2)(x0-x3)] 所以:b0(x) = (x-x1)*(x-x2)*(x-x3)/[(x0-x1)*(x0-x2)*(x0-x3)] 同理可求b1(x)、b2(x),略 问题2、根据上面的表格说明插值基函数的一个性质:无论x取和值,它们的和都为1.【这

拉格朗日插值法1

拉格朗日抛物线插值法 1、定义若多项式l j (j=0,1,2...n )在n+1个节点x 0

end end S=t*y(k)+s; end; yi=s; 3、例题 1)计算115 解: L 2(x)=0201021))(())((y x x x x x x x x ----+ 1201020) )(())((y x x x x x x x x ---- + 2201010) )(())((y x x x x x x x x ---- = 10)44(21)144)(121(?-?---x x + 11) 23(21)144)(100(?-?--x x + 1223 44)144)(100(??--x x L 2(115)= 10)44(21)29(6?-?--?-x + 11) 23(21)29(15?-?-? + 1223 44)6(15??-? ≈10.7228 在Matlab 窗口输入

对拉格朗日插值法与牛顿插值法的学习和比较

对拉格朗日插值法与牛顿插值法的学习和比较 摘要:根据对拉格朗日插值法和牛顿插值法的理解,本文主要介绍了拉格朗日插值法和牛顿插值法的相关内容以及它们的区别。 关键词:拉格朗日插值法;牛顿插值法 The leaning and comparison of the Lagrange interpolation and Newton interpolation Abstract: Based on the understanding of the Lagrange interpolation and Newton interpolation ,this paper mainly describes some related knowledge as well as the difference between these two methods. Keywords: Lagrange interpolation ; Newton interpolation 前言 在工程和科学研究中出现的函数是多种多样的。常常会遇到这样的情况:在某个实际问题中,虽然可以断定所考虑的函数)(x f 在区间],[b a 上存在且连续,但却难以找到它的解析表达式,只能通过实验和观测得到在有限个点上的函数值(即一张函数表)。显然,要利用这张函数表来分析函数)(x f 的性态,甚至直接求出其他一些点上的函数值可能是非常困难的。面对这些情况,总希望根据所得函数表(或结构复杂的解析表达式),构造某个简单函数)(x P 作为)(x f 的近似。这样就有了插值法,插值法是解决此类问题目前常用的方法。 如设函数)(x f y =在区间],[b a 上连续,且在1+n 个不同的点b x x x a n ≤≤,,,10 上分别取值n y y y ,,,10 。 插值的目的就是要在一个性质优良、便于计算的函数类Φ中,求一简单函数)(x P ,使 ),,1,0()(n i y x P i i == 而在其他点i x x ≠上,作为)(x f 的近似。 通常,称区间],[b a 为插值区间,称点n x x x ,,,10 为插值节点,称式i i y x P =)(为插值条件,称函数类Φ为插值函数类,称)(x P 为函数)(x f 在节点n x x x ,,,10 处的插值函数。求插值函数)(x P 的方法称为插值法。 插值函数类Φ的取法不同,所求得的插值函数)(x P 逼近)(x f 的效果就不同。它的选择取决于使用上的需要,常用的有代数多项式、三角多项式和有理函数等。当选用代数多项式作为插值函数时,相应的插值问题就称为多项式插值。本文讨论的拉格朗日插值法与牛顿插值法就是这类插值问题。 在多项式插值中,最常见、最基本的问题是:求一次数不超过n 的代数多项式 n n x a x a a x P +++= 10)( 使),,1,0()(n i y x P i i n ==,其中,n a a a ,,,10 为实数。

拉格朗日插值法C语言的实现

实验 一 .拉格朗日插值法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 #include #include 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++) {

计算方法实验四拉格朗日插值实验报告

实验报告 学院:电子信息工程 实验课程:计算方法 学生姓名: 学号: 专业班级:通信工程17-3班级

实验四 Lagrange 插值 1 目的与要求 (1)进一步理解和掌握Lagrange 插值的数值算法。 (2)能够根据给定的函数值表求出插值多项式和函数在某一点的近似值以解决实际问题 2 实验内容 已知函数表如下,通过编制程序,试用拉格朗日插值多项式求0.5,0.7,0.85三点处的近似函数值。 3 实验原理 拉格朗日插值多项式: 4 程序设计 (1)流程图 拉格朗日插值程序流程图 ∑=== n i 0 i i i ) 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 #include #define n 5 double 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

{ m=1.0; for(l=0;l

拉格朗日插值法理论及误差分析

目录: 一、 引言 二、 插值及多项式插值的介绍 三、 拉格朗日插值的理论及实验 四、 拉格朗日插值多项式的截断误差及实用估计式 五、 参考文献 一、引言 插值在数学发展史上是个古老问题。插值是和拉格朗日(Lagrange )、牛顿(Newton )、高斯(Gauss )等著名数学家的名字连在一起的。在科学研究和日常生活中,常常会遇到计算函数值等一类问题。插值法有很丰富的历史渊源,它最初来源人们对天体研究——有若干观测点(我们称为节点)计算任意时刻星球的位置(插值点和插值)。现在,人们在诸如机械加工等工程技术和数据处理等科研都有很好的应用,最常见的应用就是气象预报。插值理论和方法能解决在实际中当许多函数表达式未知或形式复杂,如何去构造近似表达式及求得在其他节点处的值的问题。 二、插值及多项式插值 1、插值问题的描述 设已知某函数关系()y f x =在某些离散点上的函数值: 插值问题:根据这些已知数据来构造函数()y f x =的一种简单的近似表达式,以便于计算点,0,1,,i x x i n ≠=的函数值()f x ,或计算函数的一阶、二阶导数 值。 2、插值的几何意义 x x 0 y y 1 y 1 n y -n y 1 x 1 n x -n x

插值的几何意义如图1所示: 图1 3、多项式插值 基本概念 假设()y f x =是定义在区间,a b ????上的未知或复杂函数,但一直该函数在点01n a x x x b ≤<< <≤处的函数值01,,n y y y 。找一个简单的函数,例如函数 ()P x ,使之满足条件 (),0,1,2, ,,i P x y i n == () 通常把上述01n x x x << < 称为插值节点,把()P x 称为()f x 的插值多项 式,条件()称为插值条件,并把求()P x 的过程称为插值法。 插值多项式的存在性和唯一性 如果插值函数是如下m 次的多项式: 1011()m m m m m P x a x a x a x a --=++ + 那么插值函数的构造就是要确定()m P x 表达式中的m+1个系数 011,, ,m m a a a a -。由于插值条件包含n+1独立式,只要m=n 就可证明插值函数多 项式是唯一存在。 实际上,由n+1个插值条件可得

Lagrange插值程序1

在Matlab中,可以编写如下程序来利用Lagrange插值公式进行计算: function f=Lagrange(x,fx,inx) n=length(x);m=length(inx); for i=1:m; z=inx(i); s=0.0; for k=1:n p=1.0; for j=1:n if j~=k p=p*(z-x(j))/(x(k)-x(j)); end end s=p*fx(k)+s; end f(i)=s; end plot(x,fx,'O',inx,f) x=[1:12] fx=[12 234 34 -1 34 2 5 23 34 9 45 23] xi=[1:0.2:12] Lagrange(x,fx,xi) 得出结果: 12.0000 -60.5937 18.2765 124.9778 202.5952 234.0000 223.3757 184.1249 131.4738 78.4253 34.0000 2.9467 -13.6885 -17.5810 -12.0379 -1.0000 11.7556 23.1624 31.1611 34.7730 34.0000 29.6054 22.8332 15.1153 7.8099 2.0000 -1.6307 -2.8397 -1.7907 1.0404 5.0000 9.4024 13.6643 17.4033 20.4834 23.0000 25.2037 27.3769 29.6858 32.0400 34.0000 34.7742 33.3426 28.7320 20.4439 9.0000 -3.4848 -12.8605 -12.8873 4.0592 4 5.0000 112.3788 197.1817 267.9699 254.3439 23.0000

拉格朗日插值法课程设计

摘要 插值法是函数逼近的一种重要方法,是数值计算的基本课题.数学上来说,拉格朗日插值法可以给出一个恰好穿过二维平面上若干个已知点的多项式函数.Lagrange 插值是n次多项式插值,其成功地用构造插值基函数的方法,解决了求n次多项式插值函数问题.Lagrange插值的基本思想是将待求的n次多项式插值函数改写成另一种表示方式,再利用插值条件确定其中的待定函数,从而求出插值多项式. 拉格朗日插值法是一种很实用的插值方法,可以应用在渔业资源评估中、化学中、工程中、工业中、机械设计与制造领域,以及计算机方面.本课题意在将拉格朗日插值法应用到实际中,主要通过程序的编写(有拉格朗日插值法的Matlab和C语言实现)将算法在计算机中实现,求得相应的解.进一步体现拉格朗日插值法在解决问题时的实际意义. 关键词插值基函数;插值多项式;Lagrange插值;算法

Abstract Interpolation 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 https://www.wendangku.net/doc/0218573994.html,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

相关文档
相关文档 最新文档