Halo

A magic place for coding

0%

拉格朗日插值分析与实现

介绍

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

分析

  假设已知n+1个节点,这样就可以构造n次多项式Ln(x),其中Ln(x)满足
Ln(xj)=yi,j=0,1,,n.
也就是说,插值多项式在已知节点上的值必须是和已知值相等的。
  然后我们就需要构造一个完整的插值多项式Ln(x)。构造Ln(xj)的一个思路是使用y0,y1,,yn这些点的线性组合,我们就需要定义n次插值的基函数lj(x)(j=0,1,,n),它满足
lj(xk)={1,k=j, 0,kj 
通过推导,这里直接给出n次插值基函数的形式:
lk(x)=(xx0)(xxk1)(xxk+1)(xxn)(xkx0)(xkxk1)(xkxk+1)(xkxn),k=0,1,,n
故我们可以得出完整的拉格朗日插值多项式
Ln(xj)=k=0nyklk(xj)=yj,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

Powered By Valine
v1.5.2