Halo

A magic place for coding

0%

拉格朗日插值分析与实现

介绍

  在实际生活中,我们常常需要通过观测来获取某些数据,这些数据有时候是连续的,有时候却是离散的,对于这些数据,我们希望找到一个方便运算的函数$P(x)$能接近真实的函数$f(x)$,求得这个$P(x)$的过程就叫插值。插值的方法有很多种,这里重点介绍拉格朗日插值

分析

  假设已知n+1个节点,这样就可以构造n次多项式$L_n(x)$,其中$L_n(x)$满足
$$
L_n(x_j) = y_i, j=0,1,…,n.
$$
也就是说,插值多项式在已知节点上的值必须是和已知值相等的。
  然后我们就需要构造一个完整的插值多项式$L_n(x)$。构造$L_n(x_j)$的一个思路是使用$y_0, y_1,…,yn$这些点的线性组合,我们就需要定义n次插值的基函数$l_j(x)(j=0,1,…,n)$,它满足
$$
l_j(x_k) = \begin{cases}
1, k = j,\
0, k \ne j\
\end{cases}
$$
通过推导,这里直接给出n次插值基函数的形式:
$$
l_k(x) = \frac{(x-x_0)\dots(x-x_{k-1})(x-x_{k+1})\dots(x-x_n)}{(x_k-x_0)\dots(x_k-x_{k-1})(x_k-x_{k+1})\dots(x_k-x_n)}, k = 0,1,…,n
$$
故我们可以得出完整的拉格朗日插值多项式
$$
L_n(x_j)=\sum^n_{k=0}y_kl_k(x_j) = y_j, j=0,1,…,n
$$

代码实现

  这里给出的是一个拉格朗日插值函数,输入一系列插值点,以及要求的点,然后函数输出一个插值后的结果。
Matlab代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
% 拉格朗日插值
function [y0] = Lagrange(x,y,x0)
format long;
% x,y是给出的插值点,x0是要求的值
y0 = 0;
n = length(x);
l = ones(1,n); % 插值基函数
for k = 1:n
for j = 1:n
if j ~= k
l(k) = l(k)*(x0-x(j))/(x(k) - x(j)); % 计算每一个插值基函数
end
end
end

% 求解
for i = 1:n
y0 = y0 + y(i)*l(i);
end

小结

  拉格朗日插值多项式的次数决定着插值结果的精确程度,也就说输入的点越多,插值的结果就越精确。
  拉格朗日插值法是众多插值法中比较简单的一种,其精确度也较高,实现起来比较容易。除此之外,还有牛顿插值法等方法,等我理解了后再和大家分享。拉格朗日插值法的分析与实现就到这里了,谢谢!


参考资料:

1.数值分析(第5版) 李庆扬,王能超,易大义

Welcome to my other publishing channels