核心代码:

 //////////////////////////////////////////////////////////////////////
// Akima光滑插值
// t - 存放指定的插值点的值
// s[] - 一维数组,长度为5,其中s(0),s(1),s(2),s(3)返回三次多项式的系数,
// s(4)返回指定插值点t处的函数近似值f(t)(k<0时)或任意值(k>=0时)
// k - 控制参数,若k>=0,则只计算第k个子区间[x(k), x(k+1)]上的三次多项式的系数
//////////////////////////////////////////////////////////////////////
static float GetValueAkima(const void* valuesPtr, int stride, int n, float t, float* s, int k)
{
int kk,m,l;
float u[],p,q; // 初值
memset(s, , *sizeof(float)); // 特例处理
if (n < )
{
return s[];
}
if (n == )
{
s[] = YfGetFloatValue(valuesPtr, stride, );
s[] = s[];
return s[];
} float xStep = 1.0f/(n - ); if (n == )
{
float y0 = YfGetFloatValue(valuesPtr, stride, );
float y1 = YfGetFloatValue(valuesPtr, stride, );
s[] = y0;
s[] = (y1-y0)/xStep;
s[] = y0 + (y1 - y0)*t;
return s[];
} // 插值
if (k<)
{
if (t <= xStep)
kk = ;
else if (t >= (n-)*xStep)
kk = n-;
else
{
kk = ;
m = n;
while (((kk-m)!=)&&((kk-m)!=-))
{
l=(kk+m)/;
if (t < (l-)*xStep)
m=l;
else
kk=l;
} kk=kk-;
}
}
else
kk=k; if (kk>=n-)
kk=n-; u[]=(YfGetFloatValue(valuesPtr, stride, kk+) - YfGetFloatValue(valuesPtr, stride, kk))/xStep;
if (n==)
{
if (kk==)
{
u[]=(YfGetFloatValue(valuesPtr, stride, ) - YfGetFloatValue(valuesPtr, stride, ))/xStep;
u[]=2.0f*u[]-u[];
u[]=2.0f*u[]-u[];
u[]=2.0f*u[]-u[];
}
else
{
u[]=(YfGetFloatValue(valuesPtr, stride, ) - YfGetFloatValue(valuesPtr, stride, ))/xStep;
u[]=2.0f*u[]-u[];
u[]=2.0f*u[]-u[];
u[]=2.0f*u[]-u[];
}
}
else
{
if (kk<=)
{
u[]=(YfGetFloatValue(valuesPtr, stride, kk+) - YfGetFloatValue(valuesPtr, stride, kk+))/xStep;
if (kk==)
{
u[]=(YfGetFloatValue(valuesPtr, stride, ) - YfGetFloatValue(valuesPtr, stride, ))/xStep;
u[]=2.0f*u[]-u[];
if (n==)
u[]=2.0f*u[]-u[];
else
u[]=(YfGetFloatValue(valuesPtr, stride, ) - YfGetFloatValue(valuesPtr, stride, ))/xStep;
}
else
{
u[]=2.0f*u[]-u[];
u[]=2.0f*u[]-u[];
u[]=(YfGetFloatValue(valuesPtr, stride, ) - YfGetFloatValue(valuesPtr, stride, ))/xStep;
}
}
else if (kk>=(n-))
{
u[]=(YfGetFloatValue(valuesPtr, stride, kk) - YfGetFloatValue(valuesPtr, stride, kk-))/xStep;
if (kk==(n-))
{
u[]=(YfGetFloatValue(valuesPtr, stride, n-) - YfGetFloatValue(valuesPtr, stride, n-))/xStep;
u[]=2.0f*u[]-u[];
if (n==)
u[]=2.0f*u[]-u[];
else
u[]=(YfGetFloatValue(valuesPtr, stride, kk-) - YfGetFloatValue(valuesPtr, stride, kk-))/xStep;
}
else
{
u[]=2.0f*u[]-u[];
u[]=2.0f*u[]-u[];
u[]=(YfGetFloatValue(valuesPtr, stride, kk-) - YfGetFloatValue(valuesPtr, stride, kk-))/xStep;
}
}
else
{
u[]=(YfGetFloatValue(valuesPtr, stride, kk ) - YfGetFloatValue(valuesPtr, stride, kk-))/xStep;
u[]=(YfGetFloatValue(valuesPtr, stride, kk-) - YfGetFloatValue(valuesPtr, stride, kk-))/xStep;
u[]=(YfGetFloatValue(valuesPtr, stride, kk+) - YfGetFloatValue(valuesPtr, stride, kk+))/xStep;
u[]=(YfGetFloatValue(valuesPtr, stride, kk+) - YfGetFloatValue(valuesPtr, stride, kk+))/xStep;
}
} s[] = fabs(u[]-u[]);
s[] = fabs(u[]-u[]);
if ((s[]+1.0f == 1.0f) && (s[]+1.0f == 1.0f))
p = (u[]+u[])/2.0f;
else
p = (s[]*u[]+s[]*u[])/(s[]+s[]); s[] = fabs(u[]-u[]);
s[] = fabs(u[]-u[]);
if ((s[]+1.0f==1.0f) && (s[]+1.0f==1.0f))
q = (u[]+u[])/2.0f;
else
q = (s[]*u[]+s[]*u[])/(s[]+s[]); s[] = YfGetFloatValue(valuesPtr, stride, kk);
s[] = p;
s[] = xStep;
s[] = (3.0f*u[]-2.0f*p-q)/s[];
s[] = (q+p-2.0f*u[])/(s[]*s[]); //if (k<0)
{
p=t-(kk*xStep);
s[]=s[]+s[]*p+s[]*p*p+s[]*p*p*p;
} return s[]; }

切图:

相关软件的下载地址为:http://files.cnblogs.com/WhyEngine/TestSpline.zip

样条之Akima光滑插值函数的更多相关文章

  1. 样条之埃尔米特(Hermite)插值函数

    核心代码: ////////////////////////////////////////////////////////////////////// // 埃尔米特等距插值 /////////// ...

  2. Matlab hermite

    保形分段三次hermite插值 % 这是MATLAB里面的pchip.m文件.这里把它的凝视改写成汉语,主要是想弄清楚它是怎么计算在节点处的导数的. function v = pchip(x,y,xx ...

  3. python scipy样条插值函数大全(interpolate里interpld函数)

    scipy样条插值 scipy样条插值1.样条插值法是一种以可变样条来作出一条经过一系列点的光滑曲线的数学方法.插值样条是由一些多项式组成的,每一个多项式都是由相邻的两个数据点决定的,这样,任意的两个 ...

  4. 样条之拉格朗日Lagrange(一元全区间)插值函数

    这是使用拉格朗日插值函数生成的样条曲线.在数值分析中,拉格朗日插值法是以法国十八世纪数学家约瑟夫·拉格朗日命名的一种多项式插值方法.许多实际问题中都用函数来表示某种内在联系或规律,而不少函数都只能通过 ...

  5. 样条之EHMT插值函数

    核心代码: ////////////////////////////////////////////////////////////////////// // 埃特金插值 ////////////// ...

  6. 样条之埃特金(Aitken)逐步插值函数

    核心代码: ////////////////////////////////////////////////////////////////////// // 埃特金逐步插值 //////////// ...

  7. Matlab插值函数

    x=0:2*pi; y=sin(x); xx=0:0.5:2*pi; %interp1对sin函数进行分段线性插值,调用interp1的时候,默认的是分段线性插值 y1=interp1(x,y,xx) ...

  8. B样条基函数的定义及系数的意义

    原文链接:http://blog.csdn.net/tuqu/article/details/5177405 贝塞尔基函数用作权重.B-样条基函数也一样:但更复杂.但是它有两条贝塞尔基函数所没有的特性 ...

  9. [转载]Matlab中插值函数汇总和使用说明

    http://blog.sciencenet.cn/blog-457143-679275.html MATLAB中的插值函数为interp1,其调用格式为:  yi= interp1(x,y,xi,' ...

随机推荐

  1. Vue之双向绑定原理动手记

    Vue.js的核心功能有两个:一是响应式的数据绑定系统,二是组件系统.本文是通过学习他人的文章,从而理解了双向绑定原理,从而在自己理解的基础上,自己动手实现数据的双向绑定. 目前几种主流的mvc(vm ...

  2. 快速排序之Java实现

    快速排序之Java实现 代码: package cn.com.zfc.lesson21.sort; /** * * @title QuickSort * @describe 快速排序 * @autho ...

  3. UOJ.41.[清华集训2014]矩阵变换(稳定婚姻)

    题目链接 稳定婚姻问题:有n个男生n个女生,每个男/女生对每个女/男生有一个不同的喜爱程度.给每个人选择配偶. 若不存在 x,y未匹配,且x喜欢y胜过喜欢x当前的配偶,y喜欢x也胜过y当前的配偶 的完 ...

  4. ScrollView中嵌套GridView,Listview的办法

    按照android的标准,ScrollView中是不能嵌套具有滑动特性的View的,但是有时如果设计真的有这样做的需要,或者为了更方便简单的实现外观(比如在外在的大布局需要有滑动的特性,并且内部有类似 ...

  5. [TC14088]LimitedMemorySeries1

    [TC14088]LimitedMemorySeries1 题目大意: 给定长度为\(n(n\le5\times10^6)\)的数组\(X\),询问不超过\(q(q\le100)\)次,每次询问第\( ...

  6. hdu 4451 37届金华赛区 J题

    题意:给出衣服裤子鞋子的数目,有一些衣服和裤子,裤子和鞋子不能搭配,求最终的搭配方案总数 wa点很多,我写wa了很多次,代码能力需要进一步提升 #include<cstdio> #incl ...

  7. 放大镜Demo

    购物网站-图片细节展示-放大镜效果   垂直居中                放大镜效果源码下载

  8. BZOJ2085 : [Poi2010]Hamsters

    设g[i][j]为i串至少加上几个字符后才能包含j,可以通过Hash求出. 然后就是求经过m-1条边的最短路,用倍增加速Floyed即可,时间复杂度$O(n^3\log m)$. #include&l ...

  9. CentOS 7 上安装vim 解決 centos -bash: vim: command not found

    用CentOS上使用vim竟然用不了,报错没有该命令 centos -bash: vim: command not found 那么如何安裝 vim 呢? ---------------------- ...

  10. Maven学习——修改Maven的本地仓库路径

    安装Maven后我们会在用户目录下发现.m2 文件夹.默认情况下,该文件夹下放置了Maven本地仓库.m2/repository.所有的Maven构件(artifact)都被存储到该仓库中,以方便重用 ...