测量数据的内插已有各种方法,如线性内插、多项式内插、样条函数插值等,但这里的Akima插值法具有独特的优点。线性内插只顾及其附近两点的影响。多项式内插时,低阶多项式由于参数较少,内插精度很低,而使用高阶多项式又会使解不稳定,出现“龙格”现象,即内插函数在插值点与实际数据符合得很好,而在插值点外出现较大的偏差。因此人们又在多项式的基础上发展了分片多项式,即样条函数。样条函数既保持了多项式运算简单的特点,又避免了多项式阶数较高时数值不稳定的缺点,因而得到了广泛的应用。但在样条函数插值中,确定任何一个小区间上的多项式,都要考虑所有数据点对它的影响。这不仅扩大了误差传播的范围,还增加了不少工作量。有时只用内插点附近的几个数据点作为控制点来内插。Aikma插值法和三次样条函数一样考虑了要素导数值的效应,因而得到的整个插值曲线是光滑的。三次样条函数插值法具有最小模、最佳最优逼近和收敛的特性,而Aikma插值法所得曲线比样条函数插值曲线更光顺,更自然。[1]
Akima相关实现的代码:
Akima's original paper:``A new method of interpolation and smooth curve fitting based on local procedures'', Journal of ACM 17, 4 (1970), 589-602
http://student.ndhu.edu.tw/~u9111023/akima.pdf
C implementation
http://packages.debian.org/source/squeeze/spline
C++ implementation
http://www.koders.com/cpp/fid1393B9D668316C1700966643DE0609660B9CB13A.aspx?s=%22Brian+Smith%22
C# implementation
Delphi implementation (see procedure BuildAkimaSpline in delphi/src/spline3.pas)
http://www.alglib.net/translator/re/alglib-2.6.0.delphi.zip
Akima's Fortran 66 implementation
http://cran.r-project.org/web/packages/akima/
Fortran 90 implementation
http://miyoshi.googlecode.com/svn-history/r72/trunk/common/common.f90
Java implementation
Lisp implementation "for AutoCAD 2d-Polylines"
http://autocad.xarch.at/code/candido/akima.lsp
Matlab implementation
http://www.mathworks.se/matlabcentral/fileexchange/1814-akima-interpolation
Pascal implementation (program description)
http://jean-pierre.moreau.pagesperso-orange.fr/Pascal/akima_pas.txt
Python implementation
http://www.lfd.uci.edu/~gohlke/code/akima.py.html
VB6 implementation (see subroutine BuildAkimaSpline in vb6/src/spline3.bas)
http://www.alglib.net/translator/re/alglib-2.6.0.vb6.zip [2]
参考文献:
[1]聂桂根, and 万剑华. "Akima 插值法在测量中的应用." 测绘科技动态 3 (1998): 31-34.
[2]http://www.mathworks.com/matlabcentral/fileexchange/1814-akima-interpolation