- 1、本文档共28页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二章插值法课堂演示实验
第二章 插值法_课堂演示实验
问题: 分别以函数和为例,在区间上,取 为节点,用本章所学的Lagrange、Newton、Hermite插值法以及分段线性、分段三次Hermite插值法、Spline插值法作插值计算.具体要求如下:
1.取,通过在同一坐标系中作出被插函数与插值函数的图形的方法,来观察插值函数的图象与被插函数的位置关系,并给出观察到的的结论.
2.通过计算时的插值误差,结合前面得到的直观结论,试对各种插值方法的应用作出述评.
解答:
一、各种插值方法的算法公式及MATLAB通用程序
设已知函数表为且当时.
1.Lagrange插值法
算法公式?:
, 其中
余项为 , 有关.
通用程序1(此程序用得较多)?:
function yy=lagr1(x,y,xx)
%用途:拉格朗日插值法求插值点xx(可以是多个)处的插值yy
%格式:yy=lagr(x,y,xx), x是节点向量,y是节点对应的函数值向量,
% xx是插值点(可以是多个),yy返回插值结果
m=length(x);n=length(y);
if m~=n, error(向量x与y的长度必须一致);end
s=0;
for i=1:n
t=ones(1,length(xx));
for j=1:n
if j~=i
t=t.*(xx-x(j))/(x(i)-x(j));
end
end
s=s+t*y(i);
end
yy=s;
通用程序2?:
function [L ,C, l ,L1]= lagr2(X,Y)
%输入的量:n+1个节点(xi,yi)的横坐标向量X,纵坐标向量Y;
%输出的量:n次拉格朗日插值多项式L及其系数向量C,基函数l及其系数矩阵L1
m=length(X); L=ones(m,m);
for k=1: m
V=1;
for i=1:m
if k~=i
V=conv(V,poly(X(i)))/(X(k)-X(i));
end
end
L1(k,:)=V; l(k,:)=poly2sym (V);
end
C=Y*L1;
L=Y*l;
l=vpa(l,4);
L=vpa(L,4);
通用程序3?:
function [y,R]=lagr3(X,Y,x,M)
%输入的量:X 是n+1个节点的横坐标向量,Y是纵坐标向量, x是以向量形式输入的m个插值点,M是被插函数在[a,b]区间上的n+1阶导数的最大值.
%输出的量:y为m个插值构成的向量,R是误差限.
n=length(X); m=length(x);
for i=1:m
z=x(i);s=0.0;
for k=1:n
p=1.0; q1=1.0; c1=1.0;
for j=1:n
if j~=k
p=p*(z-X(j))/(X(k)-X(j));
end
q1=abs(q1*(z-X(j)));c1=c1*j;
end
s=p*Y(k)+s;
end
y(i)=s;
end
R=M*q1/c1;
2.Newton插值法
算法公式?:
余项为
其中 有关.??:
function s=newton1(x,y,x0,nn)
%Newton插值,x与y为已知的插值点及其函数值
%x0为需要求的插值点向是,s返回插对应插值
%nn为newton插值多项式的次数,即nn次newton插值多项式
nx=length(x);
ny=length(y);
if nx~=ny
warning(向量x与y的长度应该相同)
return;
end
m=length(x0);
%按照公式,对需要求的插值点x0的每个元素进行计算
for i=1:m
t=0.0;
%j=1;
yy=y;
kk=1;
%求各级均差
while(kk=nn)
kk=kk+1;
for k=kk:nx
yy(k)=(yy(k)-yy(kk-1))/(x(k)-x(kk-1));
end
end
%求插值结果
t=yy(1);
for k=2:nx
u=1.0;
jj=1;
while(jjk)
u=u*(x0(i)-x(jj));
jj=jj+1;
end
t=t+yy(
文档评论(0)