2015-04-15 30 views
1

我正在面对C语言中实时计算布洛克值的问题。如何有效地评估或近似一条路段的线形?

首先,我尝试使用Matlab编码器为Fresnel公式的quadgk积分器获取自动生成的C代码。这在我的测试scnearios中基本上很有用。唯一的问题是它运行速度非常慢(在Matlab以及自动生成的代码中)。

另一种选择是插入通过直线(线性插值)连接采样点的单位回旋曲的数据表。当我发现只有曲率小的变化(沿着回旋线很小的台阶)后,我放弃了,结果明显降低了线条。真是令人惊喜......

我知道可以使用不同的公式绘制圆圈,但在实际情况下经常会遇到曲率变化较小的情况,并且标题0°和360°之间的30k采样点不会出现,为我的问题提供足够的角度分辨率。

然后我在R = inf点周围试了一个泰勒近似值,希望在任何地方都会有明显的曲率。我很快意识到我不能使用超过4项(幂的15),因为多项式很快会变得不稳定(可能是由于双精度fp计算中的数值不准确)。因此,对于较大的t值,显然准确度会迅速降低。通过“大t值”,我正在谈论回旋曲线上的每一点,它代表了超过90°w.r.的曲线。零曲率点。

例如,当评估从R = 150米到R = 125米的道路,同时做出90°转弯时,我正在有效近似区域外。相反,我处于204.5° - 294.5°的范围内,而我的泰勒极限将在大约90°的单位回旋曲线上。

我现在有点随意地尝试了一些东西。我的意思是我可以试着把时间花在有关这个话题的几十篇论文上。或者我可以尝试改进或组合上述的一些方法。也许甚至在Matlab中存在一个兼容编码器的集成功能,并且速度足够快。

这个问题对我来说很重要,我不应该有那么多麻烦解决它。任何暗示?

回答

1

关于泰勒级数中的4个术语 - 您应该可以使用更多。 2pi的总θ值肯定是可行的,有双打。

根据完整的公式计算每个术语的绝对值,计算完整的因子和功率值。这是非常快速失去精确度的原因。相反,计算这些术语是逐步进行的,下一个是从前一个开始计算的。找到下一期的比率为的公式,并使用它。

为了提高精度,请不要在theta中计算距离,s(以免失去缩放精度)。

你的例子是一个非常扁平的回旋曲。如果我没有犯错,它从(25/22) pi =~ 204.545°(36/22) pi =~ 294.545°(为什么不在你的问题中包括这些细节?)。尽管如此,它应该没问题。即使是2 pi = 360°,完整的圆圈(和两倍)应该没有问题。

given: r = 150 -> 125, 90 degrees turn : 

    r s = A^2 = 150 s = 125 (s+x) 

    => 1+(x/s) = 150/125 = 1 + 25/125  x/s = 1/5 

    theta = s^2/2A^2 = s^2/(300 s) = s/300 ; = (pi/2) * (25/11) = 204.545° 
    theta2 = (s+x)^2/(300 s) = (6/5)^2 s/300 ; = (pi/2) * (36/11) = 294.545° 
    theta2 - theta = (36/25 - 1) s/300 == pi/2 

    => s = 300 * (pi/2) * (25/11) = 1070.99749554 x = s/5 = 214.1994991 

     A^2 = 150 s = 150 * 300 * (pi/2) * (25/11) 

     a = sqrt (2 A^2) = 300 sqrt ((pi/2) * (25/11)) = 566.83264608 

的参考点是在r =无穷远,其中θ= 0

我们有x = a INT[u=0..(s/a)] cos(u^2) d(u)其中a = sqrt(2 r s)theta = (s/a)^2。写出cos的泰勒级数,并逐项对其进行积分,以获得距离为零的函数的x泰勒近似值,s,沿着曲线,从0点开始。就这样。

接下来你必须决定用什么密度来计算沿着回旋曲线的点。您可以从弦上方的所需公差值中找到它,最小半径为125.这些点将因此定义通过连续点之间绘制的线段的曲线近似值。

+0

好的我编辑了我的例子并添加了你的数字。它们是正确的。我们再看看系数的计算(目前它们是离线预先计算的)。所以你认为即使对于大型的Thetas,在s = 0左右也可以达到足够好的效果? 注意:目前,我的积分是由数字t = k * s参数化的,其中k取决于清晰度。角度只是让我的例子更容易。 – rava

+0

好吧,这就是我的意思。在0 | 0处,单位回旋曲线具有零航向和零曲率(即,R = inf)。你是否建议我应该为泰勒评估选择一个不同的参考点?这会使精度变得非常容易 - 而且这会使数学变得非常困难,因为我必须知道当时菲涅耳积分的确切解答,对吧? – rava

+0

好吧我能够在Matlab中获得精确的泰勒近似。你是对的。很容易做到50个术语。但是对系数进行迭代逼近并没有帮助。要么检查5次的公式中存在错误,要么结果更差。无论如何,使用系数表工作对我来说效果不错。不,我们试着把它放到C中。 – rava