1 个不稳定版本
0.1.0 | 2021年12月27日 |
---|
#1176 在 数学
695KB
4.5K SLoC
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样条曲线拟合到输入数据中,并结果以
spliny
crate的CurveSpline
形式呈现。数据输入是1维曲线的x
和y
向量,对于N维曲线,输入是u
和xyn
向量。 -
使用简化来使用生成的样条,例如计算曲线坐标或样条曲线的导数。此包还实现了以JSON文件形式输入和输出样条表示的基本工具,以及样条绘图。它完全用Rust编写,且不需要Fortran编译器。
-
dierckx-sys包含Paul Dierckx的FITPACK库的外部函数接口。它被
splinify
使用,但——除非你想自己探索Paul Dierckx库——在关注使用splinify
和spliny
时可以忽略。
要使用此库,请将以下内容添加到您的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(《LICENSE-APACHE》或 https://apache.ac.cn/licenses/LICENSE-2.0》)
- MIT 许可证(《LICENSE-MIT》或 http://opensource.org/licenses/MIT)?
任选其一。
贡献
除非您明确声明,否则您提交的任何旨在包含在本作品中的贡献,根据 Apache-2.0 许可证的定义,应如上所述双重许可,不附加任何额外的条款或条件。
依赖关系
约 17MB
约 150K SLoC