数值分析(三) 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 : mV = 1;for i = 1 : mif k ~= iV = conv(V,poly(x0(i))) / (x0(k) - x0(i));endendL1(k,:) = V;l = cat(1,l,poly2sym(V));
end
fprintf('基函数为:\n');for k = 1:mfprintf(['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 == 3varargout{1} = feval(L,varargin{1});plot(x0,y0,'bo')hold onplot(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 == 0label = name{k+1};
elsewhile 1if mod(k,10)==0 && floor(k/10)==0breakendj = 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-zpclc
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代码

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 在PDF中插入页眉、页脚

在处理PDF文档时,有时需要为文档中的每一页添加页眉和页脚,以包含一些有用的信息,如文档标题、章节名称、日期、页码等。对于需要自动化处理的场景,或者需要在大量文档中添加一致的页眉和页脚,可以通过编程的方式来实现…

Django日志(三)

内置TimedRotatingFileHandler 按时间自动切分的log文件,文件后缀 %Y-%m-%d_%H-%M-%S , 初始化参数: 注意 发送邮件的邮箱,开启SMTP服务 filename when=h 时间间隔类型,不区分大小写 S:秒 M:分钟 H:小时 D:天 W0-W6:星期几(0 = 星期一) midnight:如果atTime未指定,…

C++的内存管理

目录 1. C/C内存分布 2. C语言中动态内存管理方式 3. C内存管理方式 3.1 new/delete操作内置类型 4. operator new与operator delete函数 4.1 连续开辟空间(尽力了解) 5. new和delete的实现原理 5.1 内置类型 5.2 自定义类型 6. 深入理解 6.1malloc/free和new/delete的区…

SLAM 求解IPC算法

基础知识:方差,协方差,协方差矩阵 方差:描述了一组随机变量的离散程度 方差 每个样本值 与 全部样本的平均值 相差的平方和 再求平均数,记作: 例如:计算数字1-5的方差,如下 去中心化…

Power BI ----SVG(圆环图)

圆环图助力矩阵图 定义度量值放置视觉对象 SVG是什么鬼,在现在的Web世界中越来越凸显这一标准的优势。关于SVG,我们只需要知道一点就好 ---- SVG 意为可缩放矢量图形(Scalable Vector Graphics)。它是使用 XML 格式定义的图像。 由…

【LeetCode 算法刷题笔记-路径篇】

1.0112. 路径总和 1.1 题目大意 描述:给定一个二叉树的根节点 root 和一个值 targetSum。 要求:判断该树中是否存在从根节点到叶子节点的路径,使得这条路径上所有节点值相加等于 targetSum。如果存在,返回 True;否则…

elementUI Tree 树形控件单选实现

文章目录 展示效果代码实现elementui Tree树形控件其他详细数据 在Element UI中,树形控件(el-tree)本身不支持单选功能。但是,你可以通过监听节点点击事件并手动更新选中状态来实现单选树。 以下是一个简单的例子,展示…

React【Day1】

B站视频链接 一、React介绍 React由Meta公司开发,是一个用于 构建Web和原生交互界面的库 React的优势 相较于传统基于DOM开发的优势 组件化的开发方式不错的性能 相较于其它前端框架的优势 丰富的生态跨平台支持 React的市场情况 全球最流行,大…

pandas读写excel,csv

1.读excel 1.to_dict() 函数基本语法 DataFrame.to_dict (self, orientdict , into ) --- 官方文档 函数种只需要填写一个参数:orient 即可 ,但对于写入orient的不同,字典的构造方式也不同,官网一共给出了6种&#xff0c…

API(时间类)

一、Date类 java.util.Date类 表示特定的瞬间,精确到毫秒。 Date常用方法: public long getTime() 把日期对象转换成对应的时间毫秒值。 public void setTime(long time) 把方法参数给定的毫秒值设…

python网络爬虫实战教学——requests的使用(1)

文章目录 专栏导读1、前言2、get请求3、抓取网页4、抓取二进制数据5、请求头 专栏导读 ✍ 作者简介:i阿极,CSDN 数据分析领域优质创作者,专注于分享python数据分析领域知识。 ✍ 本文录入于《python网络爬虫实战教学》,本专栏针对…

部署Prometheus+grafana详解

目录 一、prometheus 介绍 二、prometheus 对比 zabbix 三、prometheus 监控插件 四、部署 1、下载所需的包 2.编辑prometheus的配置文件 3、编辑alertmanager 的配置文件 4、tmpl 模板(将此文件创建在/opt/alertmanager/tmpl/) 5.启动&#xff0…

探索国内ip切换App:打破网络限制

在国内网络环境中,有时我们会遇到一些限制或者屏蔽,使得我们无法自由访问一些网站或服务。而国内IP切换App的出现,为解决这些问题提供了非常便捷的方式。这些App可以帮助用户切换IP地址,让用户可以轻松地访问被限制或屏蔽的网站&a…

leetcode刷题(javaScript)——BFS广度优先遍历相关场景题总结

广度优先搜索(BFS)在JavaScript编程中有许多实际应用场景,特别是在解决图、树等数据结构相关问题时非常常见。在JavaScript中,可以使用队列来实现广度优先搜索算法。通过将起始节点加入队列,然后迭代地将节点的邻居节点…

css background-color属性无效

因为工作需要&#xff0c;最近在帮H5同事开发几个页面&#xff0c;在使用H5进行如下布局的时候&#xff0c;发现设置 background-color为白色无效。 代码如下&#xff1a; <div class "bottomBar"><div style"position: fixed; left: 20px;">…

同步服务器操作系统公网仓库到本地02--搭建http内网仓库源 _ 麒麟KOS _ 统信UOS _ 中科方德 NFSCNS

原文链接&#xff1a;同步服务器操作系统公网仓库到本地02 —搭建http内网仓库源| 麒麟KOS | 统信UOS | 中科方德 NFSCNS Hello&#xff0c;大家好啊&#xff01;继之前我们讨论了如何同步服务器公网仓库到本地服务器之后&#xff0c;今天我们将进入这个系列的第二篇文章——通…

美容美发行业在线下单小程序源码系统 一键在线预约 带完整的安装代码包以及安装部署教程

近年来&#xff0c;美容美发市场竞争日益激烈&#xff0c;传统的经营模式已难以满足消费者的多样化需求。为了适应市场变化&#xff0c;提升服务质量&#xff0c;许多商家开始寻求数字化转型。然而&#xff0c;由于技术门槛较高&#xff0c;很多商家在开发在线预约系统时遇到了…

中兴通讯服务器荣获滴滴“最佳需求响应「和衷共济」奖”

在数字经济加速发展的背景下&#xff0c;算力成为数字产业的核心支撑力量&#xff0c;而服务器和存储产品更是为互联网创新体验提供了底层基础设施保障。在此背景下&#xff0c;中兴通讯服务器产品有效支撑滴滴出行智慧交通解决方案&#xff0c;凭借卓越表现&#xff0c;获得滴…

StarRocks-2.5.13部署安装

1、安装jdk11 tar xf jdk-11.0.16.1_linux-x64_bin.tar.gz mv jdk-11.0.16.1 /data/soft/jdk-11 # 配置在/etc/profile中 export JAVA_HOME/data/soft/jdk-11 export CLASSPATH.:/data/soft/jdk-11/lib export PATH/data/soft/jdk-11/bin:$PATH # 验证jdk [rootdb-public-03 s…

大广赛获奖作品一览

大广赛指全国大学生广告艺术大赛&#xff0c;这是一项由中国教育部高等教育司指导、中国高等教育学会广告教育专业委员会主办的全国性高校文科大赛&#xff0c;也是迄今为止全国规模大、覆盖高等院校广、参与师生人数多、作品水准高的国家级大学生赛事。 大广赛的竞赛形式主要…