三次样条插值的求解

  • 格式:doc
  • 大小:536.50 KB
  • 文档页数:8

三次样条插值的求解摘要:分段低次插值虽然解决了高次插值的振荡现象和数值不稳定现象,使得插值多项式具有一致收敛性,保证了插值函数整体的连续性,但在函数插值节点处不能很好地保证光滑性要求,这在某些要求光滑性的工程应用中是不能接受的。

如飞机的机翼一般要求使用流线形设计,以减少空气阻力,还有船体放样等的型值线,往往要求有二阶光滑度(即有二阶连续导数)。

因此,在分段插值的基础上,引进了一种新的插值方法,在保证原方法的收敛性和稳定性的同时,又使得函数具有较高的光滑性的样条插值。

关键字:三转角方程 三弯矩阵方程0. 引言1,三次样条函数定义1:若函数2()[,]S x a b C ∈,且在每个小区间上1,j j x x +⎡⎤⎦⎣上是三次多项式,其中01n a x x x b ⋯=<<<= 是给定节点,则称()s x 是节点01,,,n x x x ⋯上的三次样条函数。

若节点j x 上 给定函数值()j j y f x =(0,1,)j n ⋯= ,且()j j s x y = (0,1,)j n ⋯= (1.1)成立,则称 ()s x 为三次样条差值函数。

从定义知,要求出()s x ,在每个应小区间1[,]j j x x + 上确定4个待定系数,共有 n 个小区间,故应确定4n 个参数,根据()s x 在[,]a b 上二阶导数连续,在节点()1,2,3,,1j x j n ⋯=-处应满足连续性条件(0)(0),j j s x s x -=+ ''(0)(0),j j s x s x -=+''''(0)(0)j j s x s x -=+ (1.2) 共有 3n-3个条件,再加上()s x 满足插值条件(1.1),共有4n-2个条件,因此还需要2个条件才能确定()s x 。

通常可在区间[,]a b 端点0,n a x b x ==上各加一个条件(称边界条件),边界条件可根据实际的问题要求给定。

常见的三种: (1) 已知两端的一节导数值,即{''00''()()n n s x f s x f == (1.3)(2)两端的二阶导数已知,即{''''00''''()()n ns x f s x f == (1.4)特殊情况下的边界条件''''0()()0n s x s x == (1.4)’ 称为自然边界条件(3)当()f x 是以0n x x - 为周期函数时,则要求()s x 也是周期函数,这时边界条件应满足而此时式中 , 这样确定的样条函数称为周期函数。

2.三转角方程及相应的边界条件函数s(x)的表达式,若满足假定的在节点处的值为,再由,是 ,则由分段Hermite 插值式得(2.1)其中是插值基函数。

由得,(2.1)中在整个区间上连续。

且满足。

然而在公式(2.1)中是未知的,它可利用式及边界条件来确定。

为了求出,下面考虑是这里 ,对于是 112426''(0)()j j j j j jjjs x m m y y h h h+++=--+-同理可得''()s x 在区间1[,]j j x x -上的表达式111113221116(2)624642()()j j j jj jj j j jj j j x x x x x x x x x S x y y m m hhh--------+-----''=-++及 1!2111426''(0)()j j j j j j j j s x m m y y h h h------=++-由得(1,2,,1)j n =-用111j jh h -+,,除上式的两边并加以整理得1111111121,2,,1)3()1,2,,1)j j j j j j j j j jj j j j j j j jjjjj jm m m g n h h h h h h y y y y gn h h λμλμλμ-+----+-++==-==++--=+=- 其中:(j (j (2.2)1,1n n -+共个个方程个未知量(2.2)式称为基本方程组如果问题要求满足第一类(一阶)边界条件:即 00m f '= n n m f '=基本方程组(2.2)化为n-1阶方程组11112211111112()3()j jj j j j j j j jjjj y y y y m m m h h h h hh+--+-----+++=+3.算法步骤: ①输 入 n 个插值结点,01n a x x x b ⋯=<<<=,对应的函数插值为1 2.,,,n y y y 边界条件''12,y y ,待求插值点0x 。

② 计算j j jh x x -=- (1,2,3,1)j n =- 。

③计算11j j j jh h h μ--=+ ,111116(),(2,,1)j jj j j j j j jy y y y d j n h h h h +-----=-=-+ 。

④ 计算'2111116()y y y h h β-=-, '1116()n n n n n n y y y h h β-----=-。

⑤ 用追赶法求解方程组() ⑥ 输出各区间的()j s x 表达式。

⑦ 判断0x 所在区间1[,]j j x x +并计算插值0y ,绘制各区间的三次样条插值曲线。

4.三次样条插值函数的Matlab程序设计在Matlab环境下根据上述算法步骤进行编程,源程序如下:function []=spline3(X,Y,dY,x0,m)N=size( X,2);s0=dY(1); sN=dY(2);inte rval=0.025;disp('x0为插值点')x0h=ze ros(1,N-1) ;for i=1:N-1 h(1,i) =X(i+1) -X(i); e ndd(1,1)=6*( (Y(1,2) -Y(1,1) )/h( 1,1)- s0)/h(1,1);d(N,1)=6*(sN-(Y(1,N)-Y(1,N-1))/h(1,N-1))/h(1,N-1);for i=2:N-1d(i,1)=6*((Y(1,i+1)-Y(1,i))/h(1,i)-(Y(1,i)-Y(1,i-1))/h(1,i-1) )/ ( h( 1,i)+h( 1,i-1)) ; endmu=zer os(1,N-1); md=zer os( 1,N-1);md=zeros(1,N-1);for i=1:N-2u=h(1,i+1)/(h(1,i)+h(1,i+1));mu(1,i+1)=u;md(1,i)=1-u; endp(1,1)=2; q(1,1)=mu(1,1)/2;for i=2:N-1p(1,i)=2-md(1,i-1)*q(1,i-1); q(1,i)=mu(1,i)/p(1,i); endp(1,N)=2-md(1,N-1)*q(1,N-1);y=zeros(1,N); y(1,1)=d(1)/2;for i=2:N y(1,i)=(d(i)-md(1,i-1)*y(1,i-1))/p(1,i); endx=zeros(1,N); x(1,N)=y(1,N);for i=N-1:-1:1 x(1,i)=y(1,i)-q(1,i)*x(1,i+1); endfprintf ('M为三对角方程的解\n'); M=x;fprintf ('\n');syms t;digits (m);for i=1:N-12pp(i)=M(i)*(X(i+1)-t)^3/(6*h(i))+M(i+1)*(t-X(i))^3/(6*h(i))+(Y(i)-M(i)*h(i)^2/6)*(X(i+1)-t)/h(i)+(Y(i+1)-M(i+1)*h(i)^2/6)*(t-X(i))/h(i);pp(i)=simplify(pp(i)); coeff=sym2poly(pp(i));if length(coeff)~=4tt=coeff(1:3); coeff(1:4)=0; coeff(2:4)=tt; endif x0>X(i)&x0<X(i+1) L=i;y0=coeff(1)*x0^3+coeff(2)*x0^2+coeff(3)*x0+coeff(4);endval=X(i):interval:X(i+1);for k=1:length(val)fval(k)=coeff(1)*val(k)^3+coeff(2)*val(k)^2+coeff(3)*val(k)+coeff(4); endif mod(i,2)==1 plot(val,fval,'r+')else plot(val,fval,'b.') endhold onans=poly2sym(ans,'t')fprintf('在区间[%f,%f]内\n',X(i),X(i+1));fprintf('三次样条函数S(%d)=',i);pretty(ans); endfprintf ('x0所在区间为[%f,%f]\n',X(L),X(L+1)); pretty(ans); end fprintf ('函数在插值点x0=%f的值为\n',x0);y0程序中:X,Y为输入结点,dY为两端点一阶导阵,x 为待求插值点,m为有效数字位数。

应syms xf1=1/(1+x^2);f2=1/(1+5*x^2);x=-5:5;y1=subs(f1,x);y2=subs(f2,x);xx=-5:0.25:5;yy=spline(x,y1,xx);yy2=spline(x,y2,xx); subplot(2,2,1);plot(x,y1,'o'.xx.yy), gridt=-5:0.25:5;yt=subs(f1,t);yt2=subs(f2,t); subplot(2,2,2);plot(t,yt).gridsubplot(2,2,3)plot(x,y2,'o',xx,yy2), gridsubplot(2,2,4)plot(t,yt2),grid。