1、 实验次样条插值实验 精品文档 数值分析实验报告 姓 名 忘川 学 号 1205025106 系 别 数学系 班级 12级 主讲教师 指导教师 实验日期 2014/6/25 专业 信息与计算科学专业 课程名称 数值分析 同组实验者 无 一、实验名称: 实验四、三次样条插值实验 二、 实验目的: 1. 掌握三次样条插值的运用; 2. 了解拉格朗日插值在高次上的误差。 三、实验内容及要求: 给定函数节点 (1)编写三次样条程序求,取 (2)作原函数、Langrage插值函数和三次样条插值函数的图
2、像,并比较它们的区别。 附: 算法描述: 三次样条插值(Cubic Spline Interpolation) PURPOSE: To find a piecewise cubic spline function . (,,… ). where , and ,…. INPUT: interpolated points; clamped boundary condition. OUTPUT: Step 1 F
3、or Step 2 By clamped boundary condition, Set ,, Step 3 Solve tri-diagonal system Step 4 Output . Stop 四、实验步骤(或记录) (1)编写三次样条程序求,取 程序如下: function [s,m]=selfspline(x0,y0,df,x,conds) n=length(x0); h=diff(x0); b=ones(1,n)*2; for j=2:n-1 a(j)=h(j-1)/(h(j-1)+h(j))
4、 c(j)=h(j)/(h(j-1)+h(j)); d(j)=6*(h(j-1)*(y0(j+1)-y0(j))-h(j)*(y0(j)-y0(j-1)))/(h(j)*h(j-1)*(h(j)+h(j-1))); end a(1:n-2)=a(2:n-1); switch conds case 1 a(n-1)=1; c(1)=1; d(1)=6*((y0(2)-y0(1))/(x0(2)-x0(1))-df(1))/(x0(2)-x0(1)); d(n)=6*(df(2)-(y0(n)-y
5、0(n-1))/(x0(n)-x0(n-1)))/(x0(n)-x0(n-1)); case 2 a(n-1)=0; c(1)=0; d(1)=2*df(1); d(n)=2*df(2); otherwise error('conds值错误, conds只能为1或2') end for i=2:n r=a(i-1)/b(i-1); b(i)=b(i)-r*c(i-1); d(i)=d(i)-r*d(i-1); end m(n)=d(n)/b(n); for i=n-1:
6、1:1 m(i)=(d(i)-c(i)*m(i+1))/b(i); end for j=1:length(x) for i=1:n-1 if x(j)>=x0(i)&x(j)<=x0(i+1) s(j)=m(i)*(x0(i+1)-x(j))^3/(6*h(i))+m(i+1)*(x(j)-x0(i))^3/(6*h(i))+(y0(i)-m(i)*h(i)^2/6)*(x0(i+1)-x(j))/h(i)+(y0(i+1)-m(i+1)*h(i)^2/6)*(x(j)-x0(i))/h(i); end
7、 end end 在matlab的命令窗口输入: >> k=0:10; >> x0=-5+k; >> y0=1./(x.^2+1); >> x=-5:0.5:5; >> y=1./(x.^2+1); >> df=diff(y) 得到如下数据: df = 0.0086 0.0118 0.0166 0.0245 0.0379 0.0621 0.1077 0.1923 0.3000 0.2000 -0.2000 -0.3000 -0.1923 -0.1077 -0.0621 -
8、0.0379 -0.0245 -0.0166 -0.0118 -0.0086 (2)作原函数、Langrage插值函数和三次样条插值函数的图像,并比较它们的区别。 先写拉格朗日插值的程序,如下: function y=lagr1(x0,y0,x) n=length(x0); m=length(x); for i=1:m z=x(i); s=0.0; for k=1:n p=1.0; for j=1:n i
9、f j~=k p=p*(z-x0(j))/(x0(k)-x0(j)); end end s=p*y0(k)+s; end y(i)=s; end end 然后直接在matlab的命令窗口输入: x0=[-5 -4 -3 -2 -1 0 1 2 3 4 5 ]; y0=1./(x0.^2+1); x=-5:0.01:5; df=diff(y0); conds=1; y=selfspline(x0,y0,
10、df,x,conds); y1=1./(x.^2+1); y2=lagr1(x0,y0,x); plot(x,y1,'b',x,y,'y-',x,y2,'r:') legend('原函数','三次样条插值','Lagrange插值') 即可得到以下图形: (3) 分析结果: 根据图像可知,用拉格朗日插值函数进行插值时,在次数较高时会出现龙格现象,导致其值与原函数相差甚大,在一定范围内插值拟合效果不好,而三次样条插值函数可以很好地接近原函数且光滑性较好,是比较理想的插值函数。 五、教师评语(或成绩) 教师签字 : 年 月 日 收集于网络,如有侵权请联系管理员删除






