拉格朗日插值讲解与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 函数绘制已知数据点和插值结果,便于可视化。

运行结果

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

  • 优点:
    概念简单,易于理解和实现。
    适合数据点数量较少的情况。
  • 缺点:
    计算复杂度较高,尤其是当数据点数量增加时。
    可能会出现龙格现象,即在区间端点附近的插值误差增大。
相关推荐
2601_9620715717 分钟前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
淡海水1 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
CS_Zero2 小时前
C语言sizeof是函数吗?
c语言·开发语言
-今昭-3 小时前
《V2V 迁移实战:将 VMware 虚拟机转为 OpenStack 可用 Glance qcow2 镜像》
开发语言·python
黑马程序员毕设5 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
_Twink1e5 小时前
openJiuwen 实训营 Day 1 · WorkSwarm 入门教程
开发语言·c++·openjiuwen
问天_观心6 小时前
大模型微调学习(一)
开发语言·人工智能·学习·语言模型·github
阿里嘎多学长6 小时前
2026-09-03 GitHub 热点项目精选
开发语言·程序员·github·代码托管
源代码•宸6 小时前
前置准备:定时微服务背景和现状
开发语言·经验分享·后端·微服务·云原生·架构·golang
2601_967338716 小时前
C#上位机开发零基础入门到精通全套视频
开发语言·c#