CN113987295B - 一种基于二分法和邻近点法的高效一维插值算法库实现方法 - Google Patents
一种基于二分法和邻近点法的高效一维插值算法库实现方法 Download PDFInfo
- Publication number
- CN113987295B CN113987295B CN202111354590.4A CN202111354590A CN113987295B CN 113987295 B CN113987295 B CN 113987295B CN 202111354590 A CN202111354590 A CN 202111354590A CN 113987295 B CN113987295 B CN 113987295B
- Authority
- CN
- China
- Prior art keywords
- interpolation
- const
- algorithm
- double
- calculation
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 115
- 230000006870 function Effects 0.000 claims abstract description 84
- 238000005457 optimization Methods 0.000 claims abstract description 28
- 230000008569 process Effects 0.000 claims abstract description 17
- 230000007246 mechanism Effects 0.000 claims abstract description 13
- 238000004364 calculation method Methods 0.000 claims description 72
- 238000007781 pre-processing Methods 0.000 claims description 17
- 238000010845 search algorithm Methods 0.000 claims description 11
- 239000011800 void material Substances 0.000 claims description 9
- 101100533306 Mus musculus Setx gene Proteins 0.000 claims description 6
- 238000013500 data storage Methods 0.000 claims description 4
- 208000026817 47,XYY syndrome Diseases 0.000 claims description 3
- 238000004321 preservation Methods 0.000 claims description 3
- 230000003068 static effect Effects 0.000 description 4
- HBBGRARXTFLTSG-UHFFFAOYSA-N Lithium ion Chemical compound [Li+] HBBGRARXTFLTSG-UHFFFAOYSA-N 0.000 description 3
- 229910001416 lithium ion Inorganic materials 0.000 description 3
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000005259 measurement Methods 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 238000000926 separation method Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 230000009466 transformation Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/903—Querying
- G06F16/90335—Query processing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/906—Clustering; Classification
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F17/00—Digital computing or data processing equipment or methods, specially adapted for specific functions
- G06F17/10—Complex mathematical operations
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- General Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Mathematical Physics (AREA)
- Algebra (AREA)
- Computational Mathematics (AREA)
- Mathematical Analysis (AREA)
- Mathematical Optimization (AREA)
- Computational Linguistics (AREA)
- Pure & Applied Mathematics (AREA)
- Software Systems (AREA)
- Complex Calculations (AREA)
Abstract
本发明公开了一种基于二分法和邻近点法的高效一维插值算法库实现,包括以下所述工作步骤:(1)统一输入接口;(2)规范调用方式;(3)独立预处理机制;(4)优化搜索方法;(5)多元化算法选项。本发明通过采用的插值方法本质上与常见的一维多项式插值法并无二致,故仅做指定结点插值时,单次执行效率相同,保证了算法的准确性和效率,通过针对高效插值算法使用过程中,部分功能的优化会带来额外内存开销或特定算法的专用优化特殊性等问题,本发明增加了算法选项功能,默认选项为效率最优选项,用户可根据实际需要,随时调整优化选项,同时,由于该功能为非必要功能,并不会增大普通用户的使用门槛。
Description
技术领域
本发明涉及一维插值算法库技术领域,具体为一种基于二分法和邻近点法的高效一维插值算法库实现方法。
背景技术
一维插值问题是利用已知区间离散点的函数值,采用替代函数的方法,用一个相对简单的函数经过区间内的离散点,并以此函数来求解区间内任意点处的函数值、导数值或求解区间积分,用多项式作为简单函数,进行替代并求解一维插值问题的方法称为多项式插值法,其中最常用的是拉格朗日插值、牛顿插值和三次样条插值,该类问题主要包含两个过程:指定结点插值和全区间插值。
现有技术中一种基于二分法和邻近点法的高效一维插值算法库实现方法缺点不足:
1、专利文件CN109001643A公开了一种基于二分法迭代的静态SOC估算方法,包括“根据二分法理论得到逼近迭代方法,通过不断缩小区间取中间值对比处理,实现了对锂离子电池静态SOC值的有效估算;直接利用锂离子电池由OCV-SOC曲线得到的拟合多项式,避开了变换或近似处理,最大程度上降低了系统处理误差;该方法通过设置OCV逼近误差范围,可以人为调整SOC误差,实现了精度可控;该方法算法复杂度低,迭代次数少,响应速度快,可实现类似万用表的功能,从外部直接测量静态SOC;该方法在传统查表法和插值法的基础上,改进为直接利用特性拟合表达式计算的方法,提高精度的同时减少了预先数据处理工作,减小处理单元的运算能力要求,实现了有效的锂离子电池静态SOC测算。”,上述装置由于输入数据类型和格式的不同,在使用时需转换到算法所规定的格式,没有统一接口,用户在使用时,不得不自行编写格式转换代码,造成接口多样和使用门槛提高的问题,一维多项式插值法在单次使用时,优化空间有限,但是在频繁调用时,这些算法存在大量重复计算,严重影响计算效率的提升;
2、现有技术中一种基于二分法和邻近点法的高效一维插值算法库实现方法,常用插值法在做全区间插值时,要求输入数据必须满足自变量从小到大排序,且无重复,但在算法计算过程中,并未进行检查,造成算法适应性和稳定性下降。
3、现有技术中一种基于二分法和邻近点法的高效一维插值算法库实现方法,常用插值法在搜索指定结点过程中,为了简化算法,往往采用最简单的一维遍历搜索算法,该算法的实践复杂度为n/2,随着已知数据的规模增大,呈线性增长,在进行大量插值计算时,插值算法常常存在两次连续搜索结果一致的情况,如果不能快速定位这类问题,将出现重复搜索问题,另外后一次插值计算的位置也会影响搜索算法的方向。
发明内容
本发明的目的在于提供一种基于二分法和邻近点法的高效一维插值算法库实现方法,以解决上述背景技术中提出的问题。
1.为实现上述目的,本发明提供如下技术方案,一种基于二分法和邻近点法的高效一维插值算法库实现方法,其特征在于:包括以下工作步骤:
(1)统一输入接口;
(2)规范调用方式;
(3)独立预处理机制;
(4)优化搜索方法;
(5)多元化算法选项;
所述步骤(1)中,该算法库根据拉格朗日插值、牛顿插值和三次样条插值算法的特点,编制了专门的基类,并在此基类基础上,编制了统一输入接口;
1、HObjectBase类
HObjectBase类借鉴MFC基类创建模式,统一了所有类的基类和基础接口,实现了类的统一化和规范化,支持动态创建类对象和自动类型识别功能;
2、HInterpolation类
HInterpolation类定义了插值算法所需数据和相关的设置选项,定义了输入输出接口和搜索算法,为实现各类算法通用部分和统一接口提供条件;
3、实体类
HInterpolationLagrange、HInterpolationNewton和HInterpolationSpline为三个具体算法的实体类,这些类仅需提供参数设置、预处理方法和算法实现功能;
采用三级类结构,可在最大程度上优化类结构,保持结构清晰和功能明确,同时保证算法的通用性和扩展性;
在统一输入接口方面,通过在HInterpolation类中设置五种输入模式的方式实现,实体类中无需专门设置,极大简化了实体类的代码量;
bool SetX(const double*x,const size_t n,const size_t m,const size_toption);
定义插值阶数、数据规模和自变量x;
bool SetXY(const double*x,const double*y,const size_t n,const size_tm,const size_t option);
定义插值阶数、数据规模、自变量x和一组函数值y,适合于一组插值数据的情况;
bool SetXYs(const double*x,const std::initializer_list<const double*>&ys,const size_t n,const size_t m,const size_t option);
定义插值阶数、数据规模、自变量x和多组函数值y,适合于多组插值数据的情况;
bool AddY(const double*y);
增加一组函数值y;
bool AddYs(const std::initializer_list<const double*>&ys);
增加多组函数值y;
所述步骤(3)中,对于不同的实体类,由于算法本身的不同特性,有些算法在计算之前可进行预处理,而有些算法必须进行预处理,故在实体类中设置了预处理机制,该机制共分三个步骤;
(1)定义预处理数据存储变量;
(2)重载设置参数函数,以保证预处理数据的有效存储和预防内存泄漏;
virtual bool setX(const double*x)override;
重载设置自变量x的私有函数,若预处理数据并非动态分配内存,该功能不重载;
virtual bool addY(const double*y)override;
重载增加一组函数值y的私有函数,并根据设置选项,适时调用相应的预处理函数,由于该预处理函数涉及实体类数据的初始化问题,不可在基类中定义;
所述步骤(4)中,在插值计算的过程中,随着数据规模的增加,计算效率瓶颈逐渐转移到寻找插值点位置上来,故该算法运行效率的关键在于如何最快定位插值点所在位置,并给出对应于插值阶数的插值结点;
为了实现搜索算法的优化,算法上做了如下改进:
(1)自变量输入前排序
自变量在输入前必须进行从小到大排序,且不得重复,以保证搜索算法的有效实现;
(2)搜索策略
该算法的搜索策略采用二分法和邻近点法相结合的方法进行搜索,最大限度提高了搜索的快速性和高效性;
①seek方法
该方法通过参数m_cor来确定采用二分法或者临近点法进行插值点确定,并将计算结果存储在m_jlo中;
②locate方法
由于自变量x是按从小到大的顺序排列的,故只需找到介于任意两个已知自变量之间的位置即可完成seek功能,而在数据没有排列规律的情况下,二分法是最快速的方法;
③hunt方法
在进行一系列相邻插值点的插值情况下,若每次都采用locate方法进行最大范围的二分法计算,会花费较多时间,有效的策略是,每次从上一次获得的m_jlo开始进行寻找,并逐步增大寻找范围,在范围确定后,再改用二分法进行计算,以提高计算效率;
(3)记录插值区间
对于相对密集的插值过程,经常会出现前后两次插值所选的结点完全一致,在这种情况下,无需进行插值点搜索,该算法在每次插值计算之后,记录插值点所在位置,在下一次插值时进行比较,若插值点所在范围与前一点一致,直接进行插值计算,进一步节省时间。
2.优选的,所述步骤(2)中,在插值方法调用过程中,主要存在两类场景(计算一组值或多组值)和两种计算类型(计算函数值或同时计算导数值),基于四类情况,设置了四种调用模式;
double Y(const double x,const size_t index);
插值计算指定组的函数值;
void YdY(const double x,double&y,double&dy,const size_t index);插值计算指定组的函数值和导数值;
void Ys(const double x,double*y);
插值计算所有组的函数值;
void YdYs(const double x,double*y,double*dy);
插值计算所有组的函数值和导数值;
在实体类中,仅需实现两种计算类型的函数,无需考虑两类场景和插值位置的确定;
virtual double rawinterp(const size_t jl,const double x,const size_tindex)override;
在指定位置和预设插值阶数条件下进行单个插值计算,并给出插值结果;
virtual void rawinterp(const size_t jl,const double x,double&y,double&dy,const size_t index)override;
在指定位置和预设插值阶数条件下进行单个插值计算,并给出插值结果和导数值。
3.优选的,所述步骤(5)中,针对该算法中的优化功能,程序给出了相应的优化选项,以供用户选择,在一些相对简单的应用场景,优化与否不影响运行效率;
#define OPT_LOCATE 1
是否进行搜索优化,在大量进行相邻点插值计算时,该选项可提高效率;#defineOPT_SAVE_TREAT 2
是否保存每次计算结果,该方法暂限于牛顿插值法的差商表计算结果保存,可能会占用一定内存空间,但对于频繁计算来说,会大大节省计算时间;#define OPT_PRE_TREAT(4+OPT_SAVE_TREAT)
是否进行预处理,该方法暂限于牛顿插值法,并且预处理和保存预处理结果需同时使用,由于三次样条插值法是强制预处理的,故该设置无效;
#define OPT_ALL(OPT_LOCATE|OPT_SAVE_TREAT|OPT_PRE_TREAT)
打开全部选项;
#define OPT_DEFAULT npos
打开默认选项开关,与实体类设置的默认值相关。
与现有技术相比,本发明的有益效果如下:
1、本发明通过采用的插值方法本质上与常见的一维多项式插值法并无二致,故仅做指定结点插值时,单次执行效率相同,保证了算法的准确性和效率,主要的优化集中在用户接口、预处理和搜索效率方面。
2、本发明通过采用了两级基类(HObjectBase和HInterpolation)和一级实体类的方式定义接口,HObjectBase类主要实现了动态创建类对象和自动类型识别等基本面向对象功能;HInterpolation定义了两类接口方式、五种输入模式,规范了实体类的统一算法接口;实体类已实现拉格朗日插值、牛顿插值和三次样条插值算法,并在统一接口上进行了规范。用户使用不同插值算法时,仅需针对不同实体类,定义相关的类实体即可,调用方式简单,更换算法更加灵活。
3、本发明通过将具体算法的预处理和计算部分分离在两个不同的函数中执行,不可避免地增加了相应预处理数据的存储,故实体类的实现需进行四个步骤:定义预处理数据存储变量、重载参数设置函数、重载预处理函数、重载计算函数,在对计算效率要求极高的算法实现中,该分离机制将极大改善算法效率,尤其是三次样条插值。
4、本发明针对大型插值问题,搜索效率是算法的关键,二分法作为一种高效搜索方法,其时间复杂度为log(n),当n值很大时,效果明显,但当n值较小或者搜索区间已经缩小到很小范围时,二分法效率有所下降,故在二分法的基础上增加了邻近点法,优化了搜索策略。
5、本发明每次插值完后自动记录插值区间信息,下次插值时,先比较插值区间和阶数是否相同,若相同,可跳过搜索区间过程,直接进行指定结点插值,算法效率得到进一步提升。
6、本发明通过针对高效插值算法使用过程中,部分功能的优化会带来额外内存开销或特定算法的专用优化特殊性等问题,本发明增加了算法选项功能,默认选项为效率最优选项,用户可根据实际需要,随时调整优化选项,同时,由于该功能为非必要功能,并不会增大普通用户的使用门槛。
7、本发明通过以C++17为编程语言,支持拉格朗日插值、牛顿插值和三次样条插值算法,并在VS2019和QT5.14上编译通过。
附图说明
图1为本发明的工作流程图;
图2为本发明的工作流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在本发明的描述中,需要说明的是,术语“上”、“下”、“内”、“外”“前端”、“后端”、“两端”、“一端”、“另一端”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性。
在本发明的描述中,需要说明的是,除非另有明确的规定和限定,术语“安装”、“设置有”、“连接”等,应做广义理解,例如“连接”,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。
请参阅图1,本发明提供的一种实施例,一种基于二分法和邻近点法的高效一维插值算法库实现方法,包括以下工作步骤:
(1)统一输入接口;
(2)规范调用方式;
(3)独立预处理机制;
(4)优化搜索方法;
(5)多元化算法选项。
步骤(1)中,该算法库根据拉格朗日插值、牛顿插值和三次样条插值算法的特点,编制了专门的基类,并在此基类基础上,编制了统一输入接口;
1、HObjectBase类
HObjectBase类借鉴MFC基类创建模式,统一了所有类的基类和基础接口,实现了类的统一化和规范化,支持动态创建类对象和自动类型识别功能;
2、HInterpolation类
HInterpolation类定义了插值算法所需数据和相关的设置选项,定义了输入输出接口和搜索算法,为实现各类算法通用部分和统一接口提供条件;
3、实体类
HInterpolationLagrange、HInterpolationNewton和HInterpolationSpline为三个具体算法的实体类,这些类仅需提供参数设置、预处理方法和算法实现功能;
采用三级类结构,可在最大程度上优化类结构,保持结构清晰和功能明确,同时保证算法的通用性和扩展性;
在统一输入接口方面,通过在HInterpolation类中设置五种输入模式的方式实现,实体类中无需专门设置,极大简化了实体类的代码量;
bool SetX(const double*x,const size_t n,const size_t m,const size_toption);
定义插值阶数、数据规模和自变量x;
bool SetXY(const double*x,const double*y,const size_t n,const size_tm,const size_t option);
定义插值阶数、数据规模、自变量x和一组函数值y,适合于一组插值数据的情况;
bool SetXYs(const double*x,const std::initializer_list<const double*>&ys,const size_t n,const size_t m,const size_t option);
定义插值阶数、数据规模、自变量x和多组函数值y,适合于多组插值数据的情况;
bool AddY(const double*y);
增加一组函数值y;
bool AddYs(const std::initializer_list<const double*>&ys);
增加多组函数值y,步骤(2)中,在插值方法调用过程中,主要存在两类场景(计算一组值或多组值)和两种计算类型(计算函数值或同时计算导数值),基于四类情况,设置了四种调用模式;
double Y(const double x,const size_t index);
插值计算指定组的函数值;
void YdY(const double x,double&y,double&dy,const size_t index);
插值计算指定组的函数值和导数值;
void Ys(const double x,double*y);
插值计算所有组的函数值;
void YdYs(const double x,double*y,double*dy);
插值计算所有组的函数值和导数值;
在实体类中,仅需实现两种计算类型的函数,无需考虑两类场景和插值位置的确定;
virtual double rawinterp(const size_t jl,const double x,const size_tindex)override;
在指定位置和预设插值阶数条件下进行单个插值计算,并给出插值结果;
virtual void rawinterp(const size_t jl,const double x,double&y,double&dy,const size_t index)override;
在指定位置和预设插值阶数条件下进行单个插值计算,并给出插值结果和导数值,步骤(3)中,对于不同的实体类,由于算法本身的不同特性,有些算法在计算之前可进行预处理,而有些算法必须进行预处理,故在实体类中设置了预处理机制,该机制共分三个步骤;
(1)定义预处理数据存储变量;
(2)重载设置参数函数,以保证预处理数据的有效存储和预防内存泄漏;
virtual bool setX(const double*x)override;
重载设置自变量x的私有函数,若预处理数据并非动态分配内存,该功能不重载;
virtual bool addY(const double*y)override;
重载增加一组函数值y的私有函数,并根据设置选项,适时调用相应的预处理函数,由于该预处理函数涉及实体类数据的初始化问题,不可在基类中定义,步骤(4)中,在插值计算的过程中,随着数据规模的增加,计算效率瓶颈逐渐转移到寻找插值点位置上来,故该算法运行效率的关键在于如何最快定位插值点所在位置,并给出对应于插值阶数的插值结点;
为了实现搜索算法的优化,算法上做了如下改进:
(1)自变量输入前排序
自变量在输入前必须进行从小到大排序,且不得重复,以保证搜索算法的有效实现;
(2)搜索策略
该算法的搜索策略采用二分法和邻近点法相结合的方法进行搜索,最大限度提高了搜索的快速性和高效性;
①seek方法
该方法通过参数m_cor来确定采用二分法或者临近点法进行插值点确定,并将计算结果存储在m_jlo中;
②locate方法
由于自变量x是按从小到大的顺序排列的,故只需找到介于任意两个已知自变量之间的位置即可完成seek功能,而在数据没有排列规律的情况下,二分法是最快速的方法;
③hunt方法
在进行一系列相邻插值点的插值情况下,若每次都采用locate方法进行最大范围的二分法计算,会花费较多时间,有效的策略是,每次从上一次获得的m_jlo开始进行寻找,并逐步增大寻找范围,在范围确定后,再改用二分法进行计算,以提高计算效率;
(3)记录插值区间
对于相对密集的插值过程,经常会出现前后两次插值所选的结点完全一致,在这种情况下,无需进行插值点搜索,该算法在每次插值计算之后,记录插值点所在位置,在下一次插值时进行比较,若插值点所在范围与前一点一致,直接进行插值计算,进一步节省时间,步骤(5)中,针对该算法中的优化功能,程序给出了相应的优化选项,以供用户选择,在一些相对简单的应用场景,优化与否不影响运行效率;
#define OPT_LOCATE 1
是否进行搜索优化,在大量进行相邻点插值计算时,该选项可提高效率;#defineOPT_SAVE_TREAT 2
是否保存每次计算结果,该方法暂限于牛顿插值法的差商表计算结果保存,可能会占用一定内存空间,但对于频繁计算来说,会大大节省计算时间;#define OPT_PRE_TREAT(4+OPT_SAVE_TREAT)
是否进行预处理,该方法暂限于牛顿插值法,并且预处理和保存预处理结果需同时使用,由于三次样条插值法是强制预处理的,故该设置无效;
#define OPT_ALL(OPT_LOCATE|OPT_SAVE_TREAT|OPT_PRE_TREAT)
打开全部选项;
#define OPT_DEFAULT npos
打开默认选项开关,与实体类设置的默认值相关
本发明中,该装置的工作步骤如下:
实施例一:
(1)该算法库根据拉格朗日插值、牛顿插值和三次样条插值算法的特点,编制了专门的基类,并在此基类基础上,编制了统一输入接口;
(2)在插值方法调用过程中,主要存在两类场景(计算一组值或多组值)和两种计算类型(计算函数值或同时计算导数值),基于四类情况,设置了四种调用模式;
(3)对于不同的实体类,由于算法本身的不同特性,有些算法在计算之前可进行预处理,而有些算法必须进行预处理,故在实体类中设置了预处理机制,该机制共分三个步骤;
(4)在插值计算的过程中,随着数据规模的增加,计算效率瓶颈逐渐转移到寻找插值点位置上来,故该算法运行效率的关键在于如何最快定位插值点所在位置,并给出对应于插值阶数的插值结点;
(5)针对该算法中的优化功能,程序给出了相应的优化选项,以供用户选择,在一些相对简单的应用场景,优化与否不影响运行效率;
对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化囊括在本发明内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。
Claims (3)
1.一种基于二分法和邻近点法的高效一维插值算法库实现方法,其特征在于:包括以下工作步骤:
(1)统一输入接口;
(2)规范调用方式;
(3)独立预处理机制;
(4)优化搜索方法;
(5)多元化算法选项;
所述步骤(1)中,该算法库根据拉格朗日插值、牛顿插值和三次样条插值算法的特点,编制了专门的基类,并在此基类基础上,编制了统一输入接口;
1、HObjectBase类
HObjectBase类借鉴MFC基类创建模式,统一了所有类的基类和基础接口,实现了类的统一化和规范化,支持动态创建类对象和自动类型识别功能;
2、HInterpolation类
HInterpolation类定义了插值算法所需数据和相关的设置选项,定义了输入输出接口和搜索算法,为实现各类算法通用部分和统一接口提供条件;
3、实体类
HInterpolationLagrange、HInterpolationNewton和HInterpolationSpline为三个具体算法的实体类,这些类仅需提供参数设置、预处理方法和算法实现功能;
采用三级类结构,可在最大程度上优化类结构,保持结构清晰和功能明确,同时保证算法的通用性和扩展性;
在统一输入接口方面,通过在HInterpolation类中设置五种输入模式的方式实现,实体类中无需专门设置,极大简化了实体类的代码量;
bool SetX(const double*x,const size_t n,const size_t m,const size_toption);
定义插值阶数、数据规模和自变量x;
boolSetXY(const double*x,const double*y,const size_t n,const size_t m,const size_t option);
定义插值阶数、数据规模、自变量x和一组函数值y,适合于一组插值数据的情况;
bool SetXYs(const double*x,const std::initializer_list<const double*>&ys,const size_t n,const size_t m,const size_t option);
定义插值阶数、数据规模、自变量x和多组函数值y,适合于多组插值数据的情况;
bool AddY(const double*y);
增加一组函数值y;
bool AddYs(const std::initializer_list<const double*>&ys);
增加多组函数值y;
所述步骤(3)中,对于不同的实体类,由于算法本身的不同特性,有些算法在计算之前可进行预处理,而有些算法必须进行预处理,故在实体类中设置了预处理机制,该机制共分三个步骤;
(1)定义预处理数据存储变量;
(2)重载设置参数函数,以保证预处理数据的有效存储和预防内存泄漏;
virtual bool setX(const double*x)override;
重载设置自变量x的私有函数,若预处理数据并非动态分配内存,该功能不重载;
virtual bool addY(const double*y)override;
重载增加一组函数值y的私有函数,并根据设置选项,适时调用相应的预处理函数,由于该预处理函数涉及实体类数据的初始化问题,不可在基类中定义;
所述步骤(4)中,在插值计算的过程中,随着数据规模的增加,计算效率瓶颈逐渐转移到寻找插值点位置上来,故该算法运行效率的关键在于如何最快定位插值点所在位置,并给出对应于插值阶数的插值结点;
为了实现搜索算法的优化,算法上做了如下改进:
(1)自变量输入前排序
自变量在输入前必须进行从小到大排序,且不得重复,以保证搜索算法的有效实现;
(2)搜索策略
该算法的搜索策略采用二分法和邻近点法相结合的方法进行搜索,最大限度提高了搜索的快速性和高效性;
①seek方法
该方法通过参数m_cor来确定采用二分法或者临近点法进行插值点确定,并将计算结果存储在m_jlo中;
②locate方法
由于自变量x是按从小到大的顺序排列的,故只需找到介于任意两个已知自变量之间的位置即可完成seek功能,而在数据没有排列规律的情况下,二分法是最快速的方法;
③hunt方法
在进行一系列相邻插值点的插值情况下,若每次都采用locate方法进行最大范围的二分法计算,会花费较多时间,有效的策略是,每次从上一次获得的m_jlo开始进行寻找,并逐步增大寻找范围,在范围确定后,再改用二分法进行计算,以提高计算效率;
(3)记录插值区间
对于相对密集的插值过程,经常会出现前后两次插值所选的结点完全一致,在这种情况下,无需进行插值点搜索,该算法在每次插值计算之后,记录插值点所在位置,在下一次插值时进行比较,若插值点所在范围与前一点一致,直接进行插值计算,进一步节省时间。
2.根据权利要求1所述的一种基于二分法和邻近点法的高效一维插值算法库实现方法,其特征在于:所述步骤(2)中,在插值方法调用过程中,主要存在两类场景(计算一组值或多组值)和两种计算类型(计算函数值或同时计算导数值),基于四类情况,设置了四种调用模式;
double Y(const double x,const size_t index);
插值计算指定组的函数值;
void YdY(const double x,double&y,double&dy,const size_t index);插值计算指定组的函数值和导数值;
void Ys(const double x,double*y);
插值计算所有组的函数值;
void YdYs(const double x,double*y,double*dy);
插值计算所有组的函数值和导数值;
在实体类中,仅需实现两种计算类型的函数,无需考虑两类场景和插值位置的确定;
virtualdouble rawinterp(const size_t jl,const double x,const size_tindex)override;
在指定位置和预设插值阶数条件下进行单个插值计算,并给出插值结果;
virtual void rawinterp(const size_t jl,const double x,double&y,double&dy,const size_t index)override;
在指定位置和预设插值阶数条件下进行单个插值计算,并给出插值结果和导数值。
3.根据权利要求1所述的一种基于二分法和邻近点法的高效一维插值算法库实现方法,其特征在于:所述步骤(5)中,针对该算法中的优化功能,程序给出了相应的优化选项,以供用户选择,在一些相对简单的应用场景,优化与否不影响运行效率;
#define OPT_LOCATE 1
是否进行搜索优化,在大量进行相邻点插值计算时,该选项可提高效率;#define OPT_SAVE_TREAT 2
是否保存每次计算结果,该方法暂限于牛顿插值法的差商表计算结果保存,可能会占用一定内存空间,但对于频繁计算来说,会大大节省计算时间;#define OPT_PRE_TREAT(4+OPT_SAVE_TREAT)
是否进行预处理,该方法暂限于牛顿插值法,并且预处理和保存预处理结果需同时使用,由于三次样条插值法是强制预处理的,故该设置无效;
#define OPT_ALL(OPT_LOCATE|OPT_SAVE_TREAT|OPT_PRE_TREAT)
打开全部选项;
#define OPT_DEFAULT npos
打开默认选项开关,与实体类设置的默认值相关。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111354590.4A CN113987295B (zh) | 2021-11-15 | 2021-11-15 | 一种基于二分法和邻近点法的高效一维插值算法库实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111354590.4A CN113987295B (zh) | 2021-11-15 | 2021-11-15 | 一种基于二分法和邻近点法的高效一维插值算法库实现方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113987295A CN113987295A (zh) | 2022-01-28 |
CN113987295B true CN113987295B (zh) | 2024-06-07 |
Family
ID=79748790
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111354590.4A Active CN113987295B (zh) | 2021-11-15 | 2021-11-15 | 一种基于二分法和邻近点法的高效一维插值算法库实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113987295B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114527966B (zh) * | 2022-02-24 | 2024-06-04 | 中国人民解放军火箭军工程大学 | 一种文件输入输出流高效通用化算法库实现方法 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105893659A (zh) * | 2016-06-02 | 2016-08-24 | 中国人民解放军国防科学技术大学 | 一种卫星访问预报快速计算方法 |
CN105955929A (zh) * | 2016-04-26 | 2016-09-21 | 上海大学 | 一种面向数据科学可视化的反距离加权混合插值方法 |
CN106714336A (zh) * | 2016-10-25 | 2017-05-24 | 南京邮电大学 | 一种基于改进克里金算法的无线传感网温度监测方法 |
CN109001643A (zh) * | 2018-08-28 | 2018-12-14 | 西南科技大学 | 一种基于二分法迭代的静态soc估算方法 |
CN109714547A (zh) * | 2018-12-17 | 2019-05-03 | 珠海亿智电子科技有限公司 | 一种基于模式识别的隔行视频转换方法 |
CN111563311A (zh) * | 2020-02-13 | 2020-08-21 | 东南大学 | 基于zemax的任意形状光栅仿真系统 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9953270B2 (en) * | 2013-05-07 | 2018-04-24 | Wise Io, Inc. | Scalable, memory-efficient machine learning and prediction for ensembles of decision trees for homogeneous and heterogeneous datasets |
-
2021
- 2021-11-15 CN CN202111354590.4A patent/CN113987295B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105955929A (zh) * | 2016-04-26 | 2016-09-21 | 上海大学 | 一种面向数据科学可视化的反距离加权混合插值方法 |
CN105893659A (zh) * | 2016-06-02 | 2016-08-24 | 中国人民解放军国防科学技术大学 | 一种卫星访问预报快速计算方法 |
CN106714336A (zh) * | 2016-10-25 | 2017-05-24 | 南京邮电大学 | 一种基于改进克里金算法的无线传感网温度监测方法 |
CN109001643A (zh) * | 2018-08-28 | 2018-12-14 | 西南科技大学 | 一种基于二分法迭代的静态soc估算方法 |
CN109714547A (zh) * | 2018-12-17 | 2019-05-03 | 珠海亿智电子科技有限公司 | 一种基于模式识别的隔行视频转换方法 |
CN111563311A (zh) * | 2020-02-13 | 2020-08-21 | 东南大学 | 基于zemax的任意形状光栅仿真系统 |
Non-Patent Citations (1)
Title |
---|
果蝇优化算法研究进展;王凌;郑晓龙;控制理论与应用;20171231(005);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN113987295A (zh) | 2022-01-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN113987295B (zh) | 一种基于二分法和邻近点法的高效一维插值算法库实现方法 | |
US5038307A (en) | Measurement of performance of an extended finite state machine | |
WO2023060878A1 (zh) | 一种数据查询方法、系统、异构加速平台及存储介质 | |
CN111126625B (zh) | 一种可扩展的学习索引方法及系统 | |
CN112000001B (zh) | 一种基于改进贝叶斯模型的pid参数整定优化方法 | |
CN109710211A (zh) | 浮点数据类型转换方法、装置、存储介质及计算机设备 | |
CN105224452A (zh) | 一种针对科学计算程序静态分析性能的预测代价优化方法 | |
EP4075292A1 (en) | Method and apparatus for processing database | |
CN115857361B (zh) | 一种用于啤酒发酵的优化控制方法及系统 | |
US20230394110A1 (en) | Data processing method, apparatus, device, and medium | |
US8732679B2 (en) | Loop transformation for computer compiler optimization | |
CN112492627B (zh) | 后到先服务通信系统、发射端设备、介质及性能优化方法 | |
CN111414527B (zh) | 相似项目的查询方法、装置及存储介质 | |
CN117033855A (zh) | 滤波掩码生成方法、装置、电子设备及存储介质 | |
CN112345954A (zh) | 电池寿命预测方法、装置、电子设备及介质 | |
CN106354633A (zh) | 基于算法插件的任务调度表生成方法 | |
CN110738016A (zh) | 一种电力电子电路暂态仿真插值计算方法 | |
CN111381826A (zh) | 生成代码文件的语法树的方法、装置及电子设备 | |
CN114745311B (zh) | 一种基于二分法的网络脆弱性二维边界条件搜索方法 | |
CN109286971A (zh) | 一种基于dsp处理的功控方法及装置 | |
CN110851178B (zh) | 一种基于分布式图可达计算的过程间程序静态分析方法 | |
CN113676955A (zh) | 5g/b5g环境下的虚拟网络功能通用迁移方法 | |
CN114443911A (zh) | 一种图数据语义分析方法、装置、设备及可读存储介质 | |
Chu et al. | Hardware selection and clustering in the HYPER synthesis system | |
Murty et al. | Note on implementing the new sphere method for LP using matrix inversions sparingly |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant |