数值分析(三) Lagrange(拉格朗日)插值法及Matlab代码实现

目录

  • 前言
  • 一、Lagrange(拉格朗日)插值
    • 1. 线性插值
    • 2. 抛物插值
    • 3. 拉格朗日插值多项式
  • 二、Lagrange插值算法及matlab代码
    • 1. Lagrange 插值算法matlab实现
    • 2 实例
    • 3. 线性插值示意图代码
    • 4. 抛物插值示意图代码
  • 三、总结
  • 四、插值法专栏

前言

  本篇为插值法专栏第三篇内容讲述,此章主要讲述 Lagrange(拉格朗日)插值法及matlab代码,其中也给出详细的例子让大家更好的理解Lagrange插值法
提示 之前已经介绍牛顿插值法三次样条插值,如果没看过前两篇的可以点击以下链接阅读

  1. 数值分析(一)牛顿插值法
  2. 数值分析(二)三次样条插值法
  3. 数值分析(二续) 三次样条插值二类边界完整matlab代码
  4. 数值分析(三) Lagrange(拉格朗日)插值法及Matlab代码实现
  5. 数值分析(四) Hermite(埃尔米特)插值法及matlab代码

一、Lagrange(拉格朗日)插值

  为了构造满足插值条件 p ( x i ) = f ( x i ) , ( i = 0 , 1 , 2 , … , n ) p(x_i) = f(x_i), (i=0, 1, 2, \dots, n) p(xi)=f(xi),(i=0,1,2,,n)的便于使用的插值多项式 P ( x ) P(x) P(x) ,在介绍Lagrange插值前先补充一下 线性插值抛物插值 的知识点。

1. 线性插值

   线性插值是代数插值的最简单形式。假设给定了函数 f ( x ) f(x) f(x) 在两个互异的点的值, x 0 , x 1 , y 0 = f ( x 0 ) , y 1 = f ( x 1 ) x_0, x_1, y_0 = f(x_0), y_1 = f(x_1) x0,x1,y0=f(x0),y1=f(x1) ,现要求用线性函数 p ( x ) = a x + b p(x) = ax+b p(x)=ax+b 近似的代替 f ( x ) f(x) f(x)。选择参数 a a a b b b, 使 p ( x i ) = f ( x i ) , ( i = 0 , 1 ) p(x_i) = f(x_i), (i=0, 1) p(xi)=f(xi),(i=0,1)。称这样的线性函数 P ( x ) P(x) P(x) f ( x ) f(x) f(x) 的线性插值函数。
   线性插值的几何意义:用通过点 A ( x 0 , f ( x 0 ) ) A(x_0, f(x_0)) A(x0,f(x0)) B ( x 1 , f ( x 1 ) ) B(x_1, f(x_1)) B(x1,f(x1)) 的直线近似地代替曲线 y = f ( x ) y=f(x) y=f(x) 由解析几何知道,这条直线用点斜式表示为(如下图所示): p ( x ) = y 0 + y 1 − y 0 x 1 − x 0 ( x − x 0 ) → p ( x ) = x − x 1 x 0 − x 1 y 0 + x − x 0 x 1 − x 0 y 1 p(x) = {y_0} + \frac{{{y_1} - {y_0}}}{{{x_1} - {x_0}}}(x - {x_0}) \to p(x) = \frac{{x - {x_1}}}{{{x_0} - {x_1}}}{y_0} + \frac{{x - {x_0}}}{{{x_1} - {x_0}}}{y_1} p(x)=y0+x1x0y1y0(xx0)p(x)=x0x1xx1y0+x1x0xx0y1
在这里插入图片描述

为了便于推广,那么记 l 0 ( x ) = x − x 1 x 0 − x 1 , l 1 ( x ) = x − x 0 x 1 − x 0 l_0(x) = \frac{x-x_1}{x_0-x_1}, l_1(x) = \frac{x-x_0}{x_1-x_0} l0(x)=x0x1xx1,l1(x)=x1x0xx0这是一次函数,具有如下性质 l 0 ( x 0 ) = 1 , l 0 ( x 1 ) = 0 , l 1 ( x 0 ) = 0 l 1 ( x 1 ) = 1 l 0 ( x ) + l 1 ( x ) = 1 \begin{matrix} l_0(x_0)=1, & l_0(x_1)=0, \\ l_1(x_0) = 0 & l_1(x_1) = 1\end{matrix} \\ l_0(x)+l_1(x) =1 l0(x0)=1,l1(x0)=0l0(x1)=0,l1(x1)=1l0(x)+l1(x)=1
那么可以记为: l k ( x i ) = δ k i = { 1 ( i = k ) 0 ( i ≠ k ) l_k(x_i) = \delta_{ki}= \left\{\begin{matrix} 1 & (i=k)\\0 &(i \ne k) &\end{matrix}\right. lk(xi)=δki={10(i=k)(i=k)那么 l 0 ( x ) l_0(x) l0(x) l 1 ( x ) l_1(x) l1(x) 称为线性插值基函数,且有 l k ( x ) = ∏ j = 0 , j ≠ k 1 x − x j x k − x j , ( k = 0 , 1 ) l_k(x) = \prod_{j=0,j \ne k}^{1}\frac{x-x_j}{x_k-x_j}, (k=0,1) lk(x)=j=0,j=k1xkxjxxj,(k=0,1) 则上述线性插值函数可以表示为与基函数的线性组合 p ( x ) = l 0 ( x ) y 0 + l 1 ( x ) y 1 p(x) = l_0(x)y_0 + l_1(x)y_1 p(x)=l0(x)y0+l1(x)y1

2. 抛物插值

  抛物插值又称二次插值,它也是常用的代数插值之一。设已知 f ( x ) f(x) f(x) 在三个互异点 x 0 , x 1 , x 2 x_0, x_1, x_2 x0,x1,x2的函数值 y 0 , y 1 , y 2 y_0, y_1, y_2 y0,y1,y2,要构造次数不超过二次的多项式
P ( x ) = a 2 x 2 + a 1 x + a 0 P(x) = a_2x^2 + a_1x + a_0 P(x)=a2x2+a1x+a0 使满足二次插值条件: P ( x i ) = y i ( i = 0 , 1 , 2 ) P(x_i) = y_i (i=0,1,2) P(xi)=yi(i=0,1,2) 这就是二次插值问题。其几何意义是用经过3个点 ( x 0 , y 0 ) , ( x 1 , y 1 ) , ( x 2 , y 2 ) (x{}_0,{y_0}),(x{}_1,{y_1}),(x{}_2,{y_2}) (x0,y0),(x1,y1),(x2,y2) 的抛物线 y = P ( x ) y=P(x) y=P(x) 近似代替曲线 y = f ( x ) y = f(x) y=f(x) , 如下图所示。因此也称之为抛物插值。

在这里插入图片描述

线性插值抛物插值 两个示意图使用matlab绘制,并借助使用了 slandarer 大佬的一个绘制带箭头的坐标轴工具箱,代码将在下方给出

其中 P ( x ) P(x) P(x) 的参数 a 0 , a 1 , a 2 a_0,a_1,a_2 a0,a1,a2 直接由插值条件决定,即 a 0 , a 1 , a 2 a_0,a_1,a_2 a0,a1,a2 满足下面的代数方程组: { a 0 + a 1 x 0 + a 2 x 0 2 = y 0 a 0 + a 1 x 1 + a 2 x 1 2 = y 1 a 0 + a 1 x 2 + a 2 x 2 2 = y 2 \left\{ \begin{array}{l} {a_0} + {a_1}{x_0} + {a_2}x_0^2 = {y_0}\\ {a_0} + {a_1}{x_1} + {a_2}x_1^2 = {y_1}\\ {a_0} + {a_1}{x_2} + {a_2}x_2^2 = {y_2} \end{array} \right. a0+a1x0+a2x02=y0a0+a1x1+a2x12=y1a0+a1x2+a2x22=y2 那么其系数矩阵为: [ 1 x 0 x 0 2 1 x 1 x 1 2 1 x 2 x 2 2 ] \left[ {\begin{matrix} 1&{{x_0}}&{x_0^2}\\ 1&{{x_1}}&{x_1^2}\\ 1&{{x_2}}&{x_2^2} \end{matrix}} \right] 111x0x1x2x02x12x22 此行列式是范德蒙行列式,当 x 0 ≠ x 1 ≠ x 2 x_0 \ne x_1 \ne x_2 x0=x1=x2 时,方程组的解唯一,为了与下一节的Lagrange插值公式比较,仿线性插值,用基函数的方法求解方程组,求二次式 l 0 ( x ) l_0(x) l0(x),使其满足条件: l 0 ( x 0 ) = 1 , l 0 ( x 1 ) = 0 , l 0 ( x 2 ) = 0 l_0(x_0)=1, l_0(x_1)=0,l_0(x_2)=0 l0(x0)=1,l0(x1)=0,l0(x2)=0,于是可以知道 x 1 , x 2 x_1,x_2 x1,x2 l 0 ( x ) l_0(x) l0(x) 的两个零点,则 l 0 ( x ) = c ( x − x 1 ) ( x − x 2 ) {l_0}(x) = c(x - {x_1})(x - {x_2}) l0(x)=c(xx1)(xx2)再由另一个条件 l 0 ( x 0 ) = 1 l_0(x_0)=1 l0(x0)=1解得系数为 c = 1 ( x 0 − x 1 ) ( x 0 − x 2 ) c = \frac{1}{{({x_0} - {x_1})({x_0} - {x_2})}} c=(x0x1)(x0x2)1从而导出 l 0 ( x ) = ( x − x 1 ) ( x − x 2 ) ( x 0 − x 1 ) ( x 0 − x 2 ) {l_0}(x) = \frac{{(x - {x_1})(x - {x_2})}}{{({x_0} - {x_1})({x_0} - {x_2})}} l0(x)=(x0x1)(x0x2)(xx1)(xx2)类似地可以构造出满足条件: l 0 ( x 0 ) = 0 , l 0 ( x 1 ) = 1 , l 0 ( x 2 ) = 0 l_0(x_0)=0, l_0(x_1)=1,l_0(x_2)=0 l0(x0)=0,l0(x1)=1,l0(x2)=0的插值多项式 l 1 ( x ) = ( x − x 0 ) ( x − x 2 ) ( x 1 − x 0 ) ( x 1 − x 2 ) {l_1}(x) = \frac{{(x - {x_0})(x - {x_2})}}{{({x_1} - {x_0})({x_1} - {x_2})}} l1(x)=(x1x0)(x1x2)(xx0)(xx2)以及满足条件 l 0 ( x 0 ) = 0 , l 0 ( x 1 ) = 0 , l 0 ( x 2 ) = 1 l_0(x_0)=0, l_0(x_1)=0,l_0(x_2)=1 l0(x0)=0,l0(x1)=0,l0(x2)=1 的插值多项式 l 2 ( x ) = ( x − x 0 ) ( x − x 1 ) ( x 2 − x 0 ) ( x 2 − x 1 ) {l_2}(x) = \frac{{(x - {x_0})(x - {x_1})}}{{({x_2} - {x_0})({x_2} - {x_1})}} l2(x)=(x2x0)(x2x1)(xx0)(xx1)这样构造出来的 l 0 ( x ) , l 0 ( x ) , l 0 ( x ) l_0(x), l_0(x),l_0(x) l0(x),l0(x),l0(x)称为抛物插值的基函数,取已知数据 y 0 , y 1 , y 2 {y_0},{y_1},{y_2} y0,y1,y2 作为线性组合系数,将基函数 l 0 ( x ) , l 1 ( x ) , l 2 ( x ) {l_0}(x),{l_1}(x),{l_2}(x) l0(x),l1(x),l2(x)线性组合可得 P ( x ) = ( x − x 1 ) ( x − x 2 ) ( x 0 − x 1 ) ( x 0 − x 2 ) y 0 + ( x − x 0 ) ( x − x 2 ) ( x 1 − x 0 ) ( x 1 − x 2 ) y 1 + ( x − x 0 ) ( x − x 1 ) ( x 2 − x 0 ) ( x 2 − x 1 ) y 2 P(x) = \frac{{(x - {x_1})(x - {x_2})}}{{({x_0} - {x_1})({x_0} - {x_2})}}{y_0} + \frac{{(x - {x_0})(x - {x_2})}}{{({x_1} - {x_0})({x_1} - {x_2})}}{y_1} + \frac{{(x - {x_0})(x - {x_1})}}{{({x_2} - {x_0})({x_2} - {x_1})}}{y_2} P(x)=(x0x1)(x0x2)(xx1)(xx2)y0+(x1x0)(x1x2)(xx0)(xx2)y1+(x2x0)(x2x1)(xx0)(xx1)y2容易看出, P ( x ) P(x) P(x)满足条件 P ( x i ) = y i ( i = 0 , 1 , 2 ) P(x_i)=y_i (i=0,1,2) P(xi)=yi(i=0,1,2)

3. 拉格朗日插值多项式

  通过上述描述可以发现,两个插值点可求出一次插值多项式,而三个插值点可求出二次插值多项式。插值点增加到 n + 1 n+1 n+1 个时,也就是通过 n + 1 n+1 n+1 个不同的已知点 ( x i , y i ) ( i = 0 , 1 , ⋯   , n ) ({x_i},{y_i})(i = 0,1, \cdots ,n) (xi,yi)(i=0,1,,n),来构造一个次数为n的代数多项式 P ( x ) P(x) P(x)。与推导抛物插值的基函数类似,先构造一个特殊 n n n 次多项式 l i ( x ) l_i(x) li(x) 的插值问题,使其在各节点 x i x_i xi 上满足 l k ( x 0 ) = 0 , ⋯   , l k ( x k − 1 ) = 0 , l k ( x k ) = 1 , l k ( x k + 1 ) = 0 , ⋯   , l k ( x n ) = 0 {l_k}({x_0}) = 0, \cdots ,{l_k}({x_{k - 1}}) = 0,{l_k}({x_k}) = 1,{l_k}({x_{k + 1}}) = 0, \cdots ,{l_k}({x_n}) = 0 lk(x0)=0,,lk(xk1)=0,lk(xk)=1,lk(xk+1)=0,,lk(xn)=0 l k ( x i ) = δ k i = { 1 ( i = k ) 0 ( i ≠ k ) l_k(x_i)=\delta _{ki}=\left\{\begin{matrix} 1 & (i=k)\\ 0 & (i\ne k) \end{matrix}\right. lk(xi)=δki={10(i=k)(i=k)由条件 l k ( x i ) = 0 , ( i ≠ k ) {l_k}({x_i}) = 0,(i \ne k) lk(xi)=0,(i=k)可知, x 0 , x 1 , ⋯   , x k − 1 , x k + 1 , ⋯   , x n {x_0},{x_1}, \cdots ,{x_{k - 1}},{x_{k + 1}}, \cdots ,{x_n} x0,x1,,xk1,xk+1,,xn 都是 n n n l k ( x ) {l_k}(x) lk(x) 的零点,故可设 l k ( x ) = A k ( x − x 0 ) ( x − x 1 ) ⋯ ( x − x k − 1 ) ( x − x k + 1 ) ⋯ ( x − x n ) {l_k}(x) = {A_k}(x - {x_0})(x - {x_1}) \cdots (x - {x_{k - 1}})(x - {x_{k + 1}}) \cdots (x - {x_n}) lk(x)=Ak(xx0)(xx1)(xxk1)(xxk+1)(xxn)其中 A k A_k Ak为待定常数。有条件 l k ( x k ) = 1 {l_k}({x_k}) = 1 lk(xk)=1,可求得 A k {A_k} Ak为: A k ∏ j = 0 , j ≠ k n ( x k − x j ) = 1 {A_k}\prod_{j = 0,j \ne k}^n {({x_k} - {x_j})} = 1 Akj=0,j=kn(xkxj)=1于是 A k = 1 ∏ j = 0 , j ≠ k n ( x k − x j ) {A_k} = \frac{1}{\prod_{j = 0,j \ne k}^n {({x_k} - {x_j})}} Ak=j=0,j=kn(xkxj)1代入上式,得 l k ( x ) = ∏ j = 0 , j ≠ k n ( x − x j ) ∏ j = 0 , j ≠ k n ( x k − x j ) = ∏ j = 0 , j ≠ k n x − x j x k − x j l_k(x) = \frac{\prod_{j = 0,j \ne k}^n {({x} - {x_j})}}{\prod_{j = 0,j \ne k}^n {({x_k} - {x_j})}} = \prod_{j = 0,j \ne k}^n \frac{{x} - {x_j}}{{x_k} - {x_j}} lk(x)=j=0,j=kn(xkxj)j=0,j=kn(xxj)=j=0,j=knxkxjxxj l k ( x ) {l_k}(x) lk(x)为关于基点 x i x_i xi n n n 次插值基函数 ( i = 0 , 1 , ⋯   , n ) (i=0,1,\cdots,n) (i=0,1,,n),那么以 n + 1 n+1 n+1 n n n次基本插值多项式 l k ( x ) ( k = 0 , 1 , ⋯   , n ) {l_k}(x)(k = 0,1, \cdots ,n) lk(x)(k=0,1,,n)为基础,就能直接写出满足插值条件 P ( x i ) = f ( x i ) ( i = 0 , 1 , 2 , ⋯   , n ) P(x_i)=f(x_i)(i=0,1,2,\cdots,n) P(xi)=f(xi)(i=0,1,2,,n) n n n次代数插值多项式 P ( x ) = l 0 ( x ) y 0 + l 1 ( x ) y 1 + ⋯ + l n ( x ) y n P(x) = {l_0}(x){y_0} + {l_1}(x){y_1} + \cdots + {l_n}(x){y_n} P(x)=l0(x)y0+l1(x)y1++ln(x)yn其中每个插值基函数 l k ( x ) ( k = 0 , 1 , ⋯   , n ) {l_k}(x)(k = 0,1, \cdots ,n) lk(x)(k=0,1,,n)都是 n n n次值多项式,所以他们的线性组合 P ( x ) = ∑ k = 0 n l k ( x ) y k P(x) = \sum\limits_{k = 0}^n {{l_k}(x){y_k}} P(x)=k=0nlk(x)yk
即为 n n n次拉格朗日插值多项式,并记作 L n ( x ) L_n(x) Ln(x),引入 ω n + 1 ( x ) \omega_{n+1}(x) ωn+1(x) ω n + 1 ( x ) = ( x − x 0 ) ( x − x 1 ) ⋯ ( x − x n ) {\omega _{n + 1}}(x) = (x - {x_0})(x - {x_1}) \cdots (x - {x_n}){\rm{ }} ωn+1(x)=(xx0)(xx1)(xxn)那么得到 ω ′ n + 1 ( x k ) = ( x k − x 0 ) ⋯ ( x k − x k − 1 ) ( x k − x k + 1 ) ⋯ ( x k − x n ) {{\omega '}_{n + 1}}({x_k}) = ({x_k} - {x_0}) \cdots ({x_k} - {x_{k - 1}})({x_k} - {x_{k + 1}}) \cdots ({x_k} - {x_n}) ωn+1(xk)=(xkx0)(xkxk1)(xkxk+1)(xkxn) 那么 L n ( x ) L_n(x) Ln(x)可以转化为 L n ( x ) = ∑ k = 0 n y k ω n + 1 ( x ) ( x − x k ) ω ′ n + 1 ( x k ) {L_n}(x) = {\rm{ }}\sum\limits_{k = 0}^n {{y_k}\frac{{{\omega _{n + 1}}(x)}}{{(x - {x_k}){{\omega '}_{n + 1}}({x_k})}}} Ln(x)=k=0nyk(xxk)ωn+1(xk)ωn+1(x)

二、Lagrange插值算法及matlab代码

Matlab 版本号 2022b
根据Lagrange 插值算法构建 lagrange.m文件
为了让代码具有可输出性,让大家通俗易懂,编写了一个lab函数,并构建了lab.m文件

1. Lagrange 插值算法matlab实现

下面展示拉格朗日插值函数代码: lagrange.m(复制代码,保存此名称)

function varargout = lagrange(x0,y0,varargin)
% x0 为节点
% y0 为节点对应的函数值
% x 为插值点
m = length(x0);
L1 = zeros(m,m);
l = [];

% step 1 构造基函数lk
for k = 1 : m
    V = 1;
    for i = 1 : m
        if k ~= i
            V = conv(V,poly(x0(i))) / (x0(k) - x0(i));
        end
    end
    L1(k,:) = V;
    l = cat(1,l,poly2sym(V));
end
fprintf('基函数为:\n');

for k = 1:m
    fprintf(['l',lab(k),'(x)=%s\n'],l(k));fprintf('\n');
end

% 通过矩阵乘积求L(x)
L = y0 * l;
L1 = str2sym(['P(x)=',char(L)]);
disp(L1)
% L = simplify(L1);
S = ['$',latex(L1),'$'];
fprintf('拉格朗日多项式为:\nP(x)=%s\n',L);fprintf('\n');
% symdisp(L)
L = matlabFunction(L);
if nargin == 3
    varargout{1} = feval(L,varargin{1});
    plot(x0,y0,'bo')
    hold on
    plot(varargin{1},varargout{1},'rp')
    plot(min([varargin{1},x0]):0.01:max([varargin{1},x0]),feval(L,min([varargin{1},x0]):0.01:max([varargin{1},x0])),'k-','LineWidth',1)
    subtitle(S,'Interpreter','latex','FontSize',14)
    title('Lagrange插值','FontSize',14)
    legend('原始点','插值点','插值函数P(x)')
else
plot(x0,y0,'bo')
hold on
plot(min(x0):0.01:max(x0),feval(L,min(x0):0.01:max(x0)),'k-','LineWidth',1)
subtitle(S,'Interpreter','latex','FontSize',14)
title('Lagrange插值','FontSize',14)
legend('原始点','插值函数P(x)')
end
end

下面展示lab代码: lab.m(复制代码,保存此名称)

function label = lab(k)
name = {'₀','₁','₂','₃','₄','₅','₆','₇','₈','₉'};
label = '';
k=k-1;
if k == 0
    label = name{k+1};
else
    while 1
        if mod(k,10)==0 && floor(k/10)==0
            break
        end
        j = mod(k,10);
        k = floor(k/10);
        label = cat(2,name{j+1},label);
    end
end
end

2 实例

  话不多说,直接讲述lagrange函数使用说明

  1. lagrange(x0,y0): 输入参数只有2个时,x0 为节点,y0 为节点对应的函数值;自动输出:基函数拉格朗日多项式插值函数图像
  2. y = lagrange(x0,y0,x): 输入参数为3个时,x0 为节点,y0 为节点对应的函数值,x 为插值点;输出:y为插值点对应函数值,自动输出:基函数拉格朗日多项式插值函数图像

示例展示一下:
  已知 f ( x ) f(x) f(x) 的观测数据为如下表所示,并构造Lagrange插值多项式

x x x0124
f ( x ) f(x) f(x)19233

手动计算一下,四个点可构造三次Lagrange插值多项式,其基函数为:
l 0 ( x ) = ( x − 1 ) ( x − 2 ) ( x − 4 ) ( 0 − 1 ) ( 0 − 2 ) ( 0 − 4 ) = − 1 8 x 3 + 7 8 x 2 − 7 4 x + 1 {l_0}(x) = \frac{{(x - 1)(x - 2)(x - 4)}}{{(0 - 1)(0 - 2)(0 - 4)}} = - \frac{1}{8}{x^3} + \frac{7}{8}{x^2} - \frac{7}{4}x + 1 l0(x)=(01)(02)(04)(x1)(x2)(x4)=81x3+87x247x+1 l 1 ( x ) = ( x − 0 ) ( x − 2 ) ( x − 4 ) ( 1 − 0 ) ( 1 − 2 ) ( 1 − 4 ) = 1 3 x 3 − 2 x 2 + 8 3 x {l_1}(x) = \frac{{(x - 0)(x - 2)(x - 4)}}{{(1 - 0)(1 - 2)(1 - 4)}} = \frac{1}{3}{x^3} - 2{x^2} + \frac{8}{3}x l1(x)=(10)(12)(14)(x0)(x2)(x4)=31x32x2+38x l 2 ( x ) = ( x − 0 ) ( x − 1 ) ( x − 4 ) ( 2 − 0 ) ( 2 − 1 ) ( 2 − 4 ) = − 1 4 x 3 + 5 4 x 2 − x {l_2}(x) = \frac{{(x - 0)(x - 1)(x - 4)}}{{(2 - 0)(2 - 1)(2 - 4)}} = - \frac{1}{4}{x^3} + \frac{5}{4}{x^2} - x l2(x)=(20)(21)(24)(x0)(x1)(x4)=41x3+45x2x l 3 ( x ) = ( x − 0 ) ( x − 1 ) ( x − 2 ) ( 4 − 0 ) ( 4 − 1 ) ( 4 − 2 ) = 1 24 x 3 − 1 8 x 2 + 1 12 x {l_3}(x) = \frac{{(x - 0)(x - 1)(x - 2)}}{{(4 - 0)(4 - 1)(4 - 2)}} = \frac{1}{{24}}{x^3} - \frac{1}{8}{x^2} + \frac{1}{{12}}x l3(x)=(40)(41)(42)(x0)(x1)(x2)=241x381x2+121x那么Lagrange插值多项式为: L 3 ( x ) = ∑ k = 0 3 y k l k ( x ) = l 0 ( x ) + 9 l 1 ( x ) + 23 l 2 ( x ) + 3 l 3 ( x ) = − 11 4 x 3 + 45 4 x 2 − 1 2 x + 1 \begin{array}{c} {L_3}(x) = \sum\limits_{k = 0}^3 {{y_k}} {l_k}(x) = {l_0}(x) + 9{l_1}(x) + 23{l_2}(x) + 3{l_3}(x) = - \frac{{11}}{4}{x^3} + \frac{{45}}{4}{x^2} - \frac{1}{2}x + 1 \end{array} L3(x)=k=03yklk(x)=l0(x)+9l1(x)+23l2(x)+3l3(x)=411x3+445x221x+1

接下来利用上述lagrange(x0,y0),检验一下,先构建一个叫demo.m文件,接下来复制此代码放入其中,切记要将demo.m`文件、lagrange.m文件和lab.m文件放在一个文件内(新手注意!!!)

x0 = [0 1 2 4];
y0 = [1 9 23 3];
lagrange(x0,y0);

直接启动运行,输出结果如下,发现和手动计算结果一摸一样
在这里插入图片描述
这里代码中还给出了此插值函数的图像
在这里插入图片描述

在上述的基础上需要求出当 x = 1.5 , 2.5 , 3 , 3.5 x={1.5, 2.5, 3, 3.5} x=1.5,2.5,3,3.5时,对应的函数值是什么?复制如下代码直接运行看看结果。

x0 = [0 1 2 4];
y0 = [1 9 23 3];
x = [1.5 2.5 3 3.5];
y = lagrange(x0,y0,x)

输出函数值为:
在这里插入图片描述
在这里插入图片描述

3. 线性插值示意图代码

注意:一定需要有坐标轴工具箱函数否则会报错,请前往上述链接下载。

% 使用了CSDN: Slandarer大佬开源的带箭头的坐标函数包
% 剩余代码由本人撰写
% 此代码为CSDN文章中线性插值示意图代码
% @Author
% Copyright© 2024.3.12
% CSDN name: cugautozp
% GitHub: https://github.com/cug-auto-zp
clc
clear
close all
x=0.2:0.01:1.8;
y=x-exp(x-1);
plot(x,y,'LineWidth',1.5)
% 修改坐标轴属性
ax=gca;
ax.XLim = [0,2];
ax.YLim = [-0.6,0.3];
ax.YTick = [];
ax.XTick = [];
arrowAxes(ax)


x0 = [0.5,1.6];
y0 = x0-exp(x0-1);
hold on
for i=1:length(x0)
    plot(x0(i)*[1,1],[-0.6,y0(i)],'LineStyle','--','LineWidth',1.5,'Color',[0,0,0])
    text(x0(i)+0.05,(-0.6+y0(i))/2,['$y_',num2str(i-1),'$'],'Interpreter','latex','FontSize',15,'Color',[0,0,0])
    text(x0(i),-0.65,['$x_',num2str(i-1),'$'],'Interpreter','latex','FontSize',15,'Color',[0,0,0])
end
plot(x0,y0,'LineStyle','none','Marker','.','MarkerSize',20,'Color',[1,0,0])
t=polyfit(x0,y0,1);
plot(x,polyval(t,x),'-k','LineWidth',1.5)
text(1,0.1,'$y = f(x)$','Interpreter','latex','FontSize',15,'Color',[0.00,0.45,0.74])
text(0.1,0,'$p(x)=ax+b$','Interpreter','latex','FontSize',15,'Color',[0,0,0])
text(x0(1),y0(1)-0.05,'$A(x_0,f(x_0))$','Interpreter','latex','FontSize',15,'Color',[1,0,0])
text(x0(2),y0(2)-0.05,'$B(x_0,f(x_0))$','Interpreter','latex','FontSize',15,'Color',[1,0,0])
title('线性插值示意图','FontSize',14)
text(-0.1,-0.65,'O','FontSize',15,'Color',[0,0,0])

4. 抛物插值示意图代码

% 使用了CSDN: Slandarer大佬开源的带箭头的坐标函数包
% 剩余代码由本人撰写
% 此代码为CSDN文章中抛物插值示意图代码
% @Author
% Copyright© 2024.3.12
% CSDN name: cugautozp
% GitHub: https://github.com/cug-auto-zp

clc
clear
close all
x=0:0.1:20;
y=-0.5*(x-4).^3+15*(x-4)+6*(x-4).^2+5;
plot(x,y,'LineWidth',1.5)


ax=gca;
ax.XLim = [-1,21];
ax.YLim = [-300,300];
ax.YTick = [];
ax.XTick = [];
arrowAxes(ax)


x0 = [3,9,18];
y0 = -0.5*(x0-4).^3+15*(x0-4)+6*(x0-4).^2+5;
hold on
plot(x0,y0,'LineStyle','none','Marker','.','MarkerSize',20,'Color',[1,0,0])
text(-2,-310,'O','FontSize',15,'Color',[0,0,0])
for i=1:length(x0)
    plot(x0(i)*[1,1],[-300,y0(i)],'LineStyle','--','LineWidth',1.5,'Color',[0,0,0])
    text(x0(i)+0.3,(-300+y0(i))/2,['$y_',num2str(i-1),'$'],'Interpreter','latex','FontSize',15,'Color',[0,0,0])
    text(x0(i),-320,['$x_',num2str(i-1),'$'],'Interpreter','latex','FontSize',15,'Color',[0,0,0])
end
t=polyfit(x0,y0,2);
plot(x,polyval(t,x),'-k','LineWidth',1.5)
text(15,200,'$y = f(x)$','Interpreter','latex','FontSize',15,'Color',[0.00,0.45,0.74])
text(3,150,'$y = L_2(x)$','Interpreter','latex','FontSize',15,'Color',[0,0,0])
title('抛物插值示意图')

三、总结

  此次内容主要讲的是拉格朗日插值的原理,及根据原理利用matlab编写一个通用计算公式函数,然后举例来验证代码的正确性。为了方便,这里直接将函数图像,以及中间过程的基函数和最后的插值函数都自动输出,非常方便。如果对拉格朗日插值有兴趣的话可以更加深入的做一做一下实验,还蛮有意思的。
请添加图片描述

四、插值法专栏

专栏链接:插值法专栏,如果对你有帮助的话可以点个赞,点个订阅,我将完善此专栏

  1. 数值分析(一) 牛顿插值法及matlab代码
  2. 数值分析(二) 三次样条插值法matlab程序
  3. 数值分析(二续) 三次样条插值二类边界完整matlab代码
  4. 数值分析(三) Lagrange(拉格朗日)插值法及Matlab代码实现
  5. 数值分析(四) Hermite(埃尔米特)插值法及matlab代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/478007.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

生产计划数据模型,实现能源企业数字化高效管理

随着市场经济的快速发展,能源企业在经济发展中的地位也随之提高。但由于能源企业在生产计划经济管理上存在指标不平衡、市场观念落后和环保意识欠缺等问题,导致企业的经济效益降低。目前,提高企业的生产计划管理是改善能源企业现状最有利的途…

【合合TextIn】深度解析智能文档处理技术与应用

目录 一、智能文档处理介绍 二、文档格式解析 三、图像增强技术解析 四、传统文字识别OCR技术解析 五、深度学习OCR技术解析 六、深度学习版面分析技术解析 七、文档分类 八、信息抽取 九、系统集成:将IDP处理后的数据集成到企业系统 结论 一、智能文档处…

【复杂网络建模】——建模工具Matlab入门

目录 一、认识MATLAB 二、认识工具箱 三、基本操作和函数 3.1 算术操作符 3.2 数学函数 3.3 矩阵操作 3.4 索引和切片 3.5 逻辑操作 3.6 控制流程 3.7 数据输入输出 四、变量和数据类型 4.1 数值类型 4.2 整型 4.3 复数 4.4 字符串 4.5 逻辑类型 4.6 结构体&a…

手机怎么恢复出厂设置?1分钟教会你!

有时候我们可能会遇到一些问题,例如苹果手机系统崩溃、软件故障或者准备出售手机等情况,这时候恢复出厂设置就成了解决问题的一种方法。 然而,许多用户可能认为恢复出厂设置的过程复杂且耗时,因此不愿意尝试。但实际上&#xff0…

JVM类加载过程

过程:加载、验证、准备、解析、初始化 加载阶段 1.通过一个类的全限定名来获取定义此类的二进制字节流。 2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。 3.在Java堆中生成一个代表这个类的java.lang.class对象,作为方法区这些数…

Window全网解析网站下载视频

全网解析网站下载视频 介绍m3u8格式cbox格式 解析视频下载的方法方法一解析视频下载视频 方法二老王浏览器下载使用浏览器解析下载视频 总结 介绍 今天分享一下如何解析网页中的视频进行下载。通常情况下我们打开的某某网站的视频是不提供下载接口的,甚至说你下载了…

基于ssm的实验室耗材管理系统设计与实现论文

摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对实验室耗材信息管理混乱,出错率高,信息安全性…

【爬取网易财经文章】

引言 在信息爆炸的时代,获取实时的财经资讯对于投资者和金融从业者来说至关重要。然而,手动浏览网页收集财经文章耗时费力,为了解决这一问题,本文将介绍如何使用Python编写一个爬虫程序来自动爬取网易财经下关于财经的文章 1. 爬…

bilibili哔哩哔哩视频播放界面鼠标消失视频不能快进问题解决

问题环境: 在电脑哔哩哔哩视频播放鼠标在方框外使用,移动到方框内鼠标光标消失,快进等功能不能使用,严重影响使用体验。 问题解决: 因为使用了类似网页文本复制的插件导致出现这样的故障,删除或者临时关闭…

Python教程92:print实现的3个动画特效(打字机+旋转式进度+覆盖式打印显示)

print() 应该是初学者最先接触到的第一个 Python 函数,因为几乎所有的启蒙课程都是从 print(‘Hello world’) 开始的。事实上, print() 也是程序员使用频率最高的函数之一,同时也是很多程序员喜欢的代码调试利器。 1.打字机效果&#xff0c…

备考ICA----Istio实验4---使用 Istio 进行金丝雀部署

备考ICA----Istio实验4—使用 Istio 进行金丝雀部署 上一个实验已经通过DestinationRule实现了部分金丝雀部署的功能,这个实验会更完整的模拟展示一个环境由v1慢慢过渡到v2版本的金丝雀发布. 1. 环境清理 kubectl delete gw/helloworld-gateway vs/helloworld dr/helloworld…

redis瘦身版

线程模型 纯内存操作/非阻塞io多路复用/单线程避免多线程频繁上下文切换 基于Reactor模式开发了网络事件处理器:文件事件处理器,单线程的 io多路监听多个socket,据socket事件类型选择对应的处理器,高性能网络通信模型&#xff0c…

CTF题型 md5考法例题汇总

CTF题型 md5考法相关例题总结 文章目录 CTF题型 md5考法相关例题总结一.md5弱字符相等()[SWPUCTF 2021 新生赛]easy_md5 二.md5强字符相等()1)文件相等[2024 qsnctf 擂台赛 easy_md5]2)字符相等[安洵杯 2019]easy_web 三.md5哈希长度扩展攻击[NPUCTF2020]ezinclude文件包含利用…

配置视图解析器

我们在指定视图的时候路径是有重复的,重复的操作可以用视图解析器,让框架帮我们: mv.setViewName("/WEB-INF/view/show.jsp");mv.setViewName("/WEB-INF/view/other.jsp"); 配置视图解析器: 注册视图解析器:帮…

34 vue 项目默认暴露出去的 public 文件夹 和 CopyWebpackPlugin

前言 这里说一下 vue.config.js 中的一些 public 文件夹是怎么暴露出去的? 我们常见的 CopyWebpackPlugin 是怎么工作的 ? 这个 也是需要 一点一点积累的, 因为 各种插件 有很多, 不过 我们仅仅需要 明白常见的这些事干什么的即可 当然 以下内容会涉及到一部分vue-cli,…

Python爬虫实战—探索某网站电影排名

文章目录 Python爬虫实战—探索某网站电影排名准备工作编写爬虫代码代码解析运行情况截图进一步优化和说明完整代码总结 说明:本案例以XXX网站为例,已隐去具体网站名称与地址。 Python爬虫实战—探索某网站电影排名 网络爬虫是一种自动化程序&#xff0…

SQLiteC/C++接口详细介绍sqlite3_stmt类(十三)

返回:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(十二) 下一篇: 待续 51、sqlite3_stmt_scanstatus_reset sqlite3_stmt_scanstatus_reset 函数用于重置指定语句对象最近一次执行的 WHER…

Vue3 Vite3 状态管理 pinia 基本使用、持久化、在路由守卫中的使用

参考https://juejin.cn/post/7152774411571953677,自己简洁化了一部分 1.安装pinia依赖 yarn add pinia 创建pini实例 根目录创建store文件夹,然后创建index.js import { createPinia } from piniaconst pinia createPinia()export default pinia …

2024年全国职业院校技能大赛中职组大数据应用与服务赛项题库参考答案陆续更新中,敬请期待…

2024年全国职业院校技能大赛中职组大数据应用与服务赛项题库参考答案陆续更新中,敬请期待… 武汉唯众智创科技有限公司 2024 年 3 月 联系人:辜渝傧13037102709 题号:试题04 ZZ052-大数据应用与服务赛选赛题04 模块一:平台搭建…

一文带你看懂 前后端之间图片的上传与回显

一文带你看懂 前后端之间图片的上传与回显 前言 看了很多类似的文章,发现很多文章,要不就是不对,要不就是代码写的不通俗易懂,所以有了这篇文章,我将会从原理到实战,带你了解 实战包含前端 原生 vue3 rea…