拉格朗日插值及牛顿插值方法-空间统计-空间分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

拉格朗日插值及牛顿插值
1.1.1 拉格朗日插值及牛顿插值
在数值分析中,拉格朗日(Lagrange)插值法是以法国十八世纪数学家约瑟夫·拉格朗日命名的一种多项式插值方法。

许多实际问题中都用函数来表示某种内在联系或规律,而不少函数都只能通过实验和观测来了解。

如对实践中的某个物理量进行观测,在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值。

这样的多项式称为拉格朗日(插值)多项式。

数学上来说,拉格朗日插值法可以给出一个恰好穿过二维平面上若干个已知点的多项式函数。

设函数在区间[a,b]上n+1个互异节点01,,,n x x x 上的函数值分别为01,,,n y y y ,求n 次插值多项式(x)n P ,满足条件
(x )y ,j 0,1,,n n j j P ==
令00110L y (x)y (x)y (x)y (x)n n n n i i i l l l l ==++
+=∑ (*) 其中01(x),(x),(x)n l l l 为以01,,,n x x x 为节点的n 次插值基函数,则L (x)n 是一次数不超过n 的多项式,且满足
L (x )y ,j 0,1,,n n j j ==
再由插值多项式的唯一性,得
L (x)n n P ≡
(*)式表示的插值多项式称为拉格朗日插值多项式。

特别地,n=1时称为线性插值,n=2时称为二次插值。

值得注意的是,插值基函数01(x),(x)
,(x)n l l l 仅由插值节点01,,,n x x x 确定,与被插函数f(x)无关。

因此,若以01,,
,n x x x 为插值节点对函数f(x)1≡做插值多
项式,则由(*)式可得基函数的一个性质 0L (x)1n
i
i =≡∑
还应注意,对于插值节点01,,,n x x x ,只要求它们互异,与大小次序无关。

从以上的描述可以看出,利用插值基函数很容易得到拉格朗日插值多项式,公式结构紧凑,在理论分析中甚为方便,但当插值节点增减时全部插值基函数均要随之变化,整个公式也将发生变化,这在实际计算中是很不方便的。

为了克服这一缺点,提出了牛顿插值。

牛顿(Newton)插值通过求各阶差商,递推得到的一个公式:
f(x)N (x)R (x)n n =+
001001201010121N (x)f(x )f[x ,x ](x x )f[x ,x ,x ](x x )(x x )f[x ,x ,,x ](x x )(x x )(x x )(x x )n n n -=+-+--+
+---
-
011R (x)f[x,x ,x ,
,x ](x x )(x x )n n n n -=-- 其中000
f(x)f(x )f[x,x ]x x -=-是函数f(x)在区间[a,b]上的一阶差商,则 000f(x)f(x )f[x,x ](x x )=+-
同理由函数f(x)的二阶差商001011
f(x,x )f(x ,x )f[x,x ,x ]x x -=-可得 01011f[x,x ]f[x,x ]f[x,x ,x ](x x )=+-

般地,由函数f(x)的n+1阶差商0110101f[x,x ,x ,,x ]f[x,x ,x ,
,x ]f[x ,x ,,x ]x x n n n n
--=-可得 0101011f[x,x ,x ,,x ]f[x ,x ,,x ]f[x,x ,x ,,x ](x x )n n n n -=+-
可以看出,N (x)n 是关于x 的次数不超过n 的多项式,并且当x x i =时,有 R (x )0,i 0,1,
,n i n ==
则 (x )f(x ),i 0,1,,n i i N n ==
(x)n N 满足插值条件,称为牛顿插值多项式。

【案例错误!文档中没有指定样式的文字。

-1】
利用R语言和模拟数据,运用拉格朗日插值方法进行计算插值。

如:已知==-=的值,通过拉格朗日插值法,分别求点函数f(x)和点f(1)6,f(2)2,f(3)9
、、的值。

f(2.5)f(2.6)f(2.7)
鉴于拉格朗日插值和牛顿插值得出的结果是一致的,因此,下面只给出通过R语言实现拉格朗日插值的代码。

R代码如下:
LagrangePolynomial <- function(x,y) {
len = length(x)
if(len != length(y))
stop("length not equal!")
if(len < 2)
stop("dim size must more than 1")
#pretreat data abd alloc memery
xx <- paste("(","a -",x,")")
m <- c(rep(0,len))
#combin express
for(i in 1:len) {
td <- 1
tm <- "1"
for(j in 1:len) {
if(i != j) {
td <- td*(x[i] - x[j])
tm <- paste(tm,"*",xx[j])
}
}
tm <- paste(tm,"/",td)
m[i]<-tm #m[i] <- parse(text=tm)
}
#combin the exrpession
m <- paste(m,"*",y)
r <- paste(m,collapse="+")
#combin the function
fbody <- paste("{ return(",r,")}")
f <- function(a) {}
#fill the function's body
body(f) <- parse(text=fbody)
return(f)
}
a = 1:3
b = c(6, -2, 9)
f = LagrangePolynomial(a,b)
f(c(2.5,2.6,2.7))
、、。

通过R语言计算,得出的结果为f(2.5)=1.125f(2.6)=2.320f(2.7)=3.705。

相关文档
最新文档