样条之连分式插值函数

核心代码:

 1 //////////////////////////////////////////////////////////////////////
 2 // 连分式等距插值
 3 //////////////////////////////////////////////////////////////////////
 4 static float GetValuePqs(const void* valuesPtr, int stride, int n, float t)
 5 {
 6     int i,j,k,m, l;
 7     float z,hh,xi,xj;
 8     float b[8];
 9
10     // 初值
11     z = 0.0;
12
13     // 特例处理
14     if (n < 1)
15     {
16         return(z);
17     }
18     if (n == 1)
19     {
20         z = YfGetFloatValue(valuesPtr, stride, 0);
21         return(z);
22     }
23     if (n == 2)
24     {
25         float y0 = YfGetFloatValue(valuesPtr, stride, 0);
26         float y1 = YfGetFloatValue(valuesPtr, stride, 1);
27         z = y0 + (y1 - y0)*t;
28         return(z);
29     }
30
31     float xStep = 1.0f/(n - 1);
32
33     // 连分式插值
34     if (n <= 8)
35     {
36         k = 0;
37         m = n;
38     }
39     else if (t < (4.0f*xStep))
40     {
41         k=0;
42         m=8;
43     }
44     else if (t > ((n-5)*xStep))
45     {
46         k = n-8;
47         m = 8;
48     }
49     else
50     {
51         k = (int)(t/xStep)-3;
52         m = 8;
53     }
54
55     b[0] = YfGetFloatValue(valuesPtr, stride, k);
56     for (i = 2; i <= m; i++)
57     {
58         hh = YfGetFloatValue(valuesPtr, stride, i+k-1);
59         l = 0;
60         j = 1;
61
62         while ((l == 0) && (j <= i-1))
63         {
64             if (fabs(hh-b[j-1])+1.0f == 1.0f)
65             {
66                 l = 1;
67             }
68             else
69             {
70                 xi = (i+k-1)*xStep;
71                 xj = (j+k-1)*xStep;
72                 hh = (xi-xj)/(hh-b[j-1]);
73             }
74
75             j = j+1;
76         }
77
78         b[i-1]=hh;
79         if (l != 0)
80         {
81             b[i-1] = 1.0e+35F;
82         }
83     }
84
85     z = b[m-1];
86     for (i = m-1; i >= 1; i--)
87     {
88         z = b[i-1]+(t-(i+k-1)*xStep)/z;
89     }
90
91     return(z);
92 }

切图:

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

时间: 2024-10-07 21:07:58

样条之连分式插值函数的相关文章

样条之Akima光滑插值函数

核心代码: 1 ////////////////////////////////////////////////////////////////////// 2 // Akima光滑插值 3 // t - 存放指定的插值点的值 4 // s[] - 一维数组,长度为5,其中s(0),s(1),s(2),s(3)返回三次多项式的系数, 5 // s(4)返回指定插值点t处的函数近似值f(t)(k<0时)或任意值(k>=0时) 6 // k - 控制参数,若k>=0,则只计算第k个子区间[x

插值与样条

先讲些题外话,前几天国庆回老家,在家中翻出了十年前大学时的一些教材课本,翻了几本看了看竟然如此的陌生.想当年考试前那么地刻苦学习,拼了命地上自——到如今变成了一场空,真令人唏嘘.其中有一本教材是<数值分析>,这门课也是挺难的,至少现在让我看是完全看不懂了.而<数值分析>一开始就是讲插值的,可以说插值是这门课的基础. 在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点.插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近

样条之抛物线(一元三点)插值函数

它是根据给定结点上的数值,用抛物插值计算指定插值点处的函数.一元三点插值算法是一种精度更高的插值算法,使用这种方法插值出来的曲线不像线性插值算法那样在分段点的地方出现折点,显得更为平滑.但它是使用二次函数来进行曲线的拟合,曲线中还是会有不平滑的情况. 关于插值与样条的介绍请看:http://www.cnblogs.com/WhyEngine/p/4020294.html 核心代码: /////////////////////////////////////////////////////////

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

核心代码: ////////////////////////////////////////////////////////////////////// // 埃特金逐步插值 ////////////////////////////////////////////////////////////////////// static float GetValueAitken(const void* valuesPtr, int stride, int n, float t, float eps) {

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

http://blog.sciencenet.cn/blog-457143-679275.html MATLAB中的插值函数为interp1,其调用格式为:  yi= interp1(x,y,xi,'method') 其中x,y为插值点,yi为在被插值点xi处的插值结果:x,y为向量, 'method'表示采用的插值方法,MATLAB提供的插值方法有几种: 'method'是最邻近插值, 'linear'线性插值: 'spline'三次样条插值: 'cubic'立方插值.缺省时表示线性插值 注意

2014年第五届蓝桥杯试题C/C++程序设计B组——奇怪的分式

题目描述: 标题:奇怪的分式 上小学的时候,小明经常自己发明新算法.一次,老师出的题目是: 1/4 乘以 8/5 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png) 老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼! 对于分子.分母都是 1~9 中的一位数的情况,还有哪些算式可以这样计算呢? 请写出所有不同算式的个数(包括题中举例的). 显然,交换分子分母后,例如:4/1 乘以 5/8 是满足要求的,这算做不同的算式. 但对于分子分母相同的情况,2/2 乘以

8位无符号整数点分式版本

1.点分式版本 版本 1.0.1.800 ,每个数字占用2个字节,一个8个字节组成8位无符号整数 利用下面的脚本进行校验和转换 #!/usr/local/bin/python3 # -*- coding: utf-8 -*- __author__ = 'qqvipfunction' import re def versionToUInt64(version): version = version.strip() pattern = re.compile(r'^(\d+)\.(\d+)\.(\d+

样条之CatmullRom

所谓样条曲线是指给定一组控制点而得到一条曲线,曲线的大致形状由这些点予以控制,一般可分为插值样条和逼近样条两种,插值样条通常用于数字化绘图或动画的设计,逼近样条一般用来构造物体的表面.CatmullRom样条与上一节所讲的B样条很相似,不同在于CatmullRom样条的曲线会经过其每一个控制点. The centripetal Catmull–Rom is a subclass of cubic Hermite spline that extends the Catmull–Rom implem

因式分解 和 分式方程

因式分解:把一个多项式化为几个整式的乘积叫做因式分解. 1.因式分解的结果用乘积的形式表示. 2.积的各个因式必须是整式. 3.只有多项式才能因式分解. 例:5ax +5bx + 3ay + 3by =5x(a+b) + 3y(a+b) =(5x+3y)(a+b) 分式方程的解法: 1.去分母:方程两边同乘最简公分母. 2.解方程:去括号,移项,合并同类项,化系数1. 3.检验:将求得的解代入最简公分母,如果最简公分母的值不为0,则它是分式方程的解. 例1:解方程(x/x-1) -1 = (3/