拉格朗日插值法python实现

476 阅读1分钟

@TOC 本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1、原理

对某个多项式函数有已知的k+1个点,假设任意两个不同的都互不相同,那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为:

L(x)=j=0kyjj(x)L(x)=\sum_{j=0}^{k} y_{j} \ell_{j}(x)

其中每个j(x)\ell_{j}(x)为拉格朗日基本多项式(或称插值基函数),其表达式为:

j(x)=i=0,ijkxxixjxi=(xx0)(xjx0)(xxj1)(xjxj1)(xxj+1)(xjxj+1)(xxk)(xjxk)\ell_{j}(x)=\prod_{i=0, i \neq j}^{k} \frac{x-x_{i}}{x_{j}-x_{i}}=\frac{\left(x-x_{0}\right)}{\left(x_{j}-x_{0}\right)} \cdots \frac{\left(x-x_{j-1}\right)}{\left(x_{j}-x_{j-1}\right)} \frac{\left(x-x_{j+1}\right)}{\left(x_{j}-x_{j+1}\right)} \cdots \frac{\left(x-x_{k}\right)}{\left(x_{j}-x_{k}\right)}

例如:当k=3时,上面的公式变为:

f(x)=(xx1)(xx2)(xx3)(x0x1)(x0x2)(x0x3)y0+(xx0)(xx2)(xx3)(x1x0)(x1x2)(x1x3)y1+(xx0)(xx1)(xx3)(x2x0)(x2x1)(x2x3)y2+(xx0)(xx1)(xx2)(x3x0)(x3x1)(x3x2)y3f(x)=\frac{\left(x-x_{1}\right)\left(x-x_{2}\right)\left(x-x_{3}\right)}{\left(x_{0}-x_{1}\right)\left(x_{0}-x_{2}\right)\left(x_{0}-x_{3}\right)} y_{0}+\frac{\left(x-x_{0}\right)\left(x-x_{2}\right)\left(x-x_{3}\right)}{\left(x_{1}-x_{0}\right)\left(x_{1}-x_{2}\right)\left(x_{1}-x_{3}\right)} y_{1}+\frac{\left(x-x_{0}\right)\left(x-x_{1}\right)\left(x-x_{3}\right)}{\left(x_{2}-x_{0}\right)\left(x_{2}-x_{1}\right)\left(x_{2}-x_{3}\right)} y_{2}+\frac{\left(x-x_{0}\right)\left(x-x_{1}\right)\left(x-x_{2}\right)}{\left(x_{3}-x_{0}\right)\left(x_{3}-x_{1}\right)\left(x_{3}-x_{2}\right)} y_{3}

2、涉及的Python库

主要依赖于scipy

from scipy.interplotate import lagrange

直接调用lagrange(x,y)这个函数即可,返回 一个对象。参数x,y分别是对应各个点的x值和y值:例如

(1,2) (3,5) (5,9)这三个点的x,y分别是: x =[1,3,5]y =[2, 5, 9] a = lagrange(x,y),直接输出该对象,就能看到插值的函数。

利用该对象,能得到很多特性。具体参见:docs.scipy.org/doc/numpy-1…+docs.scipy.org/doc/scipy-1…

继续上面的例子:

  • a.order得到阶
  • a[]得到系数
  • a()得到对应函数值
  • 此外可以对其进行加减乘除运算

3、例子

from scipy.interpolate import lagrange
x=[1,2,3,4,7]
y=[5,7,10,3,9]
a=lagrange(x,y)
print('插值函数\n',a)
print('\n==============================\n插值函数的阶数',a.order)
print('\n==============================\nx=1对应函数y值{},\nx=2对应函数y值{},\nx=3对应函数y值{}'.format(a(1),a(2),a(3)))
print('\n==============================\n常数项系数{},\n二阶项系数{},\n三阶项系数{}'.format(a[0],a[2],a[3]))

在这里插入图片描述 尝试同时输出多个y值

x=[1,2,3,4,7]
a(x)

在这里插入图片描述