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

运行结果

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

  • 优点:
    概念简单,易于理解和实现。
    适合数据点数量较少的情况。
  • 缺点:
    计算复杂度较高,尤其是当数据点数量增加时。
    可能会出现龙格现象,即在区间端点附近的插值误差增大。
相关推荐
百事老饼干12 分钟前
Java[面试题]-真实面试
java·开发语言·面试
杨荧1 小时前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
白子寰1 小时前
【C++打怪之路Lv14】- “多态“篇
开发语言·c++
王俊山IT1 小时前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习
为将者,自当识天晓地。1 小时前
c++多线程
java·开发语言
小政爱学习!1 小时前
封装axios、环境变量、api解耦、解决跨域、全局组件注入
开发语言·前端·javascript
k09331 小时前
sourceTree回滚版本到某次提交
开发语言·前端·javascript
神奇夜光杯2 小时前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
Themberfue2 小时前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
plmm烟酒僧2 小时前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv