数值分析·学习 | 拉格朗日插值法matlab实现

目录

前言

一、拉格朗日(Lagrange)插值是什么?

二、matlab实现代码

1.线性插值:

2.抛物线插值:

3.拉格朗日(Lagrange)插值

总结:


前言

本篇内容为个人所学知识分享


一、拉格朗日(Lagrange)插值是什么?

对于构造通过n+1个不同的节点x_0<x_1<\cdot \cdot \cdot <x_n编辑的n次插值多项式L_n(x)编辑,假定它满足条件

L_n(x_j)=y_j,j=0,1,\cdot \cdot \cdot ,n.编辑

为了构造L_n(x)编辑,我们先定义n次插值基函数。

若n次多项式l_j(x)(j=0,1,...,n)编辑在n+1个节点x_0<x_1<\cdot \cdot \cdot <x_n编辑上满足条件

l_j(x_k)=\left\{\begin{matrix} 1,k=j, & & \\ 0,k\neq j, & & \end{matrix}\right.j,k=0,1,\cdot \cdot \cdot ,n,编辑

则称这n+1个n次多项式l_0(x),l_1(x),\cdot \cdot \cdot ,l_n(x)编辑为节点x_0,x_1,\cdot \cdot \cdot ,x_n编辑上的n次插值基函数

l_k(x)=\frac{(x-x_0)\cdot \cdot \cdot(x-x_{k-1})(x-x_{k+1})\cdot \cdot \cdot (x-x_n)}{(x_k-x_0)\cdot \cdot \cdot(x_k-x_{k-1})(x_k-x_{k+1})\cdot \cdot \cdot (x_k-x_n)},k=0,1,\cdot \cdot \cdot ,n.编辑

使得插值多项式可以表示为

L_n(x)=\sum_{k=0}^{n}y_kl_k(x),

编辑

l_k(x)编辑的定义,知

L_n(x_j)=\sum_{k=0}^{n}y_kl_k(x_j)=y_j,j=0,1,\cdot \cdot \cdot ,n.编辑

形如上式的插值多项式L_n(x)编辑便称为拉格朗日(Lagrange)插值多项式。线性插值和抛物线插值只是拉格朗日插值的特殊情况。

拉格朗日(Lagrange)插值多项式的另外一种表示形式如下:

L_n(x)=\sum_{k=0}^{n}y_k\frac{w_{n+1}(x)}{(x-x_k)w'_{n+1}(x_k)}.编辑

其中

w_{n+1}(x)=(x-x_0)(x-x_1)\cdot \cdot \cdot (x-x_n),编辑

w'_{n+1}(x_k)=(x_k-x_0)\cdot \cdot \cdot (x_k-x_{k-1})(x_k-x_{k+1})\cdot \cdot \cdot (x_k-x_n).编辑


二、matlab实现代码

1.线性插值:

即n=1的时候,一次的插值函数,即已知条件为两个插值节点及其值

function y0=Linear_interpolation(x,y,x0)
%功能:线性插值
%输入:x为插值节点,y为插值节点对应的值,x0为计算点
%输出:x0处的值
y0=y(1)+(y(2)-y(1))/(x(2)-x(1))*(x0-x(1));%点斜式
y0=y(1)*(x(2)-x0)/(x(2)-x(1))+y(2)*(x0-x(1))/(x(2)-x(1));%两点式
end

2.抛物线插值:

即n=2的时候,二次的插值函数,即已知条件为三个插值节点及其值

function y0=Parabolic_interpolation(x,y,x0)
%功能:抛物线插值
%输入:x为插值节点,y为插值节点对应的值,x0为计算点
%输出:x0处的值
y0=y(1)*(x0-x(2))*(x-x(3))/(x(1)-x(2))/(x(1)-x(3))+y(2)*(x0-x(1))*(x0-x(3))...
    /(x(2)-x(1))/(x(2)-x(3))+y(3)*(x0-x(1))*(x0-x(2))/(x(3)-x(1))/(x(3)-x(2));
end

3.拉格朗日(Lagrange)插值:

(一般情况)即已知条件为一串插值节点及其值

function y0 = Lagrange_interpolation(x,y,x0)
%功能:拉格朗日插值多项式求解
%输入:x为插值节点,y为插值节点对应的值,x0为计算点集
%输出:x0处值的集合y0
y0 = zeros(1,length(x0));
for i = 1:1:length(x0)  %循环作用:遍历x0
   X = ones(1,length(x));  
    for k = 1:1:length(x)%循环作用:(x0(i)-x(j))/(x(k)-x(j))的加和;
        for j= 1:1:length(x)%循环作用:(x0(i)-x(j))/(x(k)-x(j))的乘积
            if j ~= k  
                X(k) = X(k) * (x0(i)-x(j)) / (x(k)-x(j));
            end
        end 
        y0(i) = y0(i) + X(k)*y(k);  
    end
end
end

总结

拉格朗日插值的插值对象为:一串不同的插值节点,且知道插值节点及其值。

代码部分由于线性插值和抛物线插值是拉格朗日的特殊情况,所以小编在编写的时候,为了让看起来没有重复,选择了直接按照运算形式编写代码。

posted on   不变因子  阅读(3764)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示