当前位置:文档之家› 现代数值计算方法实验三

现代数值计算方法实验三

实验报告实验三 插值法与拟合实验一、实验目的1、懂得利用数据建模两种方法(插值法和拟合多项式法)对一批数据()11,y x ,()22,y x ,……,()n n y x ,进行处理,学会对数据的结果进行误差分析.2、比较分析这些方法的优缺点,并且在适合的场合应用相应的方法.二、实验题目1. 插值效果的比较实验题目:将区间][5,5-10等分,对下列函数分别计算插值节点k x 的值,进行不同类型的插值,作出插值函数的图形并与()x f y =的图形进行比较:)211xx f +=; ()x x f a r c t a n =; ()421xxx f +=.(1) 做拉格朗日插值; (2) 做三次样条插值. 2. 拟合多项式实验实验题目:给定数据点如下表所示:分别对上述数据作三次多项式和五次多项式拟合,并求平方误差,作出离散函数(i x ,i y )和拟合函数的图形.三、实验原理数据建模有两大方法:一类是插值方法,要求所要函数()x ϕ严格遵守从数据()11,y x ,()22,y x ,……,()n n y x ,;另一类是拟合方法,允许函数()x ϕ在数据点上的有误差,但是要求达到某种误差指标的最小化.第一题⑴拉格朗日插值算法原理%malagr.mfunction yy=malagr(x,y,xx)%用途:拉格朗日插值法求解%格式:yy=malagr(x,y,xx), x是节点向量,y是节点对应的函数值向量,% xx是插值点(可以是多个),,yy返回插值结果m=length(x);n=length(y);if m~=n, error('向量x与y的长度必须一致');ends=0;for i=1:nt=ones(1,length(xx));for j=1:nif j~=it=t.*(xx-x(j))/(x(i)-x(j));endends=s+t*y(i);endyy=s;end⑵三次样条插值算法原理:%maspline.mfunction m=maspline(x,y,dy0,dyn,xx)%用途:三阶样条插值(一阶导数边界条件)%格式:m=maspline(x,y,dy0,dyn,xx), x为节点向量,y为数据,%dy0,dyn为左右两端点的一阶导数如果xx缺省,则输出各节点的%的一阶导数值,,m为xx的三阶样条插值format short;n=length(x)-1; %计算小区间的个数h=diff(x); lambda=h(2:n)./(h(1:n-1)+h(2:n)); mu=1-lambda;theta=3*(lambda.*diff(y(1:n))./h(1:n-1)+mu.*diff(y(2:n+1))./h(2:n)); theta(1)=theta(1)-lambda(1)*dy0;theta(n-1)=theta(n-1)-lambda(n-1)*dyn;%追赶法解散对焦方程组dy=machase(lambda,2*ones(1:n-1),mu,theta);%若给插值点,计算插值m=[dy0;dy;dyn];if nargin>=5s=zeros(size(xx));for i=1:nif i==1kk=find(xx<=x(2));elseif i==nkk=find(xx>x(n));elsekk=find(xx>x(i)&xx<=x(i+1));endxbar=(xx(kk)-x(i))/h(i);s(kk)=alpha0(xbar)*y(i)+alpha1(xbar)*y(i+1)+...+h(i)*beta0(xbar)*m(i)+h(i)*beta1(xbar)*m(i+1);endm=s;end%追赶法function x=machase(a,b,c,d)n=length(a);for k=2:nb(k)=b(k)-a(k)/b(k-1)*c(k-1);d(k)=d(k)-a(k)/b(k-1)*d(k-1);endx(n)=d(n)/b(n);for k=n-1:-1:1x(k)=(d(k)-c(k)*x(k+1))/b(k);endx=x(:);%基函数function y=alpha0(x)y=2*x.^3-3*x.^2+1;function y=alpha1(x)y=-2*x.^3+3*x.^2;function y=beta0(x)y=x.^3-2*x.^2+x;function y=beta1(x)y=x.^3-x.^2;第二题:多项式拟合算法原理:%mafit.mfunction p=mafit(x,y,m)% 用途:多项式拟合%格式:p=mafit(x,y,m), x, y为数据向量,m为拟合多项式次数,p返回%多项式系数降幂排列format short;A=zeros(m+1,m+1);for i=0:mfor j=0:mA(i+1,j+1)=sum(x.^(i+j)); endb(i+1)=sum(x.^i.*y);enda=A\b';p=fliplr(a'); %按降幂排列四、实验内容⑴第一个方程的程序:x=-5:0.1:5;y=1./(1+x.^2);plot(x,y,'r')hold on%拉格朗日插值x1=-5:1:5;y1=1./(1+x1.^2);xx=-4.5:0.5:4.5;yy=malagr(x1,y1,xx);plot(xx,yy,'b*')%三次样条插值dy0=-2*(-5)/(1+25);dyn=-2*5/(1+25);m=maspline(x1,y1,dy0,dyn,xx);plot(xx,m,'ok')⑵第二个方程的程序:x=-5:0.2:5;y=atan(x);plot(x,y,'r');hold on%拉格朗日插值x1=-5:1:5;y1=atan(x1);xx=-4.5:0.5:4.5;yy=malagr(x1,y1,xx);plot(xx,yy,'b*')%三次样条插值dy0=1./(1+25);dyn=1./(1+25);m=maspline(x1,y1,dy0,dyn,xx); plot(xx,m,'ok')⑶第三个方程的程序:x=-5:0.1:5;y=x.^2./(1+x.^4);plot(x,y,'r')hold on%拉格朗日插值x1=-5:1:5;y1=x1.^2./(1+x1.^4);xx=-4.5:0.5:4.5;yy=malagr(x1,y1,xx);plot(xx,yy,'b*')%三次样条插值dy0=-2*(-5)*(1-5.^4)/(1+5.^4);dyn=-2*(5)*(1-5.^4)/(1+5.^4);m=maspline(x1,y1,dy0,dyn,xx);plot(xx,m,'ok')axis([-5,5,-0.2,1])第二题:多项式拟合程序:x=[-1.5 -1.0 -0.5 0.0 0.5 1.0 1.5]';y=[-4.45 -0.45 0.55 0.05 -0.44 0.54 4.55]';plot(x,y,'or'); hold on%三次多项式拟合p1=mafit(x,y,3);x1=-1.5:0.1:1.5;y1=p1(1)*x1.^3+p1(2)*x1.^2+p1(3)*x1+p1(4);plot(x1,y1,'.-')%平方误差y11=p1(1)*x.^3+p1(2)*x.^2+p1(3)*x+p1(4);err1=sum((y-y11).^2)%五次多项式拟合p2=mafit(x,y,5);x1=-1.5:0.1:1.5;y2=p2(1)*x1.^5+p2(2)*x1.^4+p2(3)*x1.^3+p2(4)*x1.^2+p2(5)*x1+p2(6); plot(x1,y2,'g')%平方误差y22=p2(1)*x.^5+p2(2)*x.^4+p2(3)*x.^3+p2(4)*x.^2+p2(5)*x+p2(6);err2=sum((y-y22).^2)五、实验结果第一题⑴第一个方程的图形:-5-4-3-2-112345-0.4-0.200.20.40.60.811.21.41.6⑵第二个方程的图形:-5-4-3-2-1012345-1.5-1-0.50.511.5⑶第三个方程的图形:-5-4-3-2-1012345-0.200.20.40.60.8第二题:平方误差:三次多项式拟合的平方误差:err1 =1.8571e-004五次多项式拟合的平方误差:err2 =4.7727e-005离散函数(x,i y)和拟合函数的图形:i-1.5-1-0.500.51 1.5六、实验结果分析1、由第一题的三个图可知:拉格朗日插值会出现很大的误差,即Runge现象,运行的结果不好,但是三次样条插值法的效果就很好,误差很小,接近真实值.2、由第二题的图像知,三次多项式拟合和五次多项式的拟合效果都很好.比较三次多项式拟合的平方误差:err1 =1.8571e-004和五次多项式拟合的平方误差:err2 =4.7727e-005知五次多项式拟合比三次多项式拟合更加准确.。

相关主题