三次样条插值算法

1 总体说明

三次样条插值算法是一种计算量和效果都比较理想的插值算法。关于三次样条插值算法的原理这里不做过多的解释,下面的代码是我在网上收集了两种C++实现版本的基础上自己整合的一个版本。由于本人刚接触C++不久,水平有限。没有使用模板机制将代码做的更通用。关于算法实现有下面几点说明。

  1. 所有有关的类都被包含到SplineSpace命名空间中。
  2. SplineSpace中一个有三个类分别是异常类(SplineFailure),接口类(SplineInterface)和实现类(Spline)。有一个枚举类型说明边界条件(BoundaryCondition),取值为:GivenFirstOrder和GivenSecondOrder。分别对应I型边界条件和II型边界条件。
  3. 接口类定义了Spline在实现的过程中必须要有的三个方法:单点插值、多点插值和自动生成插值序列。
  4. 异常类是可能被实现类抛出的类,如果在实现类的运行过程中出现了已知数据过少构造失败、使用了外插值、设定输出点数过少等行为会抛出该类。因此应该将插值的过程用try...catch(SplineFailure sf)包裹起来。如:
double x0[2]={1,2};
double y0[2]={3,4};try
{SplineInterface* sp = new Spline(x0,y0,2);//...
}
catch(SplineFailure sf)
{cout<<sf.GetMessage()<<endl;
}

上面代码就会抛出异常并显示“构造失败,已知点数过少”。

2 插值方法调用

2.1单点插值

调用方法如下:

#include <iostream>
#include "Spline.h"using namespace std;
using namespace SplineSpace;int main(void)
{//单点插值测试double x0[5]={1,2,4,5,6};       //已知的数据点double y0[5]={1,3,4,2,5};try{//Spline sp(x0,y0,5,GivenSecondOrder,0,0);SplineInterface* sp = new Spline(x0,y0,5);  //使用接口,且使用默认边界条件double x=4.5;double y;sp->SinglePointInterp(x,y); //求x的插值结果ycout<<"x="<<x<<"时的插值结果为:"<<y<<endl;}catch(SplineFailure sf){cout<<sf.GetMessage()<<endl;}getchar();  //程序暂停
}

此时屏幕会输出"x=4.5时的插值结果为2.71107"。

  1. 可以直接构造Spline对象进行使用,也可以将它转化成对应的接口使用。
  2. 默认边界条件为II型边界条件(已知边界的二阶导数),默认左右边界二阶导数为都0,即自然边界条件。
  3. 已知的数据点数要至少为3(3个点对应一条曲线)。

2.2多点插值

调用方法如下(省略了和上面重复的代码部分):

//多点插值测试double x0[5]={1,2,4,5,6};       //已知的数据点
double y0[5]={1,3,4,2,5};double x[4] = {1.5,2.5,3.5,4.5};    //插值点
double y[4];
double leftBound=0,RightBound=0;    //边界导数try
{Spline sp(x0,y0,5,GivenSecondOrder,leftBound,RightBound);sp.MultiPointInterp(x,4,y);           //求x的插值结果yfor(int i = 0;i < 4;i++){cout<<"x="<<x[i]<<"时的插值结果为:"<<y[i]<<endl;}
}
catch(SplineFailure sf)
{cout<<sf.GetMessage()<<endl;
}
getchar();  //程序暂停

显示结果如下:

x=1.5时的插值结果为:2.01383
x=2.5时的插值结果为:3.8978
x=3.5时的插值结果为:4.62372
x=4.5时的插值结果为:2.71107

2.3自动生成插值序列

自动生成插值序列方法会根据指定的插值点数,在插值自变量区间等间距的生成插值点。这个方法在绘图的时候非常好用。指定的插值点数越多,绘制出来的图形质量越好。调用方法如下:

//自动插值测试double x0[5]={1,2,4,5,6};       //已知的数据点
double y0[5]={1,3,4,2,5};double x[10];   //插值点
double y[10];try
{SplineInterface* sp = new Spline(x0,y0,5);    //使用接口,且使用默认边界条件sp->AutoInterp(10,x,y);           //求x的插值结果yfor(int i = 0;i < 10;i++)cout<<x[i]<<",";cout<<endl;for(int i = 0;i < 10;i++)cout<<y[i]<<",";
}
catch(SplineFailure sf)
{cout<<sf.GetMessage()<<endl;
}
getchar();  //程序暂停

显示结果如下:

1,1.55556,2.11111,2.66667,3.22222,3.77778,4.33333,4.88889,5.44444,6,
1,2.12528,3.21225,4.14572,4.639,4.38218,3.1524,2.02937,2.79183,5,

将上面结果复制粘贴到matlab中绘图,并且和matlab中的三次样条拟合结果作比较。matlab代码如下:

clear
clcx0=[1,2,4,5,6];         %已知的自变量
y0=[1,3,4,2,5];         %已知的因变量pp=csape(x0,y0,'second',[0,0]); %二阶边界条件,且导数都为0
x = linspace(1,6,200);
y = ppval(pp,x);%C++算法得出了的结果
xCpp = [1,1.55556,2.11111,2.66667,3.22222,3.77778,4.33333,4.88889,5.44444,6];
yCpp = [1,2.12528,3.21225,4.14572,4.639,4.38218,3.1524,2.02937,2.79183,5];h=figure;
plot(xCpp,yCpp,'*',x,y);
legend('c++插值结果','matlab插值结果')
title('插值结果')
h.Name = '插值结果';
h.NumberTitle = 'off';

结果如下:

可以看到C++中的算法得到的结果和matlab中得到的结果相同。
C++源程序代码:
有CSDN下载积分的童鞋可以使用右边的下载链接支持一下:三次样条插值C++代码
没有积分的童鞋也可以直接在本站下载源码:三次样条插值C++代码

转载于:https://www.cnblogs.com/yabin/p/6426849.html

三次样条插值算法C++实现相关推荐

  1. 埃尔米特三次样条插值算法-JAVA版本实现

    埃尔米特三次样条插值算法-JAVA版本实现 package math;/*** 三次样条插值** y1=a+bx1+cx1^2* y2=a+bx2+cx2^2* y3=a+bx3+cx3^2** (y ...

  2. hermite、三次样条插值算法 调用matlab函数、代码实现

    一.Hermite插值 Hermite插值要求有些节点或全部节点的函数值和导数值重合,使得在节点出具有一定的光滑度 满足插值条件的三次Hermite插值多项H3(x)存在且唯一,其基函数计算公式如下: ...

  3. 一文讲解图像插值算法原理!附Python实现

    Datawhale学习 作者:姚童,Datawhale优秀学习者 寄语:本文梳理了最近邻插值法.双线性插值法和三次样条插值法的原理,并以图像缩放为例,对原理进行了C++及Python实现. 在图像处理 ...

  4. 轨迹生成--三次样条插值

    三次样条函数插值(Cubic spline function interpolation)   对于样条概念解释得很好 三次样条插值算法C++实现 开源项目推荐:我个人中意的Python/C++数学库 ...

  5. matlab样条插值如何用,三次样条插值matlab实现

    %三次样条差值-matlab通用程序 - zhangxiaolu2015的专栏 - CSDN博客 https://blog.csdn.net/zha %[图文]三次样条插值算法详解_百度文库 http ...

  6. 【20220207】【信号处理】三次样条插值原理详解

    方程组的求解本文不做介绍. 一.三次样条插值 1. 定义 三次样条插值(Cublic Spline Interpolation),简称 Spline 插值,是通过一系列样本点的光滑曲线,数学上通过求解 ...

  7. 三次样条插值matlab实现

    三次样条插值matlab实现 %三次样条差值-matlab通用程序 - zhangxiaolu2015的专栏 - CSDN博客 https://blog.csdn.net/zhangxiaolu201 ...

  8. 转载:一文讲解图像插值算法原理

    最近在研究插值算法,看到这篇CSDN博主Datawhale学习介绍的博文,觉得介绍得挺不错,转载过来.原文地址:https://blog.csdn.net/Datawhale/article/deta ...

  9. 三次样条曲线插值的基本原理及其C#实现

    声明:本人空间的所有文章,若无特别声明,皆为本人原创,可自由转载,但要注明原作者和原始出处,不可作为商业用途. 下面的内容是直接从Word文档复制粘贴出来的,有很多内容丢失,完整的PDF版本可到百度网 ...

最新文章

  1. 指定服务器无效,安装sqlserver2008r2 服务器配置,服务帐户配置出错,提示Sql server服务指定的凭据无效...
  2. 湖南科技学院计算机科学与技术分数,湖南科技学院计算机科学与技术专业2016年在河南理科高考录取最低分数线...
  3. Jquery DataTable控制显示列,导出EXCEL
  4. JavaScript中的异步梳理(0)
  5. mybitis第三讲:关联查询
  6. LeetCode 8 字符串转换整数 (atoi)
  7. 47. 全排列 II
  8. 分析技术在PMP中的应用
  9. Multisim单结晶体管触发电路仿真
  10. 计算机算法基础总结(借鉴、整理)
  11. python基础1:数据类型和标识符命名规范
  12. mac80端口问题无法使用
  13. OpenGL中phong光照模型详解
  14. Angular入门-Hero Editor抽丝
  15. 怎么停止skywalking_SkyWalking安装和使用
  16. C/C++数字后面的L是什么意思?
  17. 基于深度学习的CVaaS计算机视觉即服务案例(Computer Vision as a Service)
  18. 数论——————最简分数
  19. 基于网易云短信接口开发
  20. Ebook管理工具(持续更新)

热门文章

  1. 算法面试题解答(六)
  2. 77 ~And, two stars meet again~ RC汉化补丁[BUG修正]
  3. PHP包管理器PEAR 中爆多个缺陷可发动供应链攻击,已潜伏15年
  4. 西门子修复因使用第三方组件引起的90多个漏洞
  5. VSCode 扩展中出现严重漏洞,可导致供应链攻击
  6. 面向对象进阶(day7)
  7. 拷贝构造函数、析构函数、赋值操作符重载、取地址操作符重载和const修饰的取地址操作符重载...
  8. SpringCloud的EurekaClient : 客户端应用访问注册的微服务(无断路器场景)
  9. Recreate failovered primary database using Flashback Database
  10. 建立本地rhel5.3的yum源