《数值计算方法》系列总目录
第一章 误差序列实验
第二章 非线性方程f(x)=0求根的数值方法
第三章 CAD模型旋转和AX=B的数值方法
第四章 插值与多项式逼近的数值计算方法
第五章 曲线拟合的数值方法
第六章 数值微分计算方法
第七章 数值积分计算方法
第八章 数值优化方法
泰勒级数是一种类型的极限过程,即无穷多项相加,并求部分和的极限。它的一个重要应用是表示基本函数: s i n ( x ) sin( x ) sin(x), c o s ( x ) cos( x ) cos(x), e x e^x ex和 l n ( x ) ln(x) ln(x)等。部分和可求到满足指定的精度要求为止。级数方法用于工程和物理领域中。可以将函数的幂级数表示看成一种次数递增多项式的极限过程:只要有足够的项相加,就可以得到精确的逼近。这一点需要精确化,选择什么次数的多项式?怎样计算多项式中各次幂的系数?因此有如下定理:
设 f ∈ C N + 1 [ a , b ] f \in {C^{N + 1}}[a,b] f∈CN+1[a,b], 而 x 0 ∈ [ a , b ] {x_0} \in [a,b] x0∈[a,b]是固定值。如果 x ∈ [ a , b ] x \in [a,b] x∈[a,b],则有
f ( x ) = P N ( x ) + E N ( x ) f(x) = {P_N}(x) + {E_N}(x) f(x)=PN(x)+EN(x)
其中 P N ( x ) P_N(x) PN(x)为用来近似 f ( x ) f(x) f(x)的多项式:
f ( x ) ≈ P N ( x ) = ∑ k = 0 N f ( k ) ( x 0 ) k ! ( x − x 0 ) k f(x) \approx {P_N}(x) = \sum\limits_{k = 0}^N {\frac{{{f^{(k)}}({x_0})}}{{k!}}{{(x - {x_0})}^k}} f(x)≈PN(x)=k=0∑Nk!f(k)(x0)(x−x0)k
误差项 E N ( x ) E_N(x) EN(x)形如
E N ( x ) = f ( N + 1 ) ( c ) ( N + 1 ) ! ( x − x 0 ) N + 1 {E_N}(x) = \frac{{{f^{(N + 1)}}(c)}}{{(N + 1)!}}{(x - {x_0})^{N + 1}} EN(x)=(N+1)!f(N+1)(c)(x−x0)N+1
C C C为 x x x和 x 0 x_0 x0之间的某个值 c = c ( x ) c=c(x) c=c(x)。其中,(2)说明了系数的计算公式。对于此定理, 有如下推论:
P N ( k ) ( x 0 ) = f ( k ) ( x 0 ) f o r k = 0 , 1 , . . . , N P_N^{(k)}({x_0}) = f_{}^{(k)}({x_0}){\rm{ }}for{\rm{ }}k = 0,1,...,N PN(k)(x0)=f(k)(x0)fork=0,1,...,N
逼近理论总是试图寻找解析函数f(x)在区间 [ a , b ] [a,b] [a,b]上的精确多项式逼近。泰勒多项式的精度随着 N N N的增长而提高,可以这样理解,随着逼近多项式的项数的提高,多项式函数在取定点的高阶导数一致,也就是说函数的走向相似度更高,座椅逼近效果更好,这一点在之后的实验案例中有所体现,即N越大,多项式的图像与 f ( x ) f(x) f(x)在远离 x 0 x_0 x0的地方更接近。通常,任何给定多项式的精度都将随着 α α α远离中心点x而降低,因此必须选择足够大的N,并限制最大值 l x – x 0 l lx– x_0l lx–x0l,才能使误差不超过给定限度。如果选择区间宽度为 2 R 2R 2R,而 x 0 x_0 x0位于区间中心(即 l x 一 x l < R lx一 xl
∣ e r r o r ∣ = ∣ E N ( x ) ∣ ≤ M R N + 1 ( N + 1 ) ! \left| {error} \right| = \left| {{E_N}(x)} \right| \le \frac{{M{R^{N + 1}}}}{{(N + 1)!}} ∣error∣=∣EN(x)∣≤(N+1)!MRN+1
其中
M ≤ max { ∣ f ( N + 1 ) ( z ) ∣ : x 0 − R ≤ z ≤ x 0 − R } M \le \max \{ |{f^{(N + 1)}}(z)|:{x_0} - R \le z \le {x_0} - R\} M≤max{∣f(N+1)(z)∣:x0−R≤z≤x0−R}
然而,在给定了泰勒多项式以后,在多项式求值上面可以利用霍纳方法,即嵌套乘法,从而大大提高计算效率。通过选取合适的逼近多项式的阶数,根据函数值的取值范围,大可不必选择阶数过于高,因为只要在误差精度范围内,在所选取区间内一定的N便可满足要求。因此在给定取值区间可以选取尽量小的N,从而简化计算、提高算力。
构造泰勒多项式需要知道 x x x处的 f ( x ) f(x) f(x)及其导数值,该方法的缺点之一是必须知道函数的高阶导数值,而通常的情况是,它们或者无法得到,或者难以计算。假设函数 y = f ( x ) y =f(x) y=f(x)在 N + 1 N+1 N+1个点 ( x 0 , y 0 ) , … , ( x N , y N ) (x_0,y_0),…,(x_N , y_N) (x0,y0),…,(xN,yN)处的值已知,其中值 x k x_k xk在区间 [ a , b ] [a,b] [a,b]上,并满足
a ≤ x 0 < x 1 < . . . < x N ≤ b a n d y k = f ( x k ) a \le {x_0} < {x_1} < ... < {x_N} \le b{\rm{ }}and{\rm{ }}{y_k} = f({x_k}) a≤x0<x1<...<xN≤bandyk=f(xk)
可以构造经过这 N + 1 N+1 N+1个点的 N N N次多项式 P ( x ) P(x) P(x),这种构造只需知道 x x x和 y y y的数值,而不需要高阶导数值。可在整个区间[a,b]上用多项式 P ( x ) P(x) P(x)来逼近 f ( x ) f(x) f(x)。这种根据已知值构造逼近多项式的方法叫做插值法。并且,在一个区间上已知的值越多,则插值多项式的逼近效果越好。当 x 0 < x < x N x_0
M = max { ∣ f ( N + 1 ) ( x ) ∣ : a ≤ x ≤ b } M = \max \{ |{f^{(N + 1)}}(x)|:a \le x \le b\} M=max{∣f(N+1)(x)∣:a≤x≤b}
一般来说,当插值多项式的阶数 N N N趋近于无穷大时,其误差会趋近于零,根据不同的插值方法其过程有所不同,这点在接下来介绍的各种插值方法中会有所体现。另外,由插值构造的多项式可用霍纳方法进行计算。
所谓插值,就是利用邻近点上已知函数值的加权平均来估计未知函数值,即根据已知值构造 N N N阶多项式从而逼近函数的方法。线性插值使用的是过两点的线段,点 ( x 0 , y 0 ) 与 ( x 1 , y 1 ) (x_0,y_0)与(x_1,y_1) (x0,y0)与(x1,y1)之间的斜率为 m = ( y 1 − y 0 ) / ( x 1 − x 0 ) m =(y_1-y_0)/(x_1-x_0) m=(y1−y0)/(x1−x0),直线 y = m ( x − x 0 ) + y 0 y=m(x- x_0)+y_0 y=m(x−x0)+y0的点-斜率公式可写为:
y = P ( x ) = y 0 + m ( x − x 0 ) = y 0 + y 1 − y 0 x 1 − x 0 ( x − x 0 ) y = P(x) = {y_0} + m(x - {x_0}) = {y_0} + \frac{{{y_1} - {y_0}}}{{{x_1} - {x_0}}}(x - {x_0}) y=P(x)=y0+m(x−x0)=y0+x1−x0y1−y0(x−x0)
公式(9)展开的结果是一个次数小于等于1的多项式。在 x 0 x_0 x0和 x 1 x_1 x1计算 P ( x ) P(x) P(x),得到 y 0 y_0 y0和 y 1 y_1 y1:
P ( x 0 ) = y 0 + ( y 1 − y 0 ) 0 = y 0 P ( x 1 ) = y 0 + ( y 1 − y 0 ) 1 = y 1 P({x_0}) = {y_0} + ({y_1} - {y_0})0 = {y_0}\\ P({x_1}) = {y_0} + ({y_1} - {y_0})1 = {y_1} P(x0)=y0+(y1−y0)0=y0P(x1)=y0+(y1−y0)1=y1 拉格朗日使用不同的表述方式,使其表示为带有权重因子的表达式,并推广成求已知 N N N个点的插值多项式,即:
y = P 1 ( x ) = y 0 x − x 1 x 0 − x 1 + y 1 x − x 0 x 1 − x 0 y = {P_1}(x) = {y_0}\frac{{x - {x_1}}}{{{x_0} - {x_1}}} + {y_1}\frac{{x - {x_0}}}{{{x_1} - {x_0}}} y=P1(x)=y0x0−x1x−x1+y1x1−x0x−x0
式(11)右端的每一项都包含了一个线性因子,因此该式是一个次数小于等于1的多项式。式(11)中的商式用
L 1 , 0 ( x ) = x − x 1 x 0 − x 1 , L 1 , 1 ( x ) = x − x 0 x 1 − x 0 {L_{1,0}}(x) = \frac{{x - {x_1}}}{{{x_0} - {x_1}}},{L_{1,1}}(x) = \frac{{x - {x_0}}}{{{x_1} - {x_0}}} L1,0(x)=x0−x1x−x1,L1,1(x)=x1−x0x−x0
表示。因此,不难证明(9)表示的多项式也经过两个已知的点,这一点在后面的N阶的推导中也有体现。其中, L n k L_{nk} Lnk称为基于节点的拉格朗日系数。因此,利用含有 L n k L_{nk} Lnk的和式,式(9)还可表示为
P 1 ( x ) = ∑ k = 0 1 y k L 1 , k ( x ) {P_1}(x) = \sum\limits_{k = 0}^1 {{y_k}{L_{1,k}}(x)} P1(x)=k=0∑1ykL1,k(x)
设y由公式 y k = f ( x k ) y_k=f(x_k) yk=f(xk)计算。如果在区间 [ x 0 , x 1 ] [x_0,x_1] [x0,x1]上用 P 1 ( x ) P_1(x) P1(x)逼近 f ( x ) f(x) f(x),称该过程为内插;如果 x < x 0 x
现在对式(13)进行推广,假设有 N + 1 N+1 N+1个已知点 ( x 0 , y 0 ) , ( x 1 , y 1 ) , … , ( x N , y N ) (x_0,y_0),(x_1,y_1),…,(x_N,y_N) (x0,y0),(x1,y1),…,(xN,yN),则由式(13)可知,次数最高为N的多项式 P N ( x ) P_N( x) PN(x)的构造方法为
P N ( x ) = ∑ k = 0 N y k L N , k ( x ) {P_N}(x) = \sum\limits_{k = 0}^N {{y_k}{L_{N,k}}(x)} PN(x)=k=0∑NykLN,k(x)
其中, L n k L_{nk} Lnk是基于节点
的拉格朗日系数。式中可以看出,有理式中没有 ( x − x k ) 、 ( x k − x k ) (x-x_k)、(x_k-x_k) (x−xk)、(xk−xk)项。对于每个确定的第k项,其拉格朗日系数具有如下性质:
L N , k ( x j ) = 1 , w h e n j = k L N , k ( x j ) = 0 , w h e n j ≠ k {L_{N,k}}({x_j}) = 1,{\rm{ }}when{\rm{ }}j = k\\ {L_{N,k}}({x_j}) = 0,{\rm{ }}when{\rm{ }}j \ne k LN,k(xj)=1,whenj=kLN,k(xj)=0,whenj=k 由此可证,对于拉格朗日多项式,其经过所有已知的插值点,其推导过程如下:
P N ( x j ) = y 0 L N , 0 ( x j ) + . . . + y j L N , j ( x j ) + . . . + y N L N , N ( x j ) = y 0 ( 0 ) + . . . . + y j ( 1 ) + . . . + y N ( 0 ) = y j \begin{array}{l} {{\rm{P}}_{\rm{N}}}{\rm{(}}{{\rm{x}}_{\rm{j}}}{\rm{) = }}{{\rm{y}}_{\rm{0}}}{{\rm{L}}_{{\rm{N,0}}}}{\rm{(}}{{\rm{x}}_{\rm{j}}}{\rm{) + }}...{\rm{ + }}{{\rm{y}}_{\rm{j}}}{{\rm{L}}_{{\rm{N,j}}}}{\rm{(}}{{\rm{x}}_{\rm{j}}}{\rm{) + }}...{\rm{ + }}{{\rm{y}}_{\rm{N}}}{{\rm{L}}_{{\rm{N,N}}}}{\rm{(}}{{\rm{x}}_{\rm{j}}}{\rm{)}}\\ {\rm{ = }}{{\rm{y}}_{\rm{0}}}{\rm{(0) + }}....{\rm{ + }}{{\rm{y}}_{\rm{j}}}{\rm{(1) + }}...{\rm{ + }}{{\rm{y}}_{\rm{N}}}{\rm{(0) = }}{{\rm{y}}_{\rm{j}}} \end{array} PN(xj)=y0LN,0(xj)+...+yjLN,j(xj)+...+yNLN,N(xj)=y0(0)+....+yj(1)+...+yN(0)=yj
除此之外,插值多项式具有唯一性,即对于已知的一组插值点,只有唯一的一个插值多项式。其次,在使用拉格朗日多项式来逼近连续函数 f ( x ) f(x) f(x)时,了解其误差项的属性非常重要。它与泰勒多项式的误差项相似,只是用乘积 ( x 0 , y 0 ) , ( x 1 , y 1 ) , … , ( x N , y N ) (x_0,y_0),(x_1,y_1),…,(x_N,y_N) (x0,y0),(x1,y1),…,(xN,yN)替换了因子 ( x 0 , y 0 ) N + 1 (x_0,y_0)^{N+1} (x0,y0)N+1。因为插值是使用已知的N+1个插值点构成的,与泰勒多项式的误差形式相似,因此用其每个插值点构造的因式替换其即可。当构造了拉格朗日多项式后,就可以试用其进行多项式的逼近。即在已知位于已知区间上的N+1个插值点,可以推导出以下公式:
f ( x ) = P N ( x ) + E N ( x ) f(x) = {P_N}(x) + {E_N}(x) f(x)=PN(x)+EN(x)
其中N阶多项式是可以用来逼近函数的,即
f ( x ) ≈ P N ( x ) = ∑ k = 0 N f ( x k ) L N , k ( x ) f(x) \approx {P_N}(x) = \sum\limits_{k = 0}^N {f({x_k}){L_{N,k}}(x)} f(x)≈PN(x)=k=0∑Nf(xk)LN,k(x)
由前述推导过程,误差项可以表示为
E N ( x ) = ( x − x 0 ) ( x − x 1 ) . . . ( x − x N ) f ( N + 1 ) ( c ) ( N + 1 ) ! {E_N}(x) = \frac{{(x - {x_0})(x - {x_1})...(x - {x_N}){f^{(N + 1)}}(c)}}{{(N + 1)!}} EN(x)=(N+1)!(x−x0)(x−x1)...(x−xN)f(N+1)(c)
其中, c c c为区间 [ a , b ] [a,b] [a,b]内的某个值,推导可用罗尔定理证明。根据误差表达式可以推导出,选择大的N可以得到更大的精度,从而减小利用拉格朗日多项式进行逼近时候的误差。
根据拉格朗日多项式逼近的公式与原理,其误差界都满足
Q ( x ) = ( x − x 0 ) ( x − x 1 ) ⋯ ( x − x N ) ∣ E N ( x ) ∣ ≤ ∣ Q ( x ) ∣ max − 1 ≤ x ≤ 1 { ∣ f ( N + 1 ) ( x ) ∣ } ( N + 1 ) ! Q(x) = (x - {x_0})(x - {x_1}) \cdots (x - {x_N})\\ \left| {{E_N}(x)} \right| \le \left| {Q(x)} \right|\frac{{{{\max }_{ - 1 \le x \le 1}}\{ |{f^{(N + 1)}}(x)|\} }}{{(N + 1)!}} Q(x)=(x−x0)(x−x1)⋯(x−xN)∣EN(x)∣≤∣Q(x)∣(N+1)!max−1≤x≤1{∣f(N+1)(x)∣} 而拉格朗日多项式的节点常选取区间上的等距节点,因此可以通过重新选取节点集 { x k } k = 0 N \{x_k\}^N_{k=0} {xk}k=0N的方法从而使误差表达式因子 max − 1 ≤ x ≤ 1 { ∣ Q ( x ) ∣ } {\max _{ - 1 \le x \le 1}}\{ |Q(x)|\} max−1≤x≤1{∣Q(x)∣}最小,从而需要讨论切比雪夫多项式及其性质。
首先给出切比雪夫多项式的递推公式
设 T 0 ( x ) = 1 , T 1 ( x ) = x 设{T_0}(x) = 1,{T_1}(x) = x 设T0(x)=1,T1(x)=x
则 T k ( x ) = 2 x T k − 1 ( x ) − T k − 2 ( x ) 则{T_k}(x) = 2x{T_{k - 1}}(x) - {T_{k - 2}}(x) 则Tk(x)=2xTk−1(x)−Tk−2(x)
其中 k = 2 , 3 , 4 , 5 … k=2,3,4,5… k=2,3,4,5…。因此,利用三角恒等式可以推出,在区间 [ − 1 , 1 ] [-1,1] [−1,1]上,N阶切比雪夫多项式的零点可以表示成
x k = cos ( ( 2 k + 1 ) π 2 N ) f o r k = 0 , 1 , . . . , N − 1 {x_k} = \cos \left( {\frac{{(2k + 1)\pi }}{{2N}}} \right){\rm{ }}for{\rm{ }}k = 0,1,...,N - 1 xk=cos(2N(2k+1)π)fork=0,1,...,N−1
这些零点称为切比雪夫点(节点)。定义区间 [ − 1 , 1 ] [-1,1] [−1,1]是为了方便进行限制三角恒等式推导时的上界,如果要计算其他区间上的切比雪夫点可以利用区间变换公式进行变换,即
x = ( b − a 2 ) t + a + b 2 o r t = 2 ( x − a b − a ) − 1 x = \left( {\frac{{b - a}}{2}} \right)t + \frac{{a + b}}{2} {\rm{or}} t = 2\left( {\frac{{x - a}}{{b - a}}} \right) - 1 x=(2b−a)t+2a+bort=2(b−ax−a)−1
因为在区间 [ − 1 , 1 ] [-1,1] [−1,1]上的切比雪夫点可以表示为
t k = cos ( ( 2 N + 1 − 2 k ) π 2 N + 2 ) f o r k = 0 , 1 , . . . , N {t_k} = \cos \left( {\left( {2N + 1 - 2k} \right)\frac{\pi }{{2N + 2}}} \right){\rm{ }}for{\rm{ }}k = 0,1,...,N tk=cos((2N+1−2k)2N+2π)fork=0,1,...,N
则在区间 [ a , b ] [a,b] [a,b]上的切比雪夫点可表示为 x k = ( b − a 2 ) t k + a + b 2 {x_k} = \left( {\frac{{b - a}}{2}} \right){t_k} + \frac{{a + b}}{2} xk=(2b−a)tk+2a+b。通过计算在区间 [ − 1 , 1 ] [-1,1] [−1,1]上分别利用等距节点和切比雪夫点构造的拉格朗日多项式逼近函数 f ( x ) = e x f(x)=e^x f(x)=ex的误差可以发现(N=3),可以发现利用切比雪夫点构造的拉格朗日多项式的误差的更加稳定,且切比雪夫点构造的拉格朗日多项式的误差的上界出现在边界点,其误差在区间上分布更均匀。
实际上,等距节点的拉格朗日插值,对于类似 s i n ( x ) sin(x) sin(x)或 e x p ( x ) exp(x) exp(x)的函数,当N增加时,因其所有导数有同样的常数界M,误差 E N ( x ) = f ( x ) − P N ( x ) E_N(x)=f(x)-P_N(x) EN(x)=f(x)−PN(x)随之趋近于零,这一点可用前面的拉格朗日多项式的误差表达式推出。而在一般情况下,很容易找到序列 ∣ P N ( x ) ∣ |P_N(x)| ∣PN(x)∣不收敛的函数。如果函数为 f ( x ) = 1 / ( 1 + 12 X 2 ) f(x)=1/(1+12X^2 ) f(x)=1/(1+12X2),则三N→∞时,误差项EN(x)的最大值增加。这种不收敛性称为龙格(Runge)现象。而且误差在区间的端点附近发生剧热的振荡。当节点数增加时,振荡变得更剧烈。产生这一现象的原因正是由于节点是等距的。
如果用切比雪夫节点来构造 f ( x ) = 1 / ( 1 + 12 x 2 ) f(x)= 1/(1+12x^2) f(x)=1/(1+12x2)的插值多项式,误差就会小得多.使用切比雪夫节点,误差 E N ( x ) E_N(x) EN(x)将随着 N → ∞ N→∞ N→∞而趋于0。一般情况下,如果 f ( x ) f(x) f(x)和 f , ( x ) f^{,}(x) f,(x)在[ -1,1]上连续,则可以证明,切比雪夫插值产生的多项式序列 { P N ( x ) } \{P_N(x)\} {PN(x)}在[-1,1]上一致收敛于 f ( x ) f(x) f(x)。
由已知得,可以使用切比雪夫点来求拉格朗日多项式。因此,可以推知,N次切比雪夫多项式可以由以 T N + 1 ( x ) T_{N+1}(x) TN+1(x)的N+1个零点为节点的拉格朗日多项式求得。但是,由于拉格朗日多项式的计算复杂,求解N个多项式更是复杂,原因是其相邻阶数之间的多项式无关系,没有递推关系可以利用,这一点牛顿多项式可以完美解决。然而,相邻阶数之间的切比雪夫多项式具有递推关系,直接求解切比雪夫多项式的方法使用N+1个切比雪夫多项式其最高阶为N的线性组合来表示,即
P N ( x ) = ∑ k = 0 N c k T k ( x ) = c 0 T 0 ( x ) + c 1 T 1 ( x ) + ⋯ + c N T N ( x ) {P_N}(x) = \sum\limits_{k = 0}^N {{c_k}{T_k}(x)} = {c_0}{T_0}(x) + {c_1}{T_1}(x) + \cdots + {c_N}{T_N}(x) PN(x)=k=0∑NckTk(x)=c0T0(x)+c1T1(x)+⋯+cNTN(x)
其中,切比雪夫多项式系具有正交性,即任意两个不同次数的切比雪夫多项式在N次切比雪夫多项式的零点上的取值的从1到N的和式为零,而相同项不为零,即
因此,当利用切比雪夫多项式逼近函数时,即
f ( x ) ≈ P N ( x ) = ∑ j = 0 N c j T j ( x ) f(x) \approx {P_N}(x) = \sum\limits_{j = 0}^N {{c_j}{T_j}(x)} f(x)≈PN(x)=j=0∑NcjTj(x)
可以利用推导傅里叶级数的方法,利用切比雪夫多项式系的正交性求出每一项的系数,即
c 0 = 1 N + 1 ∑ k = 0 N f ( x k ) T 0 ( x k ) = 1 N + 1 ∑ k = 0 N f ( x k ) c j = 2 N + 1 ∑ k = 0 N f ( x k ) T j ( x k ) = 2 N + 1 ∑ j = 0 N f ( x k ) cos ( j π ( 2 k + 1 ) 2 N + 2 ) {c_0} = \frac{1}{{N + 1}}\sum\limits_{k = 0}^N {f({x_k}){T_0}({x_k})} = \frac{1}{{N + 1}}\sum\limits_{k = 0}^N {f({x_k})} \\ {c_j} = \frac{2}{{N + 1}}\sum\limits_{k = 0}^N {f({x_k}){T_j}({x_k})} \\ {\rm{ }} = \frac{2}{{N + 1}}\sum\limits_{j = 0}^N {f({x_k})} \cos \left( {\frac{{j\pi (2k + 1)}}{{2N + 2}}} \right) c0=N+11k=0∑Nf(xk)T0(xk)=N+11k=0∑Nf(xk)cj=N+12k=0∑Nf(xk)Tj(xk)=N+12j=0∑Nf(xk)cos(2N+2jπ(2k+1)) 其中,对于N=0的情况,利用正交性中N=0的两个切比雪夫多项式的和式的性质,通过对切比雪夫逼近等式的两边同时乘以第一项,并对所有切比雪夫点的值进行求和,等式右边除第一项外的所有项为零,从而提取出第一项的系数,其他项的其实可以同样求出。
函数的有理逼近,即在函数f(x)的定义域的一个小区间上对他进行逼近。例如 f ( x ) = c o s ( x ) f(x)=cos(x) f(x)=cos(x),只需找到它在区间 [ 0 , Π / 2 ] [0, Π/2] [0,Π/2]上的逼近公式,然后利用三角恒等式即可计算区间外的值。在区间[a,b]上 f ( x ) f(x) f(x)的有理逼近是两N次和M次多项式 P N ( x ) P_N(x) PN(x)和 Q M ( x ) Q_M(x) QM(x)的分式。用记号 R N , M ( x ) R_{N,M}(x) RN,M(x)来表示这一分式
R N , M ( x ) = P N ( x ) Q M ( x ) f o r a ≤ x ≤ b {R_{N,M}}(x) = \frac{{{P_N}(x)}}{{{Q_M}(x)}}{\rm{ }}for{\rm{ }}a \le x \le b RN,M(x)=QM(x)PN(x)fora≤x≤b
通过构造有理逼近,使得在给定区间上其误差小于多项式逼近的误差,并通过其他方式推知其他区间上的值,通常,这个逼近的区间为一个小区间。帕德方法要求 f ( x ) f(x) f(x)及其导数在 x = 0 x=0 x=0处连续。选择 x = 0 x =0 x=0这个点有两个原因,第一,它使计算变得简单;第二,可以通过变量变换把计算平移到包含0的区间。式(30)中用的多项式为
P N ( x ) = p 0 + p 1 x + p 2 x 2 + ⋯ + p N x N Q M ( x ) = 1 + q 1 x + q 2 x 2 + ⋯ + q M x M {P_N}(x) = {p_0} + {p_1}x + {p_2}{x^2} + \cdots + {p_N}{x^N}\\ {Q_M}(x) = 1 + {q_1}x + {q_2}{x^2} + \cdots + {q_M}{x^M} PN(x)=p0+p1x+p2x2+⋯+pNxNQM(x)=1+q1x+q2x2+⋯+qMxM 多项式的构造为,在x=0处, f ( x ) f(x) f(x)和 R N , M ( x ) R_{N,M}(x) RN,M(x)相等,且它们直至 N + M N +M N+M阶导数也相等。当 Q 0 ( x ) = 1 Q_0(x)= 1 Q0(x)=1时,该逼近其实就是 f ( x ) f(x) f(x)的麦克劳林展开。对于固定的 N + M N+ M N+M,当 P N ( x ) P_N(x) PN(x)和 Q M ( x ) Q_M(x) QM(x)有相同次数时,或者当 P N ( x ) P_N(x) PN(x)的次数比 Q M ( x ) Q_M(x) QM(x)次数高1次时误差最小。因此,在构造的同时需要尽量让其相等,引入如果上下次数相差过大,则在定义域取值较大的小区间上会造成有理式数值发散或者收敛为0的效应,且这种现象不受系数约束。
因此,接下来通过对 f ( x ) f(x) f(x)进行零点处的麦克劳林展开,即
f ( x ) = a 0 + a 1 x + a 2 x 2 + ⋯ + a k x k + . . . f(x) = {a_0} + {a_1}x + {a_2}{x^2} + \cdots + {a_k}{x^k} + ... f(x)=a0+a1x+a2x2+⋯+akxk+...
来推导有理式中的N+M+1个未知数。其中,通过移相可得
( ∑ j = 0 ∞ a j x j ) ( ∑ j = 0 M q j x j ) − ∑ j = 0 N p j x j = ∑ j = N + M + 1 ∞ c j x j \left( {\sum\limits_{j = 0}^\infty {{a_j}{x^j}} } \right)\left( {\sum\limits_{j = 0}^M {{q_j}{x^j}} } \right) - \sum\limits_{j = 0}^N {{p_j}{x^j}} = \sum\limits_{j = N + M + 1}^\infty {{c_j}{x^j}} (j=0∑∞ajxj)(j=0∑Mqjxj)−j=0∑Npjxj=j=N+M+1∑∞cjxj
因为系数p只到第 N + 1 N+1 N+1项就消失了,因此可以分为上下两个部分,即
a 0 − p 0 = 0 q 1 a 0 + a 1 − p 1 = 0 q 2 a 0 + q 1 a 1 + a 2 − p 2 = 0 q 3 a 0 + q 2 a 1 + q 1 a 2 + a 3 − p 3 = 0 ⋮ q M a N − M + q M − 1 a N − M + 1 + ⋯ + a N − p N = 0 {\rm{ }}{a_0} - {p_0} = 0\\ {\rm{ }}{q_1}{a_0} + {a_1} - {p_1} = 0\\ {\rm{ }}{q_2}{a_0} + {q_1}{a_1} + {a_2} - {p_2} = 0\\ {\rm{ }}{q_3}{a_0} + {q_2}{a_1} + {q_1}{a_2} + {a_3} - {p_3} = 0\\ {\rm{ }} \vdots \\ {q_M}{a_{N - M}} + {q_{M - 1}}{a_{N - M + 1}} + \cdots + {a_N} - {p_N} = 0 a0−p0=0q1a0+a1−p1=0q2a0+q1a1+a2−p2=0q3a0+q2a1+q1a2+a3−p3=0⋮qMaN−M+qM−1aN−M+1+⋯+aN−pN=0 以上是含有p的部分,在N+1项之后,可得仅含有a和q的线性方程组
q M a N − M + 1 + q M − 1 a N − M + 2 + ⋯ + q 1 a N + a N + 1 = 0 q M a N − M + 2 + q M − 1 a N − M + 3 + ⋯ + q 1 a N + 1 + a N + 2 = 0 ⋮ q M a N + q M − 1 a N + 1 + ⋯ + q 1 a N + M − 1 + a N + M = 0 {\rm{ }}{q_M}{a_{N - M + 1}} + {q_{M - 1}}{a_{N - M + 2}} + \cdots + {q_1}{a_N}{\rm{ }} + {a_{N + 1}} = 0\\ {\rm{ }}{q_M}{a_{N - M + 2}} + {q_{M - 1}}{a_{N - M + 3}} + \cdots + {q_1}{a_{N + 1}}{\rm{ }} + {a_{N + 2}} = 0\\ \vdots \\ {\rm{ }}{q_M}{a_N}{\rm{ }} + {q_{M - 1}}{a_{N + 1}} + \cdots + {q_1}{a_{N + M - 1}} + {a_{N + M}} = 0 qMaN−M+1+qM−1aN−M+2+⋯+q1aN+aN+1=0qMaN−M+2+qM−1aN−M+3+⋯+q1aN+1+aN+2=0⋮qMaN+qM−1aN+1+⋯+q1aN+M−1+aN+M=0 因为 f ( x ) f(x) f(x)的麦克劳林展开的系数a已知,因此,可以利用第三章关于线性方程组的高斯消元法(选主元)、LU分解法、雅可比迭代法、高斯-赛德尔迭代法进行求解。得到所有的q取值后,通过求解含有p的下三角矩阵从而求解p,到此所有的未知数求解完成。最后,因为为有理式,所以不能像多项式一样利用霍纳方法简化计算,因此可以通过化简得到连分式从而减少计算次数,从而达到一样的效果。最后实验表明,在区间 [ − 5 , 5 ] [-5,5] [−5,5]上,函数 y = c o s ( x ) y=cos(x) y=cos(x)的帕德逼近的效果要优于6阶麦克劳林多项式。
根据前面对于泰勒逼近多项式的描述,即泰勒级数是一种类型的极限过程,即无穷多项相加,并求部分和的极限。部分和可求到满足指定的精度要求为止,所以可以将函数的幂级数表示看成一种次数递增多项式的极限过程:只要有足够的项相加,就可以得到精确的逼近。
要比较各个阶数的多项式的区间上的图像以及误差,从而可以得到不同阶数的逼近效果。其过程大致为:
因此,以下通过对以下实例进行仿真实验进行实现,观察其逼近效果。
X=-1:0.1:1;
Y=sin(X);
P5=X-X.^3/factorial(3)+X.^5/factorial(5);
P7=P5-X.^7/factorial(7);
P9=P7+X.^9/factorial(9);
%cons the f(x) value
D=[X' Y' P5' P7' P9'];
%cons the error consequence
err1=Y-P5;
err2=Y-P7;
err3=Y-P9;
Err=[X' err1' err2' err3'];
%plot the figure of each function
plot(X,Y,'r-');
hold on;
plot(X,P5,'g*');
hold on;
plot(X,P7,'k:');
hold on;
plot(X,P9,'b--');
axis([-1.5,1.5,-1,1]);
grid on;
legend('sin(x)','P_5(x)','P_7(x)','P_9(x)');
xlabel('x');
ylabel('y');
根据前面对于拉格朗日逼近多项式的描述,即利用邻近点上已知函数值的加权平均来估计未知函数值,即根据已知值构造N阶多项式从而逼近函数的方法,将N+1个函数取值表示为带有权重因子的和式表达式,即
${P_N}(x) = \sum\limits_{k = 0}^N {{y_k}{L_{N,k}}(x)} $
从而进行函数的逼近。其过程大致为:
因此,以下通过对以下实例进行仿真实验进行实现,观察其逼近效果。
下表给出了11月8日美国洛杉矶的一个郊区在5小时内的测量温度。
时间(下午) | 华氏度 |
---|---|
1 | 66 |
2 | 66 |
3 | 65 |
4 | 64 |
5 | 63 |
6 | 63 |
通过给定的数据,选取时间为自变量,因为有6个插值点,所以需要构造5阶拉格朗日多项式。通过使用内插法,对给定时间范围进行取样,即对时间区间进行分割,并且求得每个区间上的插值函数值,再进行求和并除以取样点的个数从而得到在一个区间上的温度平均值,其过程与求解定积分的理论推导过程一致。最后,根据求得的n个采样点的函数值以及采样点的坐标进行绘图,观察其函数图像与实际数据的误差,从而分析其误差。
其核心函数算法代码为:
//the xpt is interpolation list,and the x is the Lnk(x),return the LagrangePolycoe
float Lagrangefaccoe(float* xpt, float* ypt, const int n, const int k)
{
float downLnk;
downLnk = 1;
for (int i = 0; i < k - 1; ++i)
{
downLnk *= (xpt[k - 1] - xpt[i]);
}
for (int i = k; i < n; ++i)
{
downLnk *= (xpt[k - 1] - xpt[i]);
}
return ypt[k-1] / downLnk;
}
//the xpt is interpolation list,and the x is the Lnk(x),return the LagrangePolycoe
//the k is the kth interpolation
float LagrangePolycoe(float* xpt, float x, const int n, const int k)
{
float upLnk, downLnk;
upLnk = 1, downLnk = 1;
for (int i = 0; i < k - 1; ++i)
{
upLnk *= (x - xpt[i]);
downLnk *= (xpt[k - 1] - xpt[i]);
}
for (int i = k; i < n; ++i)
{
upLnk *= (x - xpt[i]);
downLnk *= (xpt[k - 1] - xpt[i]);
}
return upLnk / downLnk;
}
//compute the Pn(x) when given the nodes and the sum n
//the n is the sum of nodes
float LagrangePolyapproximate(float* xpt, float* ypt, float x, const int n)
{
float val, Lnk;
val = 0;
for (int i = 0; i < n; ++i)
{
//when the i,the node is (i+1)th
Lnk = LagrangePolycoe(xpt, x, n, i + 1);
val += ypt[i] * Lnk;
}
return val;
}
float SumPn(float* PN, const int n)
{
float val = 0;
for (int i = 0; i < n; ++i)
{
val += PN[i];
}
return val;
}
根据前面对于切比雪夫逼近多项式的描述,即用切比雪夫节点来构造函数的插值多项式,误差就会小得多.使用切比雪夫节点,误差EN(x)将随着N→∞而趋于0。利用相邻阶数之间的切比雪夫多项式具有递推关系,直接求解切比雪夫多项式的方法使用N+1个切比雪夫多项式其最高阶为N的线性组合来表示。其过程大致为:
因此,以下通过对以下实例进行仿真实验进行实现,观察其逼近效果。
在题中,当 ( a ) N = 4 , ( b ) N = 5 , ( c ) N = 6 和 ( d ) N = 7 (a)N=4,(b)N=5,(c)N=6和(d)N=7 (a)N=4,(b)N=5,(c)N=6和(d)N=7时,利用程序计算 [ − 1 , 1 ] [ -1,1] [−1,1]上 f ( x ) f(x) f(x)的切比雪夫多项式 P N ( x ) P_N(x) PN(x)的系数 { c k } \{ck\} {ck}。在每种情况下,在同一坐标系中画出 f ( x ) f(x ) f(x)和 P N ( x ) P_N(x) PN(x)的曲线,其中 f ( x ) = ( x + 2 ) ( x + 2 ) f(x) = {(x + 2)^{(x + 2)}} f(x)=(x+2)(x+2),除此之外,求解 ( N = 5 ) ∫ 0 1 cos ( x 2 ) d x (N = 5)\int_0^1 {\cos ({x^2})} dx (N=5)∫01cos(x2)dx的逼近。
其中,根据流程图构造不同阶数的切比雪夫多项式,并且利用与上一节求解平均温度的方法求解定积分。其核心函数算法代码为:
constexpr auto PI = 3.1415926;
float fun(float x)
{
return powf(x + 2., x + 2.);
}
//Cons the Chebyshev nodes,give n,return the n nodes in[-1,1]
void ChebyshevNodes(const int n, float* xk)
{
for (int i = 0; i < n; ++i)
{
xk[i] = cos((2 * float(i) + 1) * PI / 2 / n);
}
}
//first,give the cmp Tn(x) function use recursion
float CmpChebyshevpoly(const int n, float x)
{
if (n == 0)
return 1;
if (n == 1)
return x;
return 2 * x * CmpChebyshevpoly(n - 1, x) - CmpChebyshevpoly(n - 2, x);
}
//second,cmp the chebyshev coe and store it in ck,ck length is N+1,as from 0-N
//the N is the order of Chebyshev poly
void CmpChebyshevCoe(float (*fun)(float), float* ck, const int N)
{
//cons the zero of N-degree poly,so it has N+1 zero
float* xpt;
float val = 0;
xpt = MallocArr(N + 1);
ChebyshevNodes(N + 1, xpt);
for (int i = 0; i <= N; ++i)
{
val += fun(xpt[i]);
}
ck[0] = val / (N + 1);
for (int i = 1; i <= N; ++i)
{
val = 0;
for (int j = 0; j <= N; ++j)
{
val += fun(xpt[j]) * cos(i * PI * (2 * j + 1) / (2 * N + 2));
}
ck[i] = val * 2 / (N + 1);
}
}
//third,cons the cmp chebyshev poly of N-degree function in the x
float ChebyshevApproximation(float* ck, float x, const int N)
{
float val = 0;
//have N+1 item
for (int i = 0; i <= N; ++i)
{
val += ck[i] * CmpChebyshevpoly(i, x);
}
return val;
}
根据前面对于切比雪夫逼近多项式的描述,即通过构造有理逼近,使得在给定区间上其误差小于多项式逼近的误差,并通过其他方式推知其他区间上的值,通常,这个逼近的区间为一个小区间。其中帕德方法要求 f ( x ) f(x) f(x)及其导数在 x = 0 x=0 x=0处连续。
其大致流程为
因此,以下通过对以下实例进行仿真实验进行实现,观察其逼近效果
1、
X=-2:0.01:2;
%the real function
fx=exp(X);
%the taylor polynomial
T4=1+X+(X.^2)/2+(X.^3)/6+(X.^4)/24;
%the pade polynomial
R22=1+12./((12./X)-6+X.*X);
%plot figure
plot(X,fx,'k-');
hold on;
plot(X,T4,'r--');
hold on;
plot(X,R22,'g.-');
legend('f(x)=e^x','T_4(x)','R_2_,_2(x)');
xlabel('x');
ylabel('y');
axis([-2.5,2.5,-0.2,10]);
grid on;
2、
X=-pi/2:0.01:pi/2;
%the real function
fx=tan(X);
%the taylor polynomial
T9=X+X.^3/3+2*X.^5/15+17*X.^17/315+62*X.^9/2835;
%the pade polynomial
R54=(945*X-105*X.^3+X.^5)./(945-420*X.^2+15*X.^4);
%plot figure
plot(X,fx,'k-');
hold on;
plot(X,T9,'r--');
hold on;
plot(X,R54,'g--');
legend('f(x)=tan(x)','T_9(x)','R_5_,_4(x)');
xlabel('x');
ylabel('y');
axis([-pi,pi,-100,100]);
grid on;
实验具体数据结果在文末链接中,大家可以自行下载验证。其中,各个算法的计算结果均正确,且算法收敛速度依次为 牛顿-拉弗森方法 > 试值法 > 二分法。因此可以看出,根据牛顿-拉弗森方法的原理,其收敛速度还与方程解附近的函数斜率有关,并不是所有情况下其收敛速度都会较快,具有严重的依赖性。当函数性质不太良好时,可能其收敛速度会低于两外两种方法。因此,在实际运用中,还应考虑函数的特性。
由图可以看出,当 s i n ( x ) sin(x) sin(x)的在原点的麦克劳林多项式随着阶数的增加误差逐渐减小。由图6可以直观地看出,在区间 [ − 1 , 1 ] [-1,1] [−1,1]上,5阶、7阶、9阶的泰勒多项式逼近的效果都特别良好,在此区间上几乎可以近似 s i n ( x ) sin(x) sin(x)的取值。然而,表1和表2给出的数据可以更直观地看出,随着阶数的增加,在区间内相同点的误差呈指数下降,即精度呈指数型上升,因此可以推得,随着阶数趋近于无穷大,泰勒多项式逼近的误差逐渐趋于无穷小,泰勒多项式逼近具有良好的效果。
由表4可以看出,虽然并不知道温度随时间变化的关系式,但是可以看出拉格朗日插值多项式的近似的取值情况是非常近似以及合理的,考虑到温度在正常情况下不会突变,因此利用此结果计算在题目所给时间段内的平均值为64.5华氏度,与题目所给表格的计算结果一致,因此可以初步判断其逼近程度是非常好的。由于拉格朗日多项式是N次幂多项式,因此在使用内插值的时候可以发现近似结果是可以接受的,但是在自变量较大时则会出现明显的失真情况,因此计算的误差的一大来源即是此原因。
因此利用程序计算在10时的时候拉格朗日多项式的近似结果,结果为240华氏度.虽然并不知道此时的温度,但是显然计算结果是错误的!因此,可以更加肯定拉格朗日多项式在外插值的时候的逼近效果并不良好,也进一步验证了拉格朗日多项式的误差的一大来源。
由表5可以看出,随着切比雪夫多项式的切比雪夫节点的个数的增加,多项式逼近的误差逐渐减小。通过采取区间[-1,1]上的100个样本点,可以直观地看出,在相同的采样点处的切比雪夫多项式逼近的误差呈指数级减小,逼近的精度呈指数级上升。根据切比雪夫多项式逼近的误差范围的公式以及实验得到的结果可以看出,随着切比雪夫点的增加,即切比雪夫多项式阶数的增加,其误差逐渐减小。因此,可以通过给定的精度选取切比雪夫节点的个数,从而获得一定阶数的切比雪夫逼近多项式,并且获得良好的逼近的效果。
由表6可以看出,在给定的小区间范围内,帕德逼近的效果是非常好的。并且通过计算示例二的帕德逼近与泰勒逼近的误差,可以明显的看出,帕德逼近在小区间上的逼近效果要远远优于泰勒逼近。由图7和图8可以看出,在区间[-1,1]之外,帕德逼近明显的没有泰勒多项式逼近效果好,甚至出现了严重的失真!因此,实验结果更加证明了帕德逼近的小区间逼近优势与缺点。
通过分析各种逼近方法以及逼近多项式的求解过程,可以发现各种逼近方式都有各自的优点以及局限。其中,泰勒多项式逼近具有良好的效果,也是科学计算中经常使用的一种逼近手段,通过增加展开的阶数可以是误差指数级减小,但是局限性也很明显,那就是需要函数在展开点N阶可导,然而如此苛刻的条件是大多数函数都不满足的,即使满足也不能够轻易求解,而且在使用外插值法的时候,其逼近的精度更加不能保证;拉格朗日多项式逼近可以通过增加插值点的个数从而提高逼近的精度,其中切比雪夫点的逼近效果要明显由于等距节点的效果,但是由于多项式难以求解,计算复杂且没有递推公式,从而大大提高了计算复杂度,而且其逼近精度严重依赖于插值点的个数,因此,随着精度的提升,其不可避免会带来计算复杂度的大幅度的增加;切比雪夫多项式逼近的效果良好,而且在拉格朗日多项式的基础上不仅简化了计算步骤,更提高了逼近的精度,其表现为使用切比雪夫点的拉格朗日多项式逼近误差的稳定;帕德逼近在小区间上逼近效果非常良好,由实验结果看出来其误差微乎其微,但是最大的限制就是只能在小区间上进行逼近,限制很大。
综上所述,当面对不同的实际问题的时候,应当根据问题的需求以及条件选取最适合的逼近的方案,利用不同的逼近方法的特点以及不足,选取最能够实际应用的逼近方法。
各章算法源代码(C++)