f(x)=11+x2 f ( x ) = 1 1 + x 2
对某个多项式函数,已知有给定的k + 1个取值点:
(x0,y0),…,(xk,yk) ( x 0 , y 0 ) , … , ( x k , y k ) 其中 xj x j 对应着自变量的位置,而 yj y j 对应着函数在这个位置的取值。假设任意两个不同的xj都互不相同,那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为:
L(x)=∑j=0kyjlj(x) L ( x ) = ∑ j = 0 k y j l j ( x ) 其中每个 li(x) l i ( x ) 被称为拉格朗日基本多项式,也叫 拉格朗日插值基函数: lj(x)=∏i=0,i≠jkx−xixj−xi l j ( x ) = ∏ i = 0 , i ≠ j k x − x i x j − x i可见在函数两端有明显的龙格现象,验证了高次多项式插值函数存在的这个问题
在数值分析领域中,龙格现象是在一组等间插值点上使用具有高次多项式的多项式插值时出现的区间边缘处的振荡问题。 它是由卡尔·龙格(Runge)在探索使用多项式插值逼近某些函数时的错误行为时发现的。它表明使用高次多项式插值并不总能提高准确性。 该现象与傅里叶级数近似中的吉布斯现象相似。
计算区间 [−5,5] [ − 5 , 5 ] 内 101 101 个等距分布点处的误差绝对值的平均值
0.285755407117
埃尔米特插值是另一类插值问题,这类插值在给定的节点处,不但要求插值多项式的函数值与原函数值相同。同时还要求在节点处,插值多项式的一阶直至指定阶的导数值,也与被插函数的相应阶导数值相等,这样的插值称为埃尔米特(Hermite)插值。
Hermite插值在不同的节点,提出的插值条件个数可以不同,若在某节点 xi x i ,要求插值函数多项式的函数值,一阶导数值,直至 mi−1 m i − 1 阶导数值均与被插函数的函数值相同及相应的导数值相等。我们称 xi x i 为 mi m i 重插值点节,因此,Hermite插值应给出两组数,一组为插值点 {xi}ni=0 { x i } i = 0 n 节点,另一组为相应的重数标号 {mi}ni=0 { m i } i = 0 n 。 若 ∑i=0nmi=N+1 ∑ i = 0 n m i = N + 1 ,这就说明了给出的插值条件有 N+1 N + 1 个,为了保证插值多项式的存在唯一性,这时的Hermite插值多项式应在 Pn P n 上求得.
当每一个插值节点再有一个对于导数的约束条件时,此时线性方程变成了2*(n + 1)= 2n + 2个,也就是需要构造一个不超过2n+1次的多项式。
构造出的埃尔米特插值函数应该是这样一个形式:
H2n+1(x)=∑i=0nf(xi)αi(x)+∑i=0nf′(xi)βi(x) H 2 n + 1 ( x ) = ∑ i = 0 n f ( x i ) α i ( x ) + ∑ i = 0 n f ′ ( x i ) β i ( x )
两个基函数:
{αi(xj)=δij,α′i(xj)=0,j=0,1,2,...,n,{βi(xj)=0,β′i(xj)=δij,j=0,1,2,...,n,δij={1,j=i,0,j≠i,j=0,1,2,...,n. { α i ( x j ) = δ i j , α i ′ ( x j ) = 0 , j = 0 , 1 , 2 , . . . , n , { β i ( x j ) = 0 , β i ′ ( x j ) = δ i j , j = 0 , 1 , 2 , . . . , n , δ i j = { 1 , j = i , 0 , j ≠ i , j = 0 , 1 , 2 , . . . , n .
根据课本上提供的公式构造出两个符合条件的基函数 αi(x) α i ( x ) 和 βi(x) β i ( x ) 如下:
αi(x)=l2i(x)[1+2(xi−x)∑k=0,k≠in1xi−xk] α i ( x ) = l i 2 ( x ) [ 1 + 2 ( x i − x ) ∑ k = 0 , k ≠ i n 1 x i − x k ]
βi(x)=(x−xi)l2i(x) β i ( x ) = ( x − x i ) l i 2 ( x )
其中 li(x) l i ( x ) 是拉格朗日插值基函数
lj(x)=∏i=0,i≠jkx−xixj−xi l j ( x ) = ∏ i = 0 , i ≠ j k x − x i x j − x i 因此我们只需要根据公式计算出 αi(x) α i ( x ) 和 βi(x) β i ( x ) 这两个基函数,就可以很简单地得出赫尔米特插值函数了可见此时Hermite插值函数依旧有着很严重的龙格现象
计算区间[-5,5]内 101 个等距分布点处的误差绝对值的平均值:
0.350297537083
根据公式 lj(x)=∏ki=0,i≠jx−xixj−xi l j ( x ) = ∏ i = 0 , i ≠ j k x − x i x j − x i 生成朗格朗日基函数:
# 生成朗格朗日基函数 def get_li(i, x_all): def li(xx): a = 1.0 b = 1.0 for j in range(len(x_all)): if j == i: continue a *= (xx-x_all[j]) b *= (x_all[i]-x_all[j]) return a / b return li根据公式 αi(x)=l2i(x)[1+2(xi−x)∑nk=0,k≠i1xi−xk] α i ( x ) = l i 2 ( x ) [ 1 + 2 ( x i − x ) ∑ k = 0 , k ≠ i n 1 x i − x k ] 生成 αi(x) α i ( x ) 基函数:
# 求alpha基函数 def get_alpha(i, x_all=[]): def alpha(xx): result = 0.0 for k in range(len(x_all)): if k == i: continue result += 1.0/(x_all[i]-x_all[k]) result = (1 + 2*(x_all[i]-xx) * result) li = get_li(i, x_all) result *= li(xx)**2 return result return alpha根据公式 βi(x)=(x−xi)l2i(x) β i ( x ) = ( x − x i ) l i 2 ( x ) 生成 βi(x) β i ( x ) 基函数:
# 求alpha基函数 def get_beta(i, x_all=[]): def beta(xx): li = get_li(i, x_all) result = (xx - x_all[i]) * li(xx)**2 return result return beta代入 H2n+1(x)=∑ni=0f(xi)αi(x)+∑ni=0f′(xi)βi(x) H 2 n + 1 ( x ) = ∑ i = 0 n f ( x i ) α i ( x ) + ∑ i = 0 n f ′ ( x i ) β i ( x ) 生成Hermite插值函数:
def Hermite(x, f, f_): def He(xi): result = 0.0 n = len(x) for i in range(n): ai = get_alpha(i, x) bi = get_beta(i, x) result += y[i] * ai(xi) + y_[i] * bi(xi) return result return He其实该题的意思就是使用切比雪夫多项式零点插值来处理这个函数。 第一类切比雪夫多项式由以下三角恒等式确定:
Tn(cos(θ))=cos(nθ) T n ( cos ( θ ) ) = cos ( n θ ) 其中 n=0,1,2,3,.....cosnθ n = 0 , 1 , 2 , 3 , . . . . . cos n θ , 是关于 cosθ cos θ 的 n n 次多项式, 用显式来表示:Tn(x)=⎧⎩⎨cos(narccos(x)),cosh(narccosh(x)),(−1)ncosh(narccosh(−x)), x∈[−1,1] x≥1 x≤−1Tn(x)={cos(narccos(x)), x∈[−1,1]cosh(narccosh(x)), x≥1(−1)ncosh(narccosh(−x)), x≤−1
n n 次切比雪夫多项式在区间[−1,1]上都有nn个不同的根, 称为切比雪夫根, 有时亦称做切比雪夫节点 ,因为是多项式插值时的插值点 . 从三角形式中可看出 Tn T n 的 n n 个根分别是: xi=cos(2i−12nπ),i=1,...,nxi=cos(2i−12nπ),i=1,...,n
根据题目条件计算出11个切比雪夫多项式的零点: [ 4.949107, 4.548160, 3.778748, 2.703204, 1.408663, 0.000000, -1.408663, -2.703204, -3.778748, -4.548160, -4.949107] 接着以这些节点作为朗格朗日插值节点进行拉格朗日插值即可
函数两端的波动相较之前两个插值函数已经小了很多
0.0486976071887
根据公式 xi=cos(2i−122π),i=1,...,11 x i = cos ( 2 i − 1 22 π ) , i = 1 , . . . , 11 获取11次切比雪夫多项式的零点
# 获取11次切比雪夫多项式的零点 def ChebyshevX(): n = 11 x = np.arange(n) + 1.0 # print x xi = np.cos((2*x-1)/(2*n)*np.pi) return xi * 5然后使用这些节点调用上一问已经完成的函数进行拉格朗日插值:
# 获取切比雪夫多项式零点来代替原插值节点 x = ChebyshevX() # 获取切比雪夫零点插值函数 Lx = Lagrange(x, f)得到的函数Lx即为切比雪夫多项式零点插值函数
分段线性插值就是通过插值点用折线段连接起来逼近 f(x) f ( x ) . 设已知节点 a=x0<x1<...<xn=b a = x 0 < x 1 < . . . < x n = b 上的函数值 f0,f1,...,fn f 0 , f 1 , . . . , f n ,记 hk=xk+1−xk h k = x k + 1 − x k , h=maxhk h = m a x h k ,求一折线函数 Ih(x) I h ( x ) 满足: (1). Ih(x)∈C[a,b] I h ( x ) ∈ C [ a , b ] (2). Ih(x)=fk(k=0,1,...,n) I h ( x ) = f k ( k = 0 , 1 , . . . , n ) (3). Ih(x) I h ( x ) 在每个小区间 [xk,xk+1] [ x k , x k + 1 ] 上是线性函数 则称 Ih(x) I h ( x ) 为分段线性插值函数 根据定义可知对于每个 Ih(x) I h ( x ) 在每个小区间 [xk,xk+1] [ x k , x k + 1 ] 上可以表示为:
Ih(x)=x−xk+1xk−xk+1fk+x−xkxk+1−xkfk+1 I h ( x ) = x − x k + 1 x k − x k + 1 f k + x − x k x k + 1 − x k f k + 1 其中: xk≤x≤xk+1k=0,1,...,n−1 x k ≤ x ≤ x k + 1 k = 0 , 1 , . . . , n − 1 在本题中只需要将 x x 对应在每个区间[xk,xk 1][xk,xk 1]按照公式求出即可可见分段线性插值虽然插值的结果不光滑,但是在速度上和误差上都表现得比较好,不会出现龙格现象
0.0147779905191
分段线性插值函数 Ih(x) I h ( x ) 的导数是间断的,若在节点 xk(k=0,1,...,n) x k ( k = 0 , 1 , . . . , n ) 上除已知函数值 fk f k 之外还给出导数值 f′k=mk(k=0,1,...,n) f k ′ = m k ( k = 0 , 1 , . . . , n ) ,这样就可构造一个导数连续的分段插值函数 Ih(x) I h ( x ) ,称为分段三次埃尔米特插值函数,它满足条件: (1). Ih(x)∈C′[a,b] I h ( x ) ∈ C ′ [ a , b ] (2). Ih(x)=fk,I′h(x)=f′k(k=0,1,...,n) I h ( x ) = f k , I h ′ ( x ) = f k ′ ( k = 0 , 1 , . . . , n ) (3). Ih(x) I h ( x ) 在每个小区间 [xk,xk+1] [ x k , x k + 1 ] 上是三次多项式 根据两点三次插值多项式可知, Ih(x) I h ( x ) 在区间 [xk,xk+1] [ x k , x k + 1 ] 上的表达式为:
Ih(x)=(x−xk+1xk−xk+1)2(1+2x−xkxk+1−xk)fk+(x−xkxk+1−xk)2(1+2x−xk+1xk−xk+1)fk+1 I h ( x ) = ( x − x k + 1 x k − x k + 1 ) 2 ( 1 + 2 x − x k x k + 1 − x k ) f k + ( x − x k x k + 1 − x k ) 2 ( 1 + 2 x − x k + 1 x k − x k + 1 ) f k + 1+(x−xk+1xk−xk+1)2(x−xk)f′k+(x−xkxk+1−xk)2(x−xk+1)f′k+1 + ( x − x k + 1 x k − x k + 1 ) 2 ( x − x k ) f k ′ + ( x − x k x k + 1 − x k ) 2 ( x − x k + 1 ) f k + 1 ′ 上式对于 k=0,1,...,n−1 k = 0 , 1 , . . . , n − 1 成立
可见分段三次赫尔米特插值拟合性,光滑程度上都表现得非常优秀
0.00132363164301
对于 n+1 n + 1 个给定点的数据集 xi x i ,我们可以用 n n 段三次多项式在数据点之间构建一个三次样条。如果
S(x)=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪S0(x), x∈[x0,x1]S1(x), x∈[x1,x2]⋯Sn−1(x), x∈[xn−1,xn]S(x)={S0(x), x∈[x0,x1]S1(x), x∈[x1,x2]⋯Sn−1(x), x∈[xn−1,xn] 表示对函数 f f 进行插值的样条函数,那么需要:
插值特性,S(xi)=f(xi)S(xi)=f(xi) 样条相互连接, Si−1(xi)=Si(xi),i=1,...,n−1 S i − 1 ( x i ) = S i ( x i ) , i = 1 , . . . , n − 1 两次连续可导, S′i−1(xi)=S′i(xi) S i − 1 ′ ( x i ) = S i ′ ( x i ) 以及 S′′i−1(xi)=S′′i(xi),i=1,...,n−1. S i − 1 ″ ( x i ) = S i ″ ( x i ) , i = 1 , . . . , n − 1.
由于每个三次多项式需要四个条件才能确定曲线形状,所以对于组成S的 n n 个三次多项式来说,这就意味着需要4n4n个条件才能确定这些多项式。但是,插值特性只给出了 n+1 n + 1 个条件,内部数据点给出 n+1−2=n−1 n + 1 − 2 = n − 1 个条件,总计是 4n−2 4 n − 2 个条件。我们还需要另外两个条件,根据不同的因素我们可以使用不同的条件。
其中一项选择条件可以得到给定u与v的钳位三次样条, S′(x0)=u S ′ ( x 0 ) = u S′(xk)=v S ′ ( x k ) = v 另外,我们可以设 S′′(x0)=S′′(xn)=0. S ″ ( x 0 ) = S ″ ( x n ) = 0 . 这样就得到自然三次样条。自然三次样条几乎等同于样条设备生成的曲线。
在这些所有的二次连续可导函数中,钳位与自然三次样条可以得到相对于待插值函数f的最小震荡。
如果选择另外一些条件, S(x0)=S(xn) S ( x 0 ) = S ( x n ) S′(x0)=S′(xn) S ′ ( x 0 ) = S ′ ( x n ) S′′(x0)=S′′(xn) S ″ ( x 0 ) = S ″ ( x n ) 可以得到周期性的三次样条。
下面我们利用 S(x) S ( x ) 的二阶导数值 S′′(xj)=Mj(j=0,1,...,n) S ″ ( x j ) = M j ( j = 0 , 1 , . . . , n ) 表达 S(x) S ( x ) .由于 S(x) S ( x ) 在区间 [xj,xj+1] [ x j , x j + 1 ] 上是三次多项式,故 S′′(x) S ″ ( x ) 在 [xj,xj+1] [ x j , x j + 1 ] 上是线性函数,可表示为
S′′(x)=Mjxj+1−xhj+Mj+1x−xjhj S ″ ( x ) = M j x j + 1 − x h j + M j + 1 x − x j h j 对 S′′(x) S ″ ( x ) 积分两次并且利用 S(xj)=yj S ( x j ) = y j 及 S(xj+1)=yj+1 S ( x j + 1 ) = y j + 1 ,可求出定积分常数,于是得到三次样条表达式 S(x)=Mj(xj+1−x)26hj+Mj+1(x−xj)26hj+(yj−Mjh2j6)xj+1−xhj+(yj+1−Mj+1h2j6)x−xjhj,j=0,1,...,n−1 S ( x ) = M j ( x j + 1 − x ) 2 6 h j + M j + 1 ( x − x j ) 2 6 h j + ( y j − M j h j 2 6 ) x j + 1 − x h j + ( y j + 1 − M j + 1 h j 2 6 ) x − x j h j , j = 0 , 1 , . . . , n − 1 在这里 Mj(j=0,1,...n) M j ( j = 0 , 1 , . . . n ) 是未知的. 利用公式求得: μjMj−1+2Mj+λjMj+1=dj,j=1,2,...,n−1 μ j M j − 1 + 2 M j + λ j M j + 1 = d j , j = 1 , 2 , . . . , n − 1 其中 μj=hj−1hj−1+hj,λj=hjhj−1+hj, μ j = h j − 1 h j − 1 + h j , λ j = h j h j − 1 + h j , dj=6f[xj,xj+1]−f[xj−1,xj]hj−1+hj=6f[xj−1,xj,xj+1],j=1,2,...n−1 d j = 6 f [ x j , x j + 1 ] − f [ x j − 1 , x j ] h j − 1 + h j = 6 f [ x j − 1 , x j , x j + 1 ] , j = 1 , 2 , . . . n − 1 令 λ0=1,d0=6h0(f[x0,x1]−f′0),μn=1,dn=6hn−1(f′n−f[xn−1,xn]) λ 0 = 1 , d 0 = 6 h 0 ( f [ x 0 , x 1 ] − f 0 ′ ) , μ n = 1 , d n = 6 h n − 1 ( f n ′ − f [ x n − 1 , x n ] ) ,然后可以列矩阵求解: ⎛⎝⎜⎜⎜⎜⎜⎜⎜2μ2λnλ12⋱λ2⋱μn−1⋱2μnμ1λn−12⎞⎠⎟⎟⎟⎟⎟⎟⎟⎛⎝⎜⎜⎜⎜⎜⎜⎜M1M2⋮Mn−1Mn⎞⎠⎟⎟⎟⎟⎟⎟⎟=⎛⎝⎜⎜⎜⎜⎜⎜⎜d1d2⋮dn−1dn⎞⎠⎟⎟⎟⎟⎟⎟⎟ ( 2 λ 1 μ 1 μ 2 2 λ 2 ⋱ ⋱ ⋱ μ n − 1 2 λ n − 1 λ n μ n 2 ) ( M 1 M 2 ⋮ M n − 1 M n ) = ( d 1 d 2 ⋮ d n − 1 d n ) 解出 M M 之后代入公式即可解出S(x)S(x)f′(−5)=f′(5)=1 f ′ ( − 5 ) = f ′ ( 5 ) = 1
因为在两个端点处要保证导数值为1,所以插值图像中两端点附近出现了一定程度的抖动
0.0313803197288
这里只是把两个端点的导数值换成原函数的导数值
f′(−5)=12 f ′ ( − 5 ) = 1 2 f′(5)=−12 f ′ ( 5 ) = − 1 2
可见在这种情况之下图像基本完全重合,拟合性很优越
0.00402051060792
插值函数误差值Lagrange0.285755407117Hermite0.350297537083ChebyshevX0.0486976071887subLiner0.0147779905191subHermite0.00132363164301First Cubic Spline0.0313803197288Second Cubic Spline0.00402051060792从数值来看,各个积分公式的误差大小排序如下:
0.00132363164301 < < <script type="math/tex" id="MathJax-Element-172"><</script> 0.00402051060792 < < <script type="math/tex" id="MathJax-Element-173"><</script> 0.0147779905191 < < <script type="math/tex" id="MathJax-Element-174"><</script> 0.0313803197288 < < <script type="math/tex" id="MathJax-Element-175"><</script> 0.0486976071887 < < <script type="math/tex" id="MathJax-Element-176"><</script> 0.285755407117 < < <script type="math/tex" id="MathJax-Element-177"><</script> 0.350297537083 即: subHermite < Second Cubic Spline < subLiner < First Cubic Spline < ChebyshevX < Lagrange < Hermite
根据表格中各个插值函数的平均误差值来看,效果最优的插值函数为分段埃尔米特插值函数
∫1−111+x2dx ∫ − 1 1 1 1 + x 2 d x
把积分的区间 [a,b] [ a , b ] 分成 N N 份,分割出的每一个区间长度是一致的,然后就应用梯形公式: ∫baf(x)dx≈h2∑k=0n−1[f(xk) f(xk 1)]∫abf(x)dx≈h2∑k=0n−1[f(xk) f(xk 1)]
使用数学方法计算出
I=∫1−111+x2dx=π2 I = ∫ − 1 1 1 1 + x 2 d x = π 2 通过复合梯形公式计算出来的值为: T=1.56996299445 T = 1.56996299445 误差: |I−T|=0.000833332341317 | I − T | = 0.000833332341317将区间 [a,b] [ a , b ] 分成 n n 等份,在每个子区间[xk,xk 1][xk,xk 1]上采用辛普森公式:
∫baf(x)dx≈=h6∑k=0n−1[f(xk)+4f(xk+1/2)+f(xk+1)] ∫ a b f ( x ) d x ≈= h 6 ∑ k = 0 n − 1 [ f ( x k ) + 4 f ( x k + 1 / 2 ) + f ( x k + 1 ) ]通过复合的辛普森公式计算出来的结果:
S=1.57079630697 S = 1.57079630697误差:
|I−S|=0.0000000198252885 | I − S | = 0.0000000198252885在高斯求积公式中,若取权函数 ρ(x)=1 ρ ( x ) = 1 ,区间为 [−1,1] [ − 1 , 1 ] ,则得到公式:
∫1−1f(x)dx≈∑k=0nAkf(xk) ∫ − 1 1 f ( x ) d x ≈ ∑ k = 0 n A k f ( x k ) 当积分区间不是 [−1,1] [ − 1 , 1 ] ,而是一般的积分区间 [a,b] [ a , b ] 时,需做以下变换: x=b−a2t+a+b2 x = b − a 2 t + a + b 2 可将 [a,b] [ a , b ] 化为 [−1,1] [ − 1 , 1 ] ,这时 ∫baf(x)dx=b−a2∫1−1f(b−a2t+a+b2)dt ∫ a b f ( x ) d x = b − a 2 ∫ − 1 1 f ( b − a 2 t + a + b 2 ) d t 将 [−1,1] [ − 1 , 1 ] 划分成 10 10 个等份之后,将每一部分通过区间变化成 [−1,1] [ − 1 , 1 ] ,接着将每一部分积分出来的值相加即可得到积分值通过公式计算得:
G2=1.5707964042 G 2 = 1.5707964042 相对误差 |I−G2|=0.0000000774061313 | I − G 2 | = 0.0000000774061313与复合的两点高斯公式计算方法类似 将[−1,1][−1,1]划分成 6 6 个等份之后,将每一部分通过区间变化成[−1,1][−1,1],接着将每一部分积分出来的值相加即可得到积分值
通过公式计算得:
G3=1.57079632759 G 3 = 1.57079632759 相对误差 |I−G3|=0.0000000007934180 | I − G 3 | = 0.0000000007934180与复合的两点高斯公式计算方法类似 将[−1,1][−1,1]划分成 4 4 个等份之后,将每一部分通过区间变化成[−1,1][−1,1],接着将每一部分积分出来的值相加即可得到积分值
通过公式计算得:
G5=1.57079632614 G 5 = 1.57079632614 相对误差 |I−G5|=0.0000000006552323 | I − G 5 | = 0.0000000006552323从数值来看,各个积分公式的误差大小排序如下:
0.0000000006552323 < < <script type="math/tex" id="MathJax-Element-225"><</script> 0.0000000007934180 < < <script type="math/tex" id="MathJax-Element-226"><</script> 0.0000000198252885 < < <script type="math/tex" id="MathJax-Element-227"><</script> 0.0000000774061313 < < <script type="math/tex" id="MathJax-Element-228"><</script> 0.0008333323413172 即: 复合的五点高斯公式 < < <script type="math/tex" id="MathJax-Element-229"><</script> 复合的三点高斯公式 < < <script type="math/tex" id="MathJax-Element-230"><</script> 复合的辛普森公式 < < <script type="math/tex" id="MathJax-Element-231"><</script> 复合的两点高斯公式 < < <script type="math/tex" id="MathJax-Element-232"><</script> 复合的梯形公式
可见复合的五点高斯公式误差值最小,同时复合的五点高斯公式和复合的三点高斯公式都已经把误差控制在 10−10 10 − 10 数量级,误差已经非常小了。 而复合的梯形公式的误差在 10−4 10 − 4 ,误差相对来说就非常大