插值,不论在数学中的数值分析中,还是在我们实际生产生活中,都不难发现它的身影,比如造船业和飞机制造业中的三次样条曲线。那么,什么是插值呢?我们可以先看一下插值的定义,如下:
(定义)如果对于每个\(1 \leq i \leq n,P(x_{i})=y_{i}\),则称函数\(y=P(x)\)插值数据点\((x_{1},y_{1}),...,(x_{n},y_{n})\).
插值的定义无疑是清楚明了的,而在众多的数学函数中,多项式无疑是最简单,最常见的函数,关于它的理论研究也最为透彻。因此,我们可以不妨先考虑利用多项式来进行插值。那么,这样的多项式是否总是存在呢?答案是肯定的,因为我们有如下定理:
(多项式插值定理)令\((x_{1},y_{1}),...,(x_{n},y_{n})\)是平面中的\(n\)个点,各\(x_{i}\)互不相同。则有且仅有一个\(n-1\)次或者更低的多项式\(P\)满足\(P(x_{i})=y_{i},i=1,2,...,n.\)
证明:先用归纳法证明存在性,再证明唯一性。
当\(n=1\)时,常函数(0次)\(P_{1}(x)=x_{1}\)即符合要求。假设当\(n-1\)时存在一个次数\(\leq n-2\)的多项式\(P_{n-1}\),使得\(P_{n-1}(x_{i})=y_{i},i=1,2,...,n-1.\)则令\(P_{n}(x)=P_{n-1}(x)+c(x-x_{1})(x-x_{2})...(x-x_{n-1})(x-x_{n})\),其中\(c\)为待定系数,利用\(P_{n}(x_{n})=y_{n}\)即可求出待定系数\(c\).此时,\(P_{n}(x_{i})=y_{i},i=1,2,...,n,\)且\(P_{n}(x)\)的次数\(\leq n-1\).这样就证明了存在性。
其次证明唯一性。假设存在两个这样的多项式,设为\(P(x)\)和\(Q(x)\),它们次数\(\leq n-1\)且都插值经过\(n\)个点,即\(P(x_{i})=Q(x_{i})=y_{i},i=1,2,...,n.\)令\(H(x)=P(x)-Q(x)\),\(H\)的次数也\(\leq n-1\),且有\(n\)个不同的根\(x_{1},x_{2},...,x_{n}\).因此,由多项式基本定理可知,\(H(x)\)为0多项式,即恒等于0,故有\(P(x)=Q(x)\).这样就证明了存在性。
证毕。
有了以上定理,我们可以放心地使用多项式进行插值,同时,通过上述定理,我们可以用归纳法来构造此多项式,但是,这样的方法难免复杂麻烦。于是,天才的法国数学家拉格朗日(Lagrange)创造性地发明了一种实用的插值多项式方法来解决这个问题,那么,他的方法是怎么样的?
一般来说,如果我们有\(n\)个点\((x_{1},y_{1}),...,(x_{n},y_{n})\),各\(x_{i}\)互不相同。对于1到n之间的每个\(k\),定义\(n-1\)次多项式
\[L_{k}(x) = \frac{(x-x_{1})..(x-x_{k-1})(x-x_{k+1})...(x-x_{n})}{(x_{k}-x_{1})..(x_{k}-x_{k-1})(x_{k}-x_{k+1})...(x_{k}-x_{n})}\]
\(L_{k}(x)\)具有有趣的性质:\(L_{k}(x_{k})=1,L_{k}(x_{j})=0,j\neq k.\)然后定义一个\(n-1\)次多项式
\[P_{n-1}(x)=y_{1}L_{1}(x)+...+y_{n}L_{n}(x).\]
这样的多项式\(P_{n-1}(x)\)满足\(P_{n-1}(x_{i})=y_{i},i=1,2,...,n.\)这就是著名的拉格朗日插值多项式!
以上就是拉格朗日插值多项式的理论介绍部分,接下来我们就要用Python中的Sympy模块来实现拉格朗日插值多项式啦~~
实现拉格朗日插值多项式的Python代码如下:
from sympy import * def Lagrange_interpolation(keys, values): x = symbols('x') t = len(keys) ploy = [] for i in range(t): lst = ['((x-'+str(_)+')/('+str(keys[i])+'-'+str(_)+'))' for _ in keys if _ != keys[i]] item = '*'.join(lst) ploy.append(str(values[i])+'*'+item) ploy = '+'.join(ploy) return factor(expand(ploy)) def main(): #example 1, interpolation a line x_1 = [1,2] y_1 = [3,5] if len(x_1) != len(y_1): print('The lengths of two list are not equal!') else: print('Lagrange_interpolation polynomials is:') print(Lagrange_interpolation(x_1,y_1)) #example 2, interpolation a parabola x_2 = [0,2,3] y_2 = [1,2,4] if len(x_2) != len(y_2): print('The lengths of two list are not equal!') else: print('Lagrange_interpolation polynomials is:') print(Lagrange_interpolation(x_2,y_2)) #example 3 x_2 = [0,1,2,3] y_2 = [2,1,0,-1] if len(x_2) != len(y_2): print('The lengths of two list are not equal!') else: print('Lagrange_interpolation polynomials is:') print(Lagrange_interpolation(x_2,y_2)) main()