魏霖靜 鄭琯荷(甘肅農業大學信息科學技術學院 甘肅 蘭州 730070)
三次樣條插值函數在多媒體課件中的實現
魏霖靜 鄭琯荷
(甘肅農業大學信息科學技術學院 甘肅 蘭州 730070)
作為計算方法中的一種重要的插值函數,三次樣條插值函數一直是學生學習的一大重點及難點,要如何學好三次樣條插值函數也成了教師和學生共同思考的問題。通過多媒體課件可以更好的表達這一函數的思想。
三次樣條插值函數;多媒體課件
三次樣條插值函數是教學的重點及難點,普通的板書及講授不能很好的讓學生了解掌握這個函數,因此,我們使用多媒體課件的形式來表達,讓學生清晰明了的掌握。
函數S(x)∈C2[a,b],且在每個小區間[xj,xj+1]上是三次多項式,其中a=x0 若在節點xj上給定函數值Yj=f(Xj).(j=0,1,,n),并成立S(xj)=yj.(j= 0,1,,n),則稱S(x)為三次樣條插值函數。 由于插值節點有n+1個,故得到n個小區間,而每個小區間上要求一個三次多項式,每個區間需要4個條件,所以要確定樣條函數S,共需要4n個條件。 在插值節點上,S(xj)=f(xj),j=0,1,2,...,n,得到n+1個條件,在j=1,2,...,n-1,由S,S的一階導數,S的二階導數連續可以得到3(n-1)個條件,所以總共得到了,4n-2個條件,要確定S還需要兩個條件。就是通常所說的邊界條件。 邊界通常有自然邊界(邊界點的導數為0),夾持邊界(邊界點導數給定),非扭結邊界(使兩端點的三階導與這兩端點的鄰近點的三階導相等)。一般的計算方法書上都沒有說明非扭結邊界的定義,但數值計算軟件如Matlab都把非扭結邊界條件作為默認的邊界條件 如果假設S'(xi)=mi,i=0,1,…,n,利用分段Hermite插值多項式,當x∈[xi-1,xi]時: 其中hi=xi-xi-1。為確定S(x),只要確定mi,i=0,1,…,n。就可以用S"(xi-0)=S"(xi+0)來求出mi。 當x∈[xi-1,xi]時,由于: 所以可得出: 3(λif[xi-1,xi]+μif[xi,xi+1])=gi,最后得出: λimi-1+2mi+μimi+1=gi,i=1,2,…,n-1. (*式) 再結合不同的邊界條件,可得到關于mi的方程。 如邊界條件為:m0=y'0,mn=y'n,帶入(*式)可得: 如邊界條件為:S"(x0)=y"0,S"(xn)=y"n,則有: 連同(*式)一起,可得: 如邊界條件是周期性邊界條件,由S'(x0+0)=S'(xn-0),和S"(x0+0)=S" (xn-0),得到m0=mn和λnmn-1+2mn+μnm1=gn,其中: 所以得到: 在Matlab[2]環境下根據上述算法步驟進行編 程,主要源程序段如下: function[]=spline3(X,Y,dY,x0,m) N=size(X,2); s0=dY(1);sN=dY(2); interval=0.025; disp('x0為插值點') x0 h=zeros(1,N-1); for i=1:N-1 h(1,i)=X(i+1)-X(i);end d(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-1 d(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));end mu=zeros(1,N-1);md=zeros(1,N-1); md(1,N-1)=1;mu(1,1)=1; for i=1:N-2 u=h(1,i+1)/(h(1,i)+h(1,i+1));mu(1,i+1)=u; md(1,i)=1-u;end p(1,1)=2;q(1,1)=mu(1,1)/2; for i=2:N-1 p(1,i)=2-md(1,i-1)*q(1,i-1);q(1,i)=mu(1,i)/p(1,i);end p(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);end x=zeros(1,N);x(1,N)=y(1,N); for i=N-1:-1:1x(1,i)=y(1,i)-q(1,i)*x(1,i+1);end fprintf('M為三對角方程的解
');M=x; 在c語言[3]環境下根據上述算法步驟進行編程,主要源程序段如下: void cubic_getval (real_T*y,const int_T*size,const real_T*map,const real_T x,const int_T step) { int_T n=size[0]; //曲線系數 real_T*ai=(real_T*)malloc(sizeof(real_T)*(n-1)); real_T*bi=(real_T*)malloc(sizeof(real_T)*(n-1)); real_T*ci=(real_T*)malloc(sizeof(real_T)*(n-1)); real_T*di=(real_T*)malloc(sizeof(real_T)*(n-1)); real_T*h=(real_T*)malloc(sizeof(real_T)*(n-1));//x的?? /*M矩陣的系數 *[B0,C0,... *[A1,B1,C1,... *[0,A2,B2,C2,... *[0,... An-1,Bn-1] */ real_T*A=(real_T*)malloc(sizeof(real_T)*(n-2)); real_T*B=(real_T*)malloc(sizeof(real_T)*(n-2)); real_T*C=(real_T*)malloc(sizeof(real_T)*(n-2)); real_T*D=(real_T*)malloc(sizeof(real_T)*(n-2));//等號右邊的常數矩陣; real_T*E=(real_T*)malloc(sizeof(real_T)*(n-2));//M矩陣 real_T*M=(real_T*)malloc(sizeof(real_T)*(n));//包含端點的M矩陣; 分段插值 分段線性插值 分段三次Hermite插值 分段插值可以得到整體連續函數,但在連接點處一般不光滑,而Hermite插值雖然在連接點處一階光滑,但整體插值由于結點多次數高而有可能發生龍格現象。 希望:既想分段插值,又想在結點處保持光滑,甚至二階光滑——三次樣條。 三次樣條插值 舉例說明: 例4:對如下Runge現象中的函數,求用n分點作節點的三次樣條插值多項式s3(x)的圖像。 取n=5,10,20等,將區間等分成n份,取分點作為插值節點,利用matldb函數csape()作出它的三次樣條插值函數,并作出這些插值函數與被插函數的圖像。 但由于插值節點數目較多,故不列出插值函數的表達式,只畫出它們的圖象與被插函數的圖象的復合,從這些圖象可以看出,隨著節點數目的增多,樣條插值函數圖象越來越符合被插函數,因此避免Runge現象,也就是說三次樣條插值函數具有收斂性。 用多媒體課件表達出來的三次樣條插值函數,能生動形象的表達出來.讓學生和教師都能在課堂上達到事半功倍的效果。 [1]易大義,沈云寶,李有法.計算方法[M].浙江:浙江大學出版社,2002,(6):55-63. [2]張錚,楊文平,石博強,等.MATLAB程序設計與實例應用[M].北京:中國鐵道出版社,2003. [3]http://www.cnblogs.com/xpvincent/archive/2013/01/26 / 2878092 .html. G642.3 A 2095-7327(2016)-04-0097-03 蘭州市科技局項目編號2014-1-74。 魏霖靜(1977—),女,甘肅農業大學信息科學技術學院副教授,博士,研究方向為智能計算,生物信息學、網絡。2.三次樣條插值函數的推導過程








3.經典算法
4.三次樣條插值算法的多媒體課件表示





5.結論