2010-02-02 106 views
7

使用scipy的interpolate.splprep函数获取参数u的参数样条,但u的域不是样条的线积分,它是输入坐标的分段线性连接。我试过integrate.splint,但只是通过u给出了个体积分。显然,我可以在数值上整合一串笛卡尔差分距离,但是我想知道是否有闭合形式的方法来获取我忽略的样条或样条段(使用scipy或numpy)的长度。查找三次B样条的长度

编辑:我正在寻找一种封闭形式的解决方案或一种非常快速的方式来收敛到机器精度的答案。我几乎都放弃了数字寻根方法,现在主要是在一个封闭的答案之后。如果任何人有任何集成椭圆函数的经验,或者可以将我指向一个好的资源(Wolfram除外),那将会很棒。

我要去尝试千里马,试图得到什么,我相信是花键的一个部分功能的不定积分:I交叉张贴这对MathOverflow

回答

6

因为这两个X & y都是立方参数化的功能,在简单的功能方面没有封闭的解决方案。数值积分是要走的路。要么整合弧长表达式,要么简单地添加线段长度 - 取决于您所处的准确度以及您要付出多少努力。

的精确和快速的“添加线段的长度”的方法:

使用recurvise细分(德Casteljeau的算法的形式),以产生点,可以给你与点的最小数量的高度精确的表示。 如果它们不符合标准,则只能细分细分。通常,标准基于连接控制点(船体或笼)的长度。 对于三次方,通常比较P0P1 + P1P2 + P2P3与P0P3的接近程度,其中P0,P1,P2为定义贝塞尔曲线的控制点。

你可以找到一些Delphi代码在这里: link text

它应该是比较容易转换到Python。 它会生成点。该代码已经计算了段的长度以便测试标准。您可以简单地累积这些长度值。

+0

这个解决方案对于近似值是很好的,但是我应该在我的问题中说明我是在精确的还是在机器精确的答案之后。它与EOL的romberg解决方案类似,但我将不得不在纯python中进行迭代。 – Paul 2010-02-04 00:30:42

+0

由于一般分析解决方案涉及椭圆积分,因此无论采取何种方法,都将进行数值积分。 我所概述的方法并不直接整合弧长表达式,但它也是一个数值积分。 重要的是该方法在期望的时间收敛到期望的精度。 – symmetry 2010-02-04 13:37:39

+0

为了更精确地说明这些长度,我指的是你会沿途积累... 看一看这里: http://steve.hollasch.net/cgindex/curves/cbezarclen.html 使用船体长度(L1)和弦长(L0)的平均值来近似单个子段的弧长。 – symmetry 2010-02-04 14:14:33

4

您可以通过u,在那里你计算衍生x'scipy.interpolate.splev你的坐标y'功能sqrt(x'(u)**2+y'(u)**2)整合。整合可以通过scipy.integratequad是精确的[Clenshaw-Curtis],romberg通常更快的例程之一来完成。这应该更精确,并且可能比添加大量小距离(这等同于与矩形规则集成相等)更快。

+0

我喜欢这个解决方案,因为你可以设置你想要的精度,但不幸的是我在机器精度型精度之后。我实现了你的建议,但是QUADPACK(就像它真棒)不符合我的性能要求。我目前正在寻求封闭式解决方案,并已在MathOverflow上发布。顺便说一句:Clenshaw-Curtis对多项式只有精确/精确。这个样条的长度是一个椭圆函数。 – Paul 2010-02-04 00:26:50