当前位置:
文档之家› 分段线性插值与三次样条插值法
分段线性插值与三次样条插值法
实验内容: 编写分段线性插值法及三次样条插值法通用子程序,依据数据表
xi
xi
2.0
2.1
2.2
2.3
2.4
1.414214 1.449138 1.483340 1.516575 1.549193
构造相应的插值多项式,并计算函数 f ( x) x 在 x 2.15 的近似值。
1
实验步骤及程序: 1、分段线性插值法流程图
实验报告
实验项目 理论内容 实验室名称 插值法 分段线性插值与三次样条插值 文理管 203 实验日期 授课日期 微机编号 2016/9/30 2016/9/0 E1
实目的及要求:
1、学会常用的插值方法,求函数的近似表达式,以解决其它实际问题; 2、明确插值多项式和分段插值多项式各自的优缺点; 3、熟悉插值方法的程序编制;如果绘出插值函数的曲线,观察其光滑性。
2
2、分段线性插值法源程序:
function [f] = fenduan(~,~,~,~) x=[2.0 2.1 2.2 2.3 2.4]; y=[1.414214 1.449138 1.483340 1.516575 1.549193]; y_1=0.5*y.^(-0.5); x0=2.15; f = 0.0; if(length(x) == length(y)) if(length(y) == length(y_1)) n = length(x); else disp('y 和 y 的导数的维数不相等!'); return; end else disp('x 和 y 的维数不相等!'); return; end for i=1:n if(x(i)<=x0)&& (x(i+1)>=x0) index = i; break; end end h = x(index+1) - x(index); fl = y(index)*(1+2*(x0-x(index))/h)*(x0-x(index+1))^2/h/h + ... y(index+1)*(1-2*(x0-x(index+1))/h)*(x0-x(index))^2/h/h; f = fl;
6
end yy(i)=a(j)+b(j)*(xx(i)-x(j))+c(j)*(xx(i)-x(j))^2+d(j)*(xx(i)-x(j))^3; end end
7
结果分析与讨论:
运用 MATLAB 分别对分段线性插值和三次样条插值进行编程的到数值均为 1.4664 说明实验结果准确无误,通过实验可以得出,在低阶方程的求解中,两种方法均能精确的 得到近似解,但是在高阶方程的求解中三次样条插值方法更加精确,误差较小,由于运用 追赶法求解,速度要比分段线性插值更加的快,这就说明在应对不同阶数的方程时,我们 应该选用最优方法。
实验报告评分标准
评分项目 实验步骤及程序 结果分析与讨论 合计 满分 10 5 20 得分 评分项目 运行结果 满分 5 得分
8
输入xi , yi , i = 1, ⋯ , n 及 x
ia ⟵ 1, ib ⟵ n
否 ib − ia > 1? 是 im ⟵ ia + ib 的整数部分 2 执行求拉格朗日插值的 程序,计算以ia, ib为节 点的线性插值函数在插 值点的函数值P1 x
否 ib ⟵ im xm < ������? 是 ia ⟵ im 输出p1 (������)
5
%自然样条端点条件(端点二阶导数为零)% if flag==0; A(1,1)=1; A(n,n)=1; end %---------------------------------% %端点一阶导数条件% if flag==1 A(1,1)=2*dx(1); A(1,2)=dx(1); A(n,n-1)=dx(n-1); A(n,n)=2*dx(n-1); B(1,1)=3*(dy(1)/dx(1)-vl); B(n,1)=3*(vr-dy(n-1)/dx(n-1)); end %---------------% %端点二阶导数条件% if flag==2 A(1,1)=2; A(n,n)=2; B(1,1)=vl; B(n,1)=vr; end %---------------% c=A\B; for i=1:n-1 d(i)=(c(i+1)-c(i))/(3*dx(i)); b(i)=dy(i)/dx(i)-dx(i)*(2*c(i)+c(i+1))/3; end [mm,nn]=size(xx); yy=zeros(mm,nn); for i=1:mm*nn for ii=1:n-1 if xx(i)>=x(ii) && xx(i)<x(ii+1) j=ii; break; elseif xx(i)==x(n) j=n-1; end
3
3、三次样条插值法流程图
输入数据flag
flag = 1? 否
是 执行子程序“第一类边界下的样条三次插 值”
是 flag = 2? 执行子程序“第二类边界下的样条三次插 值”
否 是
flag = 3? 否 输出失败信息
执行子程序“第三类边界下的样条三次插 值”
4
4、三次样条插值法源程序
function[yy, b, c, d]=spline3(~,~,~,~,~,~) %三次样条插值函数 %(x,y)为插值节点,xx 为插值点; %flag 表端点边界条件类型: %flag=0:自然样条(端点二阶导数为 0); %flag=1:第一类边界条件(端点一阶导数给定); %flag=2:第二类边界条件(端点二阶导数给定); %vl,vr 表左右端点处的在边界条件值。 %样条函数为:Si(x)=yi+bi*(x-xi)+ci*(x-xi)^2+di*(x-xi)^3 %b,c,d 分别为各子区间上的系数值 %yy 表插值点处的函数值. x=[2.0 2.1 2.2 2.3 2.4]; y=[1.414214 1.449138 1.483340 1.516575 1.549193]; xx=2.15; flag=0; vl=2.0; vr=2.4; if length(x)==length(y) n=length(x); a=zeros(n-1,1); b=a; d=a; dx=a; dy=a; A=zeros(n); B=zeros(n,1); end for i=1:n-1 a(i)=y(i); dx(i)=x(i+1)-x(i); dy(i)=y(i+1)-y(i); end for i=2:n-1 A(i,i-1)=dx(i-1); A(i,i)=2*(dx(i-1)+dx(i)); A(i,i+1)=dx(i); B(i,1)=3*(dy(i)/dx(i)-dy(i-1)/dx(i-1)); end