拉格朗日插值讲解与MATLAB例程

文章目录

拉格朗日插值

拉格朗日插值是一种用于在已知数据点之间进行插值的数学方法。它通过构造拉格朗日基多

项式来估计在这些已知点之间的值。该方法特别适合于需要通过一组离散数据点计算连续函

数值的情况。

拉格朗日插值的基本概念

已 知 数 据 点

·假设有 n + 1 n+1 n+1个已知数据点 ( x 0 , y 0 ) , ( x 1 , y 1 ) , ... , ( x n , y n ) (x_0,y_0),(x_1,y_1),\ldots,(x_n,y_n) (x0,y0),(x1,y1),...,(xn,yn)。

拉格朗日基多项式

·对于每一个数据点 ( x k , y k ) (x_k,y_k) (xk,yk),可以构造一个拉格朗日基多项式 L k ( x ) L_k(x) Lk(x),其定义为:

L k ( x ) = ∏ 0 ≤ j ≤ n j ≠ k x − x j x k − x j L_k(x)=\prod_{\substack{0\leq j\leq n\\j\neq k}}\frac{x-x_j}{x_k-x_j} Lk(x)=0≤j≤nj=k∏xk−xjx−xj

·这个多项式在 x = x k x=x_k x=xk时为 1,而在其他已知点 x j x_j xj ( j ≠ k ) j\neq k) j=k)时为0。

插值多项式

·拉格朗日插值多项式 P ( x ) P(x) P(x)被定义为所有基多项式的加权和:

P ( x ) = ∑ k = 0 n y k L k ( x ) P(x)=\sum_{k=0}^ny_kL_k(x) P(x)=k=0∑nykLk(x)

· 这个多项式在每个已知数据点处的值等于对应的 y k y_k yk 。

MATLAB源代码

matlab 复制代码
% 拉格朗日插值示例

% 定义已知数据点
x = [1, 2, 3, 4]; % x坐标
y = [1, 4, 9, 16]; % y坐标(例如 y = x^2)


% 定义插值点
x_interp = linspace(1, 4, 100); % 在 [1, 4] 之间生成100个插值点

% 计算插值结果
y_interp = lagrangeInterpolation(x, y, x_interp);

% 绘图
figure;
plot(x, y, 'ro', 'MarkerSize', 10, 'DisplayName', '已知数据点'); % 原始数据点
hold on;
plot(x_interp, y_interp, 'b-', 'LineWidth', 2, 'DisplayName', '拉格朗日插值'); % 插值结果
xlabel('X');
ylabel('Y');
title('拉格朗日插值法');
legend;
grid on;
hold off;% 定义插值函数


function L = lagrangeInterpolation(x, y, x_interp)
    n = length(x);
    L = zeros(size(x_interp));
    
    for k = 1:n
        % 计算拉格朗日基多项式
        L_k = ones(size(x_interp));
        for j = [1:k-1, k+1:n]
            L_k = L_k .* (x_interp - x(j)) / (x(k) - x(j));
        end
        L = L + y(k) * L_k; % 累加每个基多项式的贡献
    end
end

代码讲解

  • 已知数据点定义:
    x x x 和 y y y 数组包含已知数据点的坐标。
  • 插值函数:
    lagrangeInterpolation 函数实现拉格朗日插值。输入为已知数据点 x 和 y,以及插值点 x_interp。
    使用双重循环计算每个拉格朗日基多项式并累加其贡献。
  • 插值点生成:
    使用 linspace 函数在给定区间内生成插值点。
  • 计算插值结果:
    调用 lagrangeInterpolation 函数计算插值值 y_interp。
  • 绘图:
    使用 plot 函数绘制已知数据点和插值结果,便于可视化。

运行结果

拉格朗日插值的特点(优缺点)

  • 优点:
    概念简单,易于理解和实现。
    适合数据点数量较少的情况。
  • 缺点:
    计算复杂度较高,尤其是当数据点数量增加时。
    可能会出现龙格现象,即在区间端点附近的插值误差增大。
相关推荐
侃侃_天下1 天前
最终的信号类
开发语言·c++·算法
echoarts1 天前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Aomnitrix1 天前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
每天回答3个问题1 天前
UE5C++编译遇到MSB3073
开发语言·c++·ue5
伍哥的传说1 天前
Vite Plugin PWA – 零配置构建现代渐进式Web应用
开发语言·前端·javascript·web app·pwa·service worker·workbox
小莞尔1 天前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
我是菜鸟0713号1 天前
Qt 中 OPC UA 通讯实战
开发语言·qt
JCBP_1 天前
QT(4)
开发语言·汇编·c++·qt·算法
Brookty1 天前
【JavaEE】线程安全-内存可见性、指令全排序
java·开发语言·后端·java-ee·线程安全·内存可见性·指令重排序
百锦再1 天前
[特殊字符] Python在CentOS系统执行深度指南
开发语言·python·plotly·django·centos·virtualenv·pygame