拉格朗日插值原理
已知,以及X对应的通过公式
得到若干个基函数,再将每个基函数乘以对应的后相加
从上式可以看出,当时,;而当时,
即满足条件
最终可以得到下式,可以看出,该多项式函数必然通过所有的节点,而这也是所有插值函数的一个特点
为方便书写,我们引入记号
则不难得到
此时,拉格朗日基函数可改写为
从而拉格朗日插值多项式可改写为
拉格朗日插值余项
插值余项是由实际函数减去插值多项式函数所得到的
其作用是估计插值的误差
关于插值余项,它满足一下定理:
设在区间上连续,在内存在,为在节点上满足插值条件
的多项式,则对任何,其插值余项为
其中且依赖于
例题
给出节点处的函数值为,要求计算出它的拉格朗日插值多项式,并计算的值
由以上节点,我们可以求出它们的基函数分别为:
则所求的拉格朗日插值多项式为
进而有
python代码实现
#python代码
#首先定义拉格朗日插值多项式函数
def lagrange(x0,y0,x,n = 1):
'''
x0,y0:训练数值
x:预测数值
n:拉格朗日插值多项式次数,例:n=1,线性函数。默认参数:1
return:x对应函数y的取值
'''
assert len(x0)>=2,'The length of x0 and y0 must be greater than or equal to 2'
assert len(x0)==len(y0),"'x0' and 'y0' must be the same length"
Ls = []
for i in range(len(x)):
L = 0
for j in range(n+1):
l_u = 1
l_d = 1
for k in range(n+1):
if j == k:
continue
l_u *= (x[i]-x0[k])
l_d *= (x0[j]-x0[k])
L += y0[j]*(l_u/l_d)
Ls.append(L)
return Ls
#导入数据
x0 = [-1,1,2]
y0 = [2,1,3]
x = [0.5]
#预测结果
Ls = lagrange(x0,y0,x,n = 2)
print(Ls)
matlab代码实现
%matlab代码实现
%定义函数
%x为节点,y为x对应的函数值,x0为预测数值,k为多项式次数
%返回x0对应的数值y
function y = lagrange(x,y,x0,k)
syms x_1;
L = 0;
for i = 1:k+1
X = 1;
J = 1;
for ii = 1:k+1
if x(i)~=x(ii)
X = X*(x_1-x(ii));
J = J*(x(i)-x(ii));
else
continue
end
end
L = L + (X/J)*y(i);
end
y = double(subs(L,x_,x0));
end
%导入数据
format long
x = [-1 1 2];
y = [2 1 3];
x0 = 0.5;
y_predict = lagrange(x,y,x0,2);
disp(y_predict)