在给定可变数量的数据点的情况下如何找到曲线方程的理论

时间:2015-01-18 01:29:16

标签: algorithm math theory

我最近开始研究一个项目。我遇到的一个问题是将变化的加速度转换为速度。通过传感器提供不同时间点的加速度。如果得到这些数据点的等式,那个等式上某个时间(x)的导数将是速度。

我知道如何在计算机上执行此操作,但我如何从方程式开始?我已经四处寻找,但我没有发现任何现有的程序可以形成一个点,给出一组点。在过去,我已经创建了一个神经网络算法来形成一个方程式,但它需要相当长的时间才能运行。

如果有人可以链接我一个程序或解释这样做的过程,那就太棒了。

很抱歉,如果这是在错误的论坛。我会发布数学,但需要一个编程背景来了解计算机可以快速完成的可能性领域。

3 个答案:

答案 0 :(得分:2)

我同意数字整合可能是你想要的评论。如果你仍然想要一个功能通过你的数据,让我进一步反对这样做。

找到一条完全通过某些给定点的曲线通常是一个坏主意。在几乎所有应用的数学环境中,您必须接受输入中存在一点噪声,并且精确通过这些点的曲线可能对噪声非常敏感。这可以产生垃圾输出。找到一条完全通过一组点的曲线,要求overfitting得到一个记忆而不是理解数据的函数,而不是一般化。

例如,取点(0,0),(1,1),(2,4),(3,9),(4,16),(5,25),(6,36) 。这些是y = x ^ 2上的七个点,这很好。在x = -1时x ^ 2的值是1.现在如果用(2.9,9.1)替换(3,9)会发生什么?有一个六阶多项式通过所有7个点,

4.66329x - 8.87063x^2 + 7.2281x^3 - 2.35108x^4 + 0.349747x^5 - 0.0194304x^6. 

graph of y=x^2 and interpolating polynomial for modified data

x = -1处的值为-23.4823,距离1非常远。虽然曲线在0和2之间看起来没问题,但在其他示例中,您可以看到数据点之间存在较大的振荡。

一旦你接受了你想要的近似值,而不是曲线正好通过这些点,你就会遇到所谓的regression问题。有许多类型的回归。通常,您选择一组函数和一种衡量函数近似数据的方法。如果你使用一组简单的函数,比如行(linear regression),你就会找到最合适的函数。如果使用更复杂的函数族,则应使用regularization来惩罚过于复杂的函数,例如具有记忆数据的大系数的高次多项式。如果您使用简单族或正则化,则在添加或保留一些数据点时,该函数不会发生太大变化,这表明它是数据中有意义的趋势。

答案 1 :(得分:2)

这最初是一个评论,但结果太大了。

只是为了确保您熟悉术语......

分化接受一个函数 f(t)并吐出一个新函数 f&#39;(t),告诉你如何< em> f(t)随时间变化(即 f&#39;(t)在时间 t时给出 f(t)的斜率)。这将使您从位移到速度或从速度到加速。

积分采用函数 f(t)并吐出一个新函数 F(t),它测量函数< em> f(t)从时间开始直到给定点 t 。一开始并不明显的是,整合实际上是差异的逆向,这个事实被称为The Fundamental Theorem of Calculus。因此,积分将从加速到速度或速度转移到位移。

您不需要了解微积分的规则来进行数值积分。用于以数字方式积分函数的最简单(且最天真)的方法是通过将区域近似为在时间点之间的小切片并且对矩形的面积求和来近似该区域。这个近似和称为 Reimann和

enter image description here

正如您所看到的,这往往会超出并超出功能的某些部分。一个更准确但仍然非常简单的方法是梯形规则,它也用一系列切片近似函数,除了切片的顶部是函数值之间的直线而不是常量值。 / p>

enter image description here

更简单,但更好的近似是辛普森的规则,它在时间点之间用抛物线近似函数。

http://images.tutorvista.com/cms/images/45/composite-simpsons-rule.jpeg

您可以将这些方法中的每一种视为更好地逼近积分,因为它们各自使用有关函数的更多信息。第一种方法每个区域只使用一个数据点(一个恒定的平线),第二种方法每个区域使用两个数据点(一条直线),第三种方法每个区域使用三个数据点(抛物线)。

您可以阅读这些方法背后的数学herethis pdf的第一页。

答案 2 :(得分:2)

不幸的是,集成加速度计数据以获得速度是一个数值上不稳定的问题。对于大多数应用程序,您的错误会很快发生,从而无法获得任何实际价值的结果。

回想一下:

v(t) = \int a(t)

所以:

enter image description here

无论你的加速度计数据是否合适,你仍然可以对基础加速度函数进行分段插值:

v_{T_{n}} = v_{T_{0}} + \int_{T_{0}}^{T_{1}} a_{0}(t):dt + \int_{T_{1}}^{T_{2}} a_{1}(t):dt + ... +\int_{T_{n-1}}^{T_{n}} a_{n-1}(t):dt

每个集成的错误术语将添加!

通常情况下,只有a few seconds才能看到非常不准确的结果。