数值分析(三) 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.rhkb.cn/news/282504.html

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

相关文章

Linux学习之自定义协议

前言: 首先对于Tcp的socket的通信,我们已经大概了解了,但是其中其实是由一个小问题,我们目前是不得而知得,在我们客户端与服务端连接成功后,服务端读取来自客户端得消息,我们使用的是函数read,…

高通 8255 基本通信(QUP)Android侧控制方法说明

一:整体说明 高通8255芯片中,SPI IIC UART核心统一由QUP V3 进行控制 QUP V3为可编程模块,可以将不同通道配置为SPI IIC UART通路,此部分配置在QNX侧 QUP 资源可以直接被QNX使用,Android侧可以通过两种方法使用QUP资源…

YOLOv5-Y5周:yolo.py文件解读

本文为🔗365天深度学习训练营 中的学习记录博客 原作者:K同学啊|接辅导、项目定制 我的环境: 1.语言:python3.7 2.编译器:pycharm 3.深度学习框架Tensorflow/Pytorch 1.8.0cu111 一、代码解读 import argparse i…

idea将非UTF-8的properties修改为UTF-8编码的文件

需求背景 由于项目初始化时,properties文件的编码格式为ASCII编码格式,此时用idea打开该文件会默认展示UTF-8的编码内容,其中汉字可以正常展示,但是使用notepad打开却依旧时ASCII编码格式 idea配置 打开idea-setting-editor-f…

QT C++ QButtonGroup应用

//QT 中,按钮数量比较少,可以分别用各按钮的信号和槽处理。 //当按钮数量较多时,用QButtonGroup可以实现共用一个槽函数,批量处理,减少垃圾代码, //减少出错。 //开发平台:win10QT6.2.4 MSVC…

【LIMS】微服务

目录 一、服务解决方案-Spring Cloud Alibaba1.1选用原因(基于Spring Cloud Alibaba的试用场景)1.2 核心组件使用前期规划 部署 nacos部署 mino使用JavaFreemarker模板引擎,根据XML模板文件生成Word文档使用JavaFlowable 工作流引擎前端 -vue…

taro之Picker,PickerView基础用法

1.Picker 直接上代码 import Taro,{Component} from "tarojs/taro"; import {View,Picker} from tarojs/components import { AtIcon } from taro-ui import { putKey } from /src/utils/storage-utilsclass AgriculturePolicy extends Component{constructor (prop…

什么是浏览器指纹识别?Maskfog指纹浏览器有用吗?

浏览器指纹识别是好是坏?这现在确实是一个有争议的话题。83%的消费者经常或偶尔会根据浏览历史记录看到广告。其实这就是利用了浏览器指纹技术。 如果您想了解浏览器指纹识别是什么,那就看下去! 一、什么是浏览器指纹识别 浏览器指纹是指无…

Linux基础命令[20]-useradd

文章目录 1. useradd 命令说明2. useradd 命令语法3. useradd 命令示例3.1 不加参数3.2 -d(指定家目录)3.3 -g(指定用户组)3.4 -G(指定附属组)3.5 -p(加密密码)3.6 -e(指…

多线程libtorch推理问题

一、环境 我出问题的测试环境如下: pytorch1.10+cu113 pytorch1.10+cu116 pytorch2.2+cu118 libtorch1.10.1+cu113 libtorch1.10.1+cu111 libtorch1.9.0+cu111 二、问题现象 最近封装libtorch的推理为多线程推理的时候,遇到一个现象如下: (1)只要是将模型初始化放到一个…

HDFS概述及常用shell操作

HDFS 一、HDFS概述1.1 HDFS适用场景1.2 HDFS优缺点1.3 HDFS文件块大小 二、HDFS的shell操作2.1 上传2.2 下载2.3 HDFS直接操作 一、HDFS概述 1.1 HDFS适用场景 因为HDFS里所有的文件都是维护在磁盘里的 在磁盘中对文件的历史内容进行修改 效率极其低(但是追加可以) 1.2 HDF…

电力柜智能蓝牙锁控解决方案

一、行业背景 随着智能电网的快速发展,电力柜作为电网的重要组成部分,其安全性和可靠性对于保障电力供应至关重要。传统的电力柜锁控系统多依赖于物理钥匙,存在管理不便、安全隐患大、难以实时监控等问题,为了提高电力柜的安全管…

品牌方年度抖音店铺打造流量运营孵化方案

【干货资料持续更新,以防走丢】 品牌方年度抖音店铺打造流量运营孵化方案 部分资料预览 资料部分是网络整理,仅供学习参考。 PDF共120页(完整资料包含以下内容) 目录 抖音年度短视频直播运营规划方案 1. 帐号视频发布规划 问…

Java微服务轻松部署服务器

我们在日常开发微服务之后需要再服务器上面部署,那么如何进行部署呢,先把微服务的各个服务和中间件以及对应的端口列举出来,都打包成镜像,以及前端代码部署的nginx,使用docker-compose启动,访问服务器nginx…

C++关键字:const

文章目录 一、const的四大作用1.修饰 变量、数组2.修饰 函数的形参、修饰 引用 (最常用)3.修饰 指针:常量指针、指针常量 、只读指针4.修饰 类的成员函数、修饰 类的对象 一、const的四大作用 1.修饰 变量、数组 1.const修饰变量: 被const修…

[LLM]大语言模型文本生成—解码策略(Top-k Top-p Temperature)

{"top_k": 5,"temperature": 0.8,"num_beams": 1,"top_p": 0.75,"repetition_penalty": 1.5,"max_tokens": 30000,"message": [{"content": "你好","role": "user&…

C语言学习过程总结(18)——指针(6)

一、数组指针变量 在上一节中我们提到了,指针数组的存放指针的数组,那数组指针变量是什么呢? 显而易见,数组指针变量是指针 同样类比整型指针变量和字符指针变量里面分别存放的是整型变量地址和字符变量地址,我们可以…

元宇宙VR数字化艺术展降低办展成本

元宇宙AI时代已经来临,越来越多人期待在元宇宙数字空间搭建一个属于自己的虚拟展厅,元宇宙虚拟展厅搭建平台是VR公司深圳华锐视点为企业研发的可编辑工具,那么元宇宙虚拟展厅搭建平台有哪些新突破? 元宇宙虚拟展厅搭建平台采用了先进的web3D…

Navicat:设置mysql数据库表的主键为uuid

文章目录 1 问题描述2 解决方案3 其他方法 1 问题描述 当我使用Navicat新建表test_table之后,想通过导入向导将excel表中的数据导入到表test_tab中,由于没有excel表中没有主键对应的字段,导致导入失败,提示Field id doesnt have …

利用二分法求方程在某个范围内的根

问题描述: 利用二分法求方程在(-10,10)的根。 方法:先求出两端点的中点,然后将中点带入方程中检查是否等于0,如果等于0说明找到了根,如果大于0,说明根在左半部分,将rig…