#spline #curve #spline-interpolation #data-points #fitting #smoothing #interpolation

splinify

Rust 对 Dierckx 的 B-Splines 曲线和曲面 Fortran 库的封装

1 个不稳定版本

0.1.0 2021年12月27日

#1176数学

MIT/Apache

695KB
4.5K SLoC

FORTRAN Legacy 3.5K SLoC // 0.5% comments Rust 655 SLoC // 0.2% comments

Splinify:拟合曲线和曲面样条



一个由 Splinify 生成的 b-Spline 曲线,有15个控制点
有关如何生成此示例的详细信息,请参阅 lissajous 示例

简介

警告:此库使用 Fortran 库作为拟合引擎,并且除了 Rust 之外还需要一个 Fortran 编译器

Splinify 使用 Dierckx 的 Fortran FITPACK 库将数据点集拟合到曲线和曲面样条,该库由 Paul Dierckx 在1980年代中期编写。Dierckx 的库仍然是今天最先进的通用 B-spline 拟合库之一——其数学基础和算法在 Paul Dierckx 的书中详细描述: Curve and Surface Fitting with Splines

由于其所有功能——并且至少在 API 设计方面是在某种程度有限制的语言中编写的——Dierckx 的 FITPACK 很难使用:例如,其 concur 子例程有 28 个数值参数!此库的目的是通过实现高级的 Rustacean 应用程序接口,使其更容易从 Rust 中访问。

其预期用途是科学分析和建模,例如在色度计中表示光谱分布,或对位置数据进行插值,并使用样条导数来获取一个或多个维度中运动对象的速度和加速度。

尽管 Dierckx 的 Fortran 库涵盖了拟合单变量和多变量 B-Splines 的样条评估方法,但目前只实现了其 单变量或单个输入参数的拟合方法

Fortran

由于此 crate 是 Fortran 封装,因此您需要系统上的 Fortran 编译器才能使用它:具体来说,它需要安装 Gnu Fortran 的 GFortran。有关说明,请参阅 安装 GFortran

需要安装 Fortran 编译器是一个很大的限制,因此我建议不要将其作为通用用途项目中的依赖项使用。

说明

Splinify 是三个 crate 中的一个

  • 简化将(非均匀)B样条曲线拟合到输入数据中,并结果以splinycrate的CurveSpline形式呈现。数据输入是1维曲线的xy向量,对于N维曲线,输入是uxyn向量。

  • 使用简化来使用生成的样条,例如计算曲线坐标或样条曲线的导数。此包还实现了以JSON文件形式输入和输出样条表示的基本工具,以及样条绘图。它完全用Rust编写,且需要Fortran编译器。

  • dierckx-sys包含Paul Dierckx的FITPACK库的外部函数接口。它被splinify使用,但——除非你想自己探索Paul Dierckx库——在关注使用splinifyspliny时可以忽略。

要使用此库,请将以下内容添加到您的Cargo.toml文件中

[dependencies]
splinify= "0.1"

示例

B样条

B样条表示的一些用途包括

  • 插值在一维或多维中,例如当需要测量数据点之间数据以绘制线图时,
  • 计算测量数据的导数,例如从一组时间和距离值计算汽车的瞬时速度和加速度,
  • 平滑,通过计算平滑的线或形状通过噪声数据,例如平滑平板上手写的脚本。

B样条(或基样条)是多项式,不是拟合整个数据集,而是拟合数据集的段,并在端点连接。所有段的全部多项式的集合是一个曲线(或曲面)B样条表示。除了多项式都是连接的,以形成一个连续的线,它们还构建为具有相同的第一、第二或更高(根据多项式的度数)导数,以形成平滑的曲线和曲面。

以下是来自维基百科关于B样条的引用

阶数为n的样条函数是一个关于变量x的n-1阶分段多项式函数。片段相遇的地方被称为结点。

B样条可以用来

  • 拟合曲线,在这种情况下称为一元B样条,将一个或多个输出拟合到单个输入,
  • 或可以用来拟合曲面,称为二元B样条,用于将一个或多个输出拟合到两个输入,
  • 或可以使用多元B样条来拟合“体积”,通过将一个或多个输出拟合到三个或更多输入。

例如,汽车的速度作为时间的函数可以用一元样条来描述,而天气预测的气压分布可以用二元样条来描述。一个多元B样条表示的例子是对房间内3D温度测量的样条拟合。

曲线拟合

此包装提供了各种接口对象到Dierckx的库

  • CurveSplineFit<K>,它包装了curfit,用于将具有*K度的曲线拟合到一组(xi,yi)数据点,条件是xi+1>xi+1;这种类型的数据集的一个例子是包含时间和温度的数组,在一定时间内测量,

  • ParameterCurveSplineFit<K,N>,封装了 concur,用于拟合一个可选约束的参数化曲线,曲线的阶数为 K,数据点由输入参数值 ui 组成,同时满足条件 ui+1>ui,以及二维空间中的一个点集 (xi,yi)(N=2),或三维空间中的一个点集 (xi,yi,zi)(N=3),甚至更高维度的空间(N≤10);例如,一只苍蝇在餐桌上方飞行的轨迹。

这两个都是通用的样条实现,使用样条阶数 K 和空间维度 N 作为类型参数。Dierckx 强烈建议只使用奇数阶线性(N=1)、三次(N=3)和五次(N=5)样条函数。为了避免使用类型参数,已定义以下类型别名

  • CurveSplineFit<K> 的类型别名
别名 K
LinearSplineFit 1
CubicSplineFit 3
QuinticSplineFit 5
  • ParameterCurveSplineFit<K,N> 的类型别名
别名 K N
LinearSplineFit2D 1 2
CubicSplineFit2D 3 2
QuinticSplineFit2D 5 2
LinearSplineFit3D 1 3
CubicSplineFit3D 3 3
QuinticSplineFit3D 5 3

要为一维曲线使用约束样条拟合,可以使用参数化曲线表示(使用 x 作为 'u',y 作为 'xn'),用 Dierckx 的 concur 替代默认的 curfit 子程序

别名 K N
LinearSplineFit1D 1 1
CubicSplineFit1D 3 1
QuinticSplineFit1D 5 1

样条拟合类型

对于数据集,可以生成以下样条类型

  • 插值样条
    这些样条正好拟合给定数据,没有误差,节点位于输入参数值的位置。除了输入数据外,无需进一步输入,除非您想设置特定的边界条件。

  • 最小二乘样条
    当您指定节点的位置时,可以得到这些样条。样条将拟合以最小化样条与数据点之间的平方偏差。结果样条值可能偏离给定的输出数据值。通常使用等距位置的节点,在这种情况下,样条被称为 基样条。这里还需要输入节点的位置,以及可选的边界条件。

  • 平滑样条
    通过提供数据中估计的 '噪声' 的度量(以均方根噪声值的形式)来生成平滑样条。平滑样条算法将添加节点,直到拟合误差小于给定的均方根噪声估计。还可以为每个数据点添加权重因子,以限制这些点对拟合结果的影响。

许可

本存储库中所有内容均为 ©2021 Harbers Bik LLC,并许可使用以下任一许可

任选其一。

贡献

除非您明确声明,否则您提交的任何旨在包含在本作品中的贡献,根据 Apache-2.0 许可证的定义,应如上所述双重许可,不附加任何额外的条款或条件。

依赖关系

约 17MB
约 150K SLoC