本文主要是介绍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 : nw = 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 : nlkx = 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 : nlkx = 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 : nlkx = 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 : nlkx = 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 : nw = 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
这篇关于Lagrange插值公式matlab实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!