Lagrange插值公式matlab实现

一、公式推导原理

N次插值基函数:

 满足插值多项式

 形如此公式的插值多项式称为Lagrang插值多项式。

由​​​​​​​的定义可知​​​​​​​

 若引入计号,再求导

因此 

二 、符号说明

输入:

xi:已知数据点的横坐标

k:函数lk(x)的下标k

xx:待插值点的横坐标

输出:lk_x,即函数lk(x)在xx坐标点的纵坐标

代码如下:

function lk_x = LagrangeFactor( xi, k, xx )
w = 1;
n = length( xi );
syms x;
for j = 1 : n
    w = w * ( x - xi(j) );
end
dw = diff( w );
dwf = matlabFunction( dw );
dwi = dwf( xi(k) );
lx = ( w / ( x - xi(k) ) ) / dwi;
f = matlabFunction( lx );
lk_x = f( xx );
end
  • 三、一次插值

1. 自变量函数的准备工作:

(xi,yi):是已知的数据点坐标

代码:xi = [ 0, 1 ];
yi = sin( xi );
n = length( xi );
y = 0;
x = [ xi(1) - 1 : 0.1 : xi(2) + 1 ];

2.根据lagrange插值多项式计算x坐标点处的函数值(纵坐标) 

代码:

for k = 1 : n
    lkx = LagrangeFactor( xi, k, x );
    y = y + yi(k) * lkx;

end

3.绘图 

代码:

figure;
plot( xi, yi, 'b.', 'markersize', 30 )
hold on
plot( x, sin(x), 'k--', 'LineWidth', 1.5  )
plot( x, y, 'r-', 'LineWidth', 2 )
legend( '插值点', '原曲线', '插值多项式曲线' );
axis( [ -1, 2, -1, 3 ] )

结果如图:

 四、抛物插值

1.自变量函数的准备工作:

xi = [ 0, pi/2, pi ];
yi = [ 0, 1, 0 ];
n = length( xi );
y = 0;
x = [ xi(1) - 1 : 0.1 : xi(n) + 1  ];

2.根据lagrange插值多项式计算x坐标点处的函数值

for k = 1 : n
    lkx = LagrangeFactor( xi, k, x );
    y = y + yi(i) * lkx;
end

3.绘图

plot( xi, yi, 'b.', 'markersize', 30 )
hold on
plot( x, sin(x), 'k--', 'LineWidth', 1.5  )
plot( x, y, 'r-', 'LineWidth', 2 )
legend( '插值点', '原曲线', '插值多项式曲线' );
axis( [ xi(1) - 1, xi(n) + 1, -1, 2 ] )

汇总代码:

clear all
clc
%% 一次插值
%(xi,yi):
xi = [ 0, 1 ];
yi = sin( xi );
n = length( xi );
y = 0;
x = [ xi(1) - 1 : 0.1 : xi(2) + 1 ];
for k = 1 : n
    lkx = LagrangeFactor( xi, k, x );
    y = y + yi(k) * lkx;
end
%y
figure;
plot( xi, yi, 'b.', 'markersize', 30 )
hold on
plot( x, sin(x), 'k--', 'LineWidth', 1.5  )
plot( x, y, 'r-', 'LineWidth', 2 )
legend( '插值点', '原曲线', '插值多项式曲线' );
axis( [ -1, 2, -1, 3 ] )
%% 抛物插值
clear all
clc
xi = [ 0, pi/2, pi ];
yi = [ 0, 1, 0 ];
n = length( xi );
y = 0;
x = [ xi(1) - 1 : 0.1 : xi(n) + 1  ];
for k = 1 : n
    lkx = LagrangeFactor( xi, k, x );
    y = y + yi(k) * lkx;
end
%y 
figure;
plot( xi, yi, 'b.', 'markersize', 30 )
hold on
plot( x, sin(x), 'k--', 'LineWidth', 1.5  )
plot( x, y, 'r-', 'LineWidth', 2 )
legend( '插值点', '原曲线', '插值多项式曲线' );
axis( [ xi(1) - 1, xi(n) + 1, -1, 2 ] )
function lk_x = LagrangeFactor( xi, k, xx )
w = 1;
n = length( xi );
syms x;
for j = 1 : n
    w = w * ( x - xi(j) );
end
dw = diff( w );
dwf = matlabFunction( dw );
dwi = dwf( xi(k) );
lx = ( w / ( x - xi(k) ) ) / dwi;
f = matlabFunction( lx );
lk_x = f( xx );
end
  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值