您好,欢迎来粤嵌教育!请 登录  粤嵌技术中心 |  粤嵌教仪 | 咨询报名 | 联系我们 | 技术论坛 | 网站地图
粤嵌教育
新闻 > 软件开发 > 汇编

四点二次插值的单片机汇编程序实现

来源:电子工程世界 作者:郝立中 时间:2007-07-23
 

  在微机化的仪器仪表控制软件中,特别是快速控制软件中,或因直接计算过于复杂,或因只有经验数据没有理论公式,常采用查表插值法计算某些数据。
   
  一般适合于插值法的函数是光滑性较好的函数。所谓“光滑性较好”是指以下两个方面:
   
  ◆连续且尽量高阶地可导:

  ◆其泰勒展开式中高次项的绝对值较小。
   
  采用多项式插值时,若提高多项式次数,除了增加计算量(在高速实时控制的程序中,计算速度是很重要的问题)外,从数学上看还有若干缺点,故实际应用中一般不用太高的次数。抛物线插值(三点二次插值)是常用的一种。
   
  提高精度的另一途径是增加节点密度。对于三点二次插值,节点密度若能提高二倍,则截断误差大约可以缩小到原来的1/8。但是这样一来数据表的容量也要加大二倍,因此在容量和精度间存在着矛盾。
   
  本文介绍一种“四点二次插值”算法,与普通三点=次插值相比,节点密度不变,计算量也差不多,但精度(最大误差限)大致相当于节点密度提高二倍的效果。
   
  四点二次插值的思想是:计算(xk,xk+1)区间的插值时,用(xk-1,xk,)的三点二次插值结果和(xk,xk+1)的三点二次插值结果相平均,作为最后结果。若采用等距节点,间距为h,根据这个思想,不难推出以下计算公式: 

  与普通的三点二次插值法对比,可以看出计算量差不多(乘法次数相同,除以4可以用移位实现)。
   
  下面粗略分析其精度。
   
  二次插值误差余项应有三个零点,此法中xk和k+1是其两个零点。显然,如果第三个零点在x1和xk+1的中点处,则其精度和节点密度提高二倍后的三点二次插值法相同。
   
  设(xk-1,xk,xk+1)的三点二次插值误差余项为R1(x),(xk,xk+1xk+2)的三点二次插值误差余项为R2(x)则四点二次插值的误差余项为

  系数K(ξ1′,ξ2)反映中点xm处四点二次插值的误差,比原来三点二次插值的误差减小的程度。若f'''(x)是常数,则k(ξ1,ξ2)=0,因而R(xm)=0。也就是说,R(z)第三个零点在xm处,达到上文所述的效果。
   
  对于比较光滑的函数,f'''(x)在小区间内不会变化太大,故k(ξ1,ξ2)式中的分子绝对值应较小。若K(ξ1,ξ2)近于0,则R(xm)也近于0,R(x)的零点仍在xm附近,效果与上述接近。可以证明(限于篇幅.证明略),只要f'''(ξ1)与f'''(ξ)之比在O.5~2之间,则第三个零点必然在xk和xk+1之间。
   
  若K(ξ1,)绝对值较大即f'''(ξ2)与f'''(ξ2)之比距1较远),或,f'''(ξ1)与,f…(ξ2)反号,则零点不在中点附近,此时精度并没有明显提高,但不会比原来的情况差。这必然是K(ξ1,ξ2)式中的分母绝对值太小,也就是说,是处在,f'''(x)过零或近于零的区域。
   
  对于较光滑的函数,原三点二次插值法的截断误差大致正比于其三阶导数,因此三阶导数较大的区域也是精度最差的区域。f'''(x)过零或近于零的区域中,误差本来就远小于其它区域。综上所述,四点二次插值法与之相比,在三阶导数较大的区域,精度大致改进到相当于节点密度提高二倍后的三点二次插值法;在三阶导数近于0的区域,则不会比原来三点二次插值法差。从实用的角度,可以说已经实现了上文所说的效果。
   
  另外,还可以指出,这个算法中的v1、v2都是由数据表中相邻项的差值产生的,绝对值常常较小,故乘法常可以采用低精度乘。这一点在以较低档的微处理器构成的应用系统中是有实际意义的。如下面AVR单片机的程序中,结果是双字节精度,但其中乘法为单字节。
     
  下面将给出以MCS-96单片机汇编语言和AVR单片机汇编语言编写的程序实例。
   
  实例中,取间隔h为2的整数幂。这样,定点形式的自变量只要采用简单的移位,即可以得出整数的k和纯小数的“,作为下列程序的入口参数。在MCS一96单片机的程序中,k和u均取双字节;在AVR单片机的程序例中,k和u均取单字节,但结果为双字节。
   
  这是一个应用程序中用来查几种数据表的子程序。因为这些表都是增函数,故下面设计中认定“[v2×u′+v1]必为正”。表中相邻项的差,符合程序注释中的要求(特别是第二个例子vl、v2为单字节),否则程序需要适当调整。
   
  说明:以下y′、yO加、yl和y2即上文中的fxk-1),f(xk),f(xk+1)和f(xk+2)。


更多相关新闻
推荐课程
· 嵌入式linux系统与应用开发就业班
· ARM+嵌入式Linux开发周末培训班
· ARM+嵌入式Linux实时网络培训班
· MTK平台手机设计
· Cortex-M3与uC/OS-II开发应用班
· Windows CE系统定制与驱动开发培训班
· Cadence PCB设计高级培训班
· 高速嵌入式硬件设计培训班
· J2ME手机游戏开发培训班
· ARM+嵌入式Linux视频培训教程
热门点击
·用12C508实现LED三路七彩调光
·用于手机SoC设计的部件级多媒体功能模块
·51单片机数码管动态显示程序
·汇编延时程序算法详解
·用51单片机实现公历与农历星期的转换
·嵌入式中C和汇编的一些技巧
·单片机定时中断的精确定时编程方法种种
·嵌入式系统软件及编程语言
·ADSP-TSl01S嵌入式系统的混合编程
·TMS320C62X DSP的混合编程研究
·2.6.24内核编译 initrd-2...
·单片机定时中断实现显示的程序
·嵌入式系统软件及编程语言
·89C2051控制的摩托车报警系统
·对MC68HC908内Flash在线编程..
                更多..
关于我们 | 联系我们 | 我要报名 | 我要咨询 | 粤嵌招聘 | 地理位置图/乘车指引 | 友情链接 | 网站地图
在线客服:点击这里给我发消息 点击这里给我发消息  点击这里给我发消息 技术支持:点击这里给我发消息 网站合作:点击这里给我发消息
联系地址:广州市科学城光谱西路69号TCL文化产业园二期创意中心B407-408室  邮政编码:510663
客服热线:020-61038926转823/831 61038927 61038928 传真:020-61038928 24小时服务热线:15013238362 13450237194
技术支持与报障:service@gec-edu.org 020-61038927-809
Copyright © 2005-2010 粤嵌教育.All Rights Reserved.粤ICP备06060296号