实验名称: 实验一 拉格朗日插值
引言
我们在生产生活中常常会遇到这样的问题:某个实际问题中,函数f(x)在区间[a,b]上存在且连续,但找到其表达式,只能通过实验和观测得到有限点上的函数表。有些情况虽然可以写出表达式,但结构复杂,使用不方便。所以简单函数P(x)作为f(x)的近似值。插值法是解决此类问题的一种方法。
实验目的和要求
运用Matlab编写m文件,要求一次性输入整张函数表,并利用计算机选择在插值计算中所需的节点。分别通过分段线性插值、分段二次插值和全区间上拉格朗日插值计算f(0.15),f(0.31),f(0.47)的近似值。f(x)0.398940.396950.391420.381380.368120.35206算法原理与流程图
(1)原理
设函数y=在插值区间[a,b]上连续,且在n+1个不同的插值节点a≤x0,x1,…,xn≤b上分别取值y0,y1,…,yn。目的是要在一个性质优良、便于计算的函数类Φ中,求一简单函数P(x),P(xi)=yi(i=0,1,…,n),而在其他点x≠xi上,作为f(x)近似值P(x)的方法称为插值法。在本实验中,采用拉格朗日插值法。
①分段低次插值
当给定了n+1个点x0
这种分段低次插值叫分段线性插值
类似地,我们可以选取距离x最近的三个节点xi-1,xi与xi+1,然后进行二次插值,即得
这种分段低次插值叫分段二次插值②全区间上拉格朗日插
对节点xi(i=0,1,…,n)中任一点xk(0≤k≤n),作一n次多项式lk(x),使它在该点上的取值为1,在其余点xi(i=0,1,…,k-1,k+1,…,n)上取值为零。对应于每一节点xk(k=0,1,…,n),都能写出一个满足此条件的多项式,这样写出n+1个多项式l0(x),l1(x),…,ln(x);
由条件可得
于是我们可以得出如下的拉格朗日n次插值多项式(对于全区间上的插值,n取函数表的长度)
流程图
分段线性插值分段二次插值 全区间拉格朗日插值
程序代码及注释
1、分段线性插值
%分段线性插值
function y=piece_linear(x0,y0,x)
% x0,y0为已知点,x为待求点
n=length(x0);p=length(y0);m=length(x);
% n,p,m分别为x0,y0,x长度
if n~=p
fprintf('Error! Please input again!\n');
% x0和y0长度不等时,报错
else
for i=1:m
z=x(i);
sum=0.0;
l=0;
%给l赋初值,根据x的值确定l
if zx0(n)
fprintf('Error!x(%d) is out of range!\n',i);
break;
end
%当插值点超出范围时,报错
for j=2:n
if z
l=j;
end
if l~=0
break;
end
end
%一旦l有非零值,则终止循环,选出合适的l
for k=l-1:l
a=1.0;
for s=l-1:l
if s~=k
a=a*(z-x0(s))/(x0(k)-x0(s));
end
end
sum=sum+y0(k)*a;
end
y(i)=sum;
fprintf('y(%d)=%f\nx1=%.3f y1=%.5f,x2=%.3f y2=%.5f\n\n',i,y(i),x0(l-1),y0(l-1),x0(l),y0(l));
%输出插值结果和所需节点
end
end
end
2、分段二次插值
%分段二次插值
function y=piece_square(x0,y0,x)
% x0,y0为已知点,x为待求点
n=length(x0);p=length(y0);m=length(x);
% n,p,m分别为x0,y0,x长度
if n~=p
fprintf('Error! Please input again!\n');
% x0和