摘要本文细致的讲解了三次样条插值函数的产生及在实际中解决的问题,通过MATLAB的程序编写,可以将复杂的计算省去,直接的给出了三次样条插值的结果与实际结果间的误差,验证实际结果和理论值的一致性。
避免了求解方程中的不必要计算,使求解效率得到显著的提高。
关键词插值函数三次样条插值 MATLAB1 三次样条插值函数概论当插值节点很多时,插值多项式的次数就会很高,这不仅增大了计算量,还会影响结果的精确度.虽然可以采用上述分段插值,但是主要缺点就是个分段接头处不光滑,插值函数的导数不连续,因此想构造这样的插值:既能分段的低次插值,又能保证接头处的光滑,就产生了三次样条插值函数.1.1定义设函数()f x 市区间[a,b]上的二次连续可微函数,在区间[a,b]上给处一个划分。
设函数()f x 是区间[a,b]上的一个划分011...n n a x x x x b -∆=<<<<=如果函数()S x 满足条件(1)在每个小区间1[,]k k x x +(k=1,2,….,n )上()S x 是一个部超过m 次的多项式。
(2)在节点k x (k=1,2,….,n )处具有m-1阶的连续导数。
(3)()()(0,1,2,...)j j s x f x j n ==1.2三次样条差值函数的构造由于三次样条插值我、函数s(x)的插值节点处的二阶导数存在,因此令各节点处的二阶导数为'()(0,1,...,)k s x m k n == (1.01)根据样条插值函数的定义,三次样条插值函数是s(x)在每一个小区间)1....,1,0](,[]1-=+n k x x k k 上市不超过三次的多项式。
在每一个小区间)1....,1,0](,[]1-=+n k x x k k 上,其二阶导数为线性函数,即''1111()k kk k k k k kx x x x s x m m x x x x ++++--=+-- (1.02)对式(1.02)积分两次,则得到k k k kk k k k k b x x a h x x m h x x m x s +-+-++=++)(6)(6)()(3131 (1.03)其中k k k k k b a x x h ,,1-=+为任意常数。
又根据样条插值函数定义中的条件(3),即k k k y x f x s ==)()(111)()(+++==k k k y x f x s可以确定k a 与k b 为k a =)(611k k k k k k m m hh y y ---++62k kk k h m y b -= (1.04)将式(1.04)中k a 与k b 的值代入表达式(1.03后,就可以得到样条插值函数)(x s 在区间],[1+k k x x 上的表达式为6))((66)(6)()(2113131k kk k k k k k k k k k k k k k h m y x x m m h h y y h x x m h x x m x s -+----+-+-=++++ (1.05)其中k m 与1+k m 分别为区间],[1+k k x x 两端点处的二阶导数值。
由此可以看处,只要能确定各点处的二阶导数值k m )1....,1,0(-=n k ,则子渠道间上的三次样条插值函数)(x s 也确定了。
)(x s 在区间[a,b]上的一阶导数连续,在各节点的左右两子区间上的s(x)虽然不同,但在连接点处的导数存在,即在连接点处的左右导数相等,有)0()0(''+=-k k x s x s(1.06)为了利用条件(2.18),在x 属于],[]1+k k x x 时,县求)('x s 为)(62)(2)()(112121'k k kk k k k k k k k k m m h h y y h x x m h x x m x s ---+-+--=++++(1.07)当x 属于],[1+k k x x 时,11'63)0(++---=+k k k k k k k k m hm h h y y x s(1.08)整理得:)1,.....,2,1(2)1(11-==++-+-n k m m m k k k k k λμμ(1.09)其中1-+=k k kk h h h μ)(61111--+----+=k k k k k k k k k h y y h y y h h λ2 实际问题举例分析例:2.1计算思想设'(0)s m =先求分段Hermite 插值.在[-1,1]上,易知二次函数()22p x x x=+满足(1)1,(0)0,p p -=-= '(1)0p -=为使得三次函数S(x)满足(1)(1)1s p -=-=-,(0)(0)0S p ==,''(1)(1)0,S p -=-=令2()()(1)S x p x c x x =++有'2()22[2(1)(1)]S x x c x x x =+++++.由'(0)2S c m =+=得2c m =-,从而22()2(2)(1)S x x x m x x =++-+在[0,1]上,易得2()(1)p x cx x +-有'2()43[(1)2(1)]S x x c x x x =-++-+-显然(0)(0)0S p ==及(1)(1)1S p ==及''(1)(1)1S p ==-又由'(0)3S c m =+=有3c m =- 从而22()23(3)(1)S x x x m x x =-++-- 求导得2'22(2)[2(1)(1)],10()4(3)[4(1)2],0 1.x m x x x x S x m x x x ⎧++-+++-≤≤=⎨-+--+≤≤⎩最后有''''7(00)(00)24(2)44(3)4S S M m m -=+⇒+-=---⇒=得3232117,10424()517,01424x x x x S x x x x x ⎧-++-≤≤⎪⎪=⎨⎪-++≤≤⎪⎩2.2主要程序代码及命令Function m=naspline(x,y,dy0,dyn,xx)%用途:三样条插值(一阶导数边界条件)%格式:m=naspline(x,y,dy0,xx) x为节点向量,y为数据,dy0,dyn为左右%两短点的一介倒数值,如果xx 缺省,则输出各节点的一阶导数值,m 为xx %的三样条插值n=length(x)-1;h=diff(x);lemda=h(2:n)./(h(1:n-1)+h(2:n));mu=1-lemda;g=3*(lemda.*diff(y(1:n))./h(1:n-1)+mu.*diff(y(2:n+1))./h(2:n));g(1)=g(1)-lemda(1)*dy0;g(n-1)= g(n-1)-mu(n-1)*dyn;%求解三对角方程dy=nachase(lemda,2*ones(1:n-1),mu,g);m=[dy0;dy;dyn];if nargin>=5s=zeros(size(xx));for i=1:nif i==1,kk=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;endfunction x=nachase(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.^+x;function y=beta1(x)y=x.^3-x.^2;2.3结果演示naspline([-1 0 1],[-1 0 1],0,-1) %输入m的值ans=1.7500-1.0000naspline([-1 0 1],[-1 0 1],0,-1,-1:0.25:1)ans=-1.0000 -0.9258 -0.7188 -0.4023 0 -2.2444 -1.631 -1.10981 -0.7500总结随着计算机技术及硬件设施的不断发展,计算机语言的演化从最开始的机器语言到汇编语言,最后到支持面向对象技术的面向对象语言。
这就要求提供的计算方法也不断发展。
同时在实践也给旧的插值逼近方法不断提出问题,这就要求新的插值逼近方法要更复杂,误差精度更高,同时解决更多方面的问题。
插值逼近方法的发展也需要新的理论指导。
自然辩证法的科学理论中提到科学“范式”概括了插值逼近法得法的发展过程.辩证唯物主义自然观、自然科学发展过程及其规律,分析与综合、归纳法与演绎法、想象和类比等科学逻辑思维方法的应用都在插值逼近理论的发展过程中起到了重要作用。
用科学的逻辑思维方法认识事物才会清楚的了解其过去、现在和未来.计算数学中的插值逼近方法发展同样遵循着科学技术、科学理论发展的一般规律.以自然辩证法的观点来分析.有助于我们更加深入地认识插值逼近以及整个数值计算方法发展的历史、现状和趋势。
插值逼近方法及数学理论的进一步发展也必将为自然辩证法的发展提供基础。
本次的课程设计的整个过程让我认识到了基础知识的欠缺,我通过查阅大量的资料,重新阅读关于计算方法、数学分析、高等代数、MATLAB方面的书籍,从根源上了解,三样条插值的由来和应用范围等,是我受益良多。
切切实实的认识的努力学习的重要性。
参考资料[1]陈辉,李文宇,张传芳数值计算方法哈尔滨哈尔滨工业大学出版社,2009[2]李庆扬,易大义,王能超. 现代数值分析. 北京高等教育出版社,1995[3]刘春风,何亚丽,应用数值分析北京冶金工业出版社 2005[4]郝红伟,MATLAB 6,北京,中国电力出版社,2001[5]姜健飞,胡良剑,数值分析及其MATLAB实验,科学出版社,2004[6]薛毅,数值分析实验,北京工业大学出版社,2005。