拉格朗日插值原理讲解及代码实现

 

拉格朗日插值原理

已知拉格朗日插值原理讲解及代码实现,以及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)

 

 

上一篇:直线绘制算法


下一篇:第二次作业