轨迹插值和导数

时间:2012-06-14 15:18:03

标签: c++ spline

我正在研究2D平面中粒子轨迹的分析。该轨迹通常由5到50个(在极少数情况下更多)点(离散整数坐标)组成。我已经匹配了我的数据集的点以形成轨迹(因此我有时间分辨率) 我想对这个轨迹的曲率进行一些分析,不幸的是我使用的分析框架不支持拟合轨迹。据我所知,可以使用splines / bezier曲线来完成这项工作,但我希望你的意见和/或建议使用什么。
由于这只是我工作的一个可选部分,因此我无法投入大量时间自行实施解决方案或理解复杂的框架。解决方案必须尽可能简单。

让我从可能的库中指定我需要的功能:
- 从不同的点数创建轨迹
- 由于点是离散的,它应该插入它们的位置;只要轨迹和点之间的最终距离小于阈值,就不需要对所有点进行精确匹配 - 对于任何给定的点,库必须能够产生轨迹的导数 - 如果图书馆可以报告插值的质量水平(如拟合的chiSquare)将是有益的

编辑:阅读完评论后,我想补充一点:
轨迹不必与点精确匹配。这些点是根据像素矩阵的值创建的,因此它们形成离散的坐标矩阵,其空间分辨率受每个给定距离的像素数限制。因此,点(放置在点火像素的中心)不会(精确地)匹配粒子的实际轨迹。只要解决方案可以处理可能/最可能既不是双射也不是单射的轨迹,插值或拟合对我来说都是好的。
因此,大多数传统的拟合方法(如使用多项式拟合或使用最小二乘拟合的指数函数)都无法满足我的标准。
另外我尝试过的所有传统拟合方法都产生了一个似乎很好地描述轨迹的函数,但是当看到它们的一阶导数(或者在更高分辨率下)时,可以发现许多“微振荡”(根据我的解释)是一个结果将非直线函数拟合到轨迹的(几乎)直线部分。

编辑2:评论中有一些讨论,这些轨迹可能是什么样子。基本上可能有任何形状,长度和“卷曲”,虽然我试图排除在前面的步骤中重叠或交叉的轨迹。我在下面列举了两个例子;忽略彩色框,它们只是原始像素矩阵值的表示。黑色圆点是我想要与轨迹匹配的点,因为您可以看到它们总是以像素为中心,因此可能只有离散(整数)值。

ex1
ex2

提前感谢任何帮助&贡献!

2 个答案:

答案 0 :(得分:1)

这可能是要走的路

http://alglib.codeplex.com/

根据您的描述,我会说参数样条插值可能符合您的要求。我自己没有使用上面的库,但它确实支持样条插值。使用插值意味着您不必担心适合度 - 曲线将通过您给出的每个点。

答案 1 :(得分:0)

如果您不介意使用矩阵库,linear least squares是最简单的解决方案(请查看常规问题部分的末尾以了解要使用的等式)。您也可以使用linear/polynomial regression来解决此类问题。

线性最小二乘将始终提供最佳解决方案,但它不可扩展,因为矩阵乘法的成本非常高。回归是一种迭代启发式方法,所以你可以运行它直到你有一个“足够好”的答案。我已经看到了数据中大约1000-10000维度的截止指南。因此,对于您的数据集,我建议使用线性最小二乘法,除非您决定出于某种原因使它们具有高度尺寸。