四點(diǎn)二次插值的單片機匯編程序實(shí)現
在微機化的儀器儀表控制軟件中,特別是快速控制軟件中,或因直接計算過(guò)于復雜,或因只有經(jīng)驗數據沒(méi)有理論公式,常采用查表插值法計算某些數據。
一般適合于插值法的函數是光滑性較好的函數。所謂“光滑性較好”是指以下兩個(gè)方面:
◆連續且盡量高階地可導:
◆其泰勒展開(kāi)式中高次項的絕對值較小。
采用多項式插值時(shí),若提高多項式次數,除了增加計算量(在高速實(shí)時(shí)控制的程序中,計算速度是很重要的問(wèn)題)外,從數學(xué)上看還有若干缺點(diǎn),故實(shí)際應用中一般不用太高的次數。拋物線(xiàn)插值(三點(diǎn)二次插值)是常用的一種。
提高精度的另一途徑是增加節點(diǎn)密度。對于三點(diǎn)二次插值,節點(diǎn)密度若能提高二倍,則截斷誤差大約可以縮小到原來(lái)的1/8。但是這樣一來(lái)數據表的容量也要加大二倍,因此在容量和精度間存在著(zhù)矛盾。
本文介紹一種“四點(diǎn)二次插值”算法,與普通三點(diǎn)=次插值相比,節點(diǎn)密度不變,計算量也差不多,但精度(最大誤差限)大致相當于節點(diǎn)密度提高二倍的效果。
四點(diǎn)二次插值的思想是:計算(xk,xk+1)區間的插值時(shí),用(xk-1,xk,)的三點(diǎn)二次插值結果和(xk,xk+1)的三點(diǎn)二次插值結果相平均,作為最后結果。若采用等距節點(diǎn),間距為h,根據這個(gè)思想,不難推出以下計算公式:
與普通的三點(diǎn)二次插值法對比,可以看出計算量差不多(乘法次數相同,除以4可以用移位實(shí)現)。
下面粗略分析其精度。
二次插值誤差余項應有三個(gè)零點(diǎn),此法中xk和k+1是其兩個(gè)零點(diǎn)。顯然,如果第三個(gè)零點(diǎn)在x1和xk+1的中點(diǎn)處,則其精度和節點(diǎn)密度提高二倍后的三點(diǎn)二次插值法相同。
設(xk-1,xk,xk+1)的三點(diǎn)二次插值誤差余項為R1(x),(xk,xk+1xk+2)的三點(diǎn)二次插值誤差余項為R2(x)則四點(diǎn)二次插值的誤差余項為
系數K(ξ1′,ξ2)反映中點(diǎn)xm處四點(diǎn)二次插值的誤差,比原來(lái)三點(diǎn)二次插值的誤差減小的程度。若f'''(x)是常數,則k(ξ1,ξ2)=0,因而R(xm)=0。也就是說(shuō),R(z)第三個(gè)零點(diǎn)在xm處,達到上文所述的效果。
對于比較光滑的函數,f'''(x)在小區間內不會(huì )變化太大,故k(ξ1,ξ2)式中的分子絕對值應較小。若K(ξ1,ξ2)近于0,則R(xm)也近于0,R(x)的零點(diǎn)仍在xm附近,效果與上述接近??梢宰C明(限于篇幅.證明略),只要f'''(ξ1)與f'''(ξ)之比在O.5~2之間,則第三個(gè)零點(diǎn)必然在xk和xk+1之間。
若K(ξ1,)絕對值較大即f'''(ξ2)與f'''(ξ2)之比距1較遠),或,f'''(ξ1)與,f…(ξ2)反號,則零點(diǎn)不在中點(diǎn)附近,此時(shí)精度并沒(méi)有明顯提高,但不會(huì )比原來(lái)的情況差。這必然是K(ξ1,ξ2)式中的分母絕對值太小,也就是說(shuō),是處在,f'''(x)過(guò)零或近于零的區域。
對于較光滑的函數,原三點(diǎn)二次插值法的截斷誤差大致正比于其三階導數,因此三階導數較大的區域也是精度最差的區域。f'''(x)過(guò)零或近于零的區域中,誤差本來(lái)就遠小于其它區域。綜上所述,四點(diǎn)二次插值法與之相比,在三階導數較大的區域,精度大致改進(jìn)到相當于節點(diǎn)密度提高二倍后的三點(diǎn)二次插值法;在三階導數近于0的區域,則不會(huì )比原來(lái)三點(diǎn)二次插值法差。從實(shí)用的角度,可以說(shuō)已經(jīng)實(shí)現了上文所說(shuō)的效果。
另外,還可以指出,這個(gè)算法中的v1、v2都是由數據表中相鄰項的差值產(chǎn)生的,絕對值常常較小,故乘法??梢圆捎玫途瘸?。這一點(diǎn)在以較低檔的微處理器構成的應用系統中是有實(shí)際意義的。如下面AVR單片機的程序中,結果是雙字節精度,但其中乘法為單字節。
下面將給出以MCS-96單片機匯編語(yǔ)言和AVR單片機匯編語(yǔ)言編寫(xiě)的程序實(shí)例。
實(shí)例中,取間隔h為2的整數冪。這樣,定點(diǎn)形式的自變量只要采用簡(jiǎn)單的移位,即可以得出整數的k和純小數的“,作為下列程序的入口參數。在MCS一96單片機的程序中,k和u均取雙字節;在A(yíng)VR單片機的程序例中,k和u均取單字節,但結果為雙字節。
這是一個(gè)應用程序中用來(lái)查幾種數據表的子程序。因為這些表都是增函數,故下面設計中認定“[v2
評論