代码之家  ›  专栏  ›  技术社区  ›  Paul

求三次b样条的长度

  •  7
  • Paul  · 技术社区  · 16 年前

    使用scipy's interpolate.splprep 函数获取参数样条曲线 u ,但是 U 不是样条的线积分,而是输入坐标的分段线性连接。我试过了 integrate.splint ,但这只是给出了单个积分 U . 显然,我可以用数值方法积分一系列笛卡尔微分距离,但我想知道是否有一种封闭形式的方法来获得我忽略的样条曲线或样条曲线段的长度(使用scipy或numpy)。

    编辑:我正在寻找一个封闭形式的解决方案或一个非常快速的方式收敛到一个机器精度的答案。我几乎放弃了数值求根的方法,现在主要是在一个封闭的形式的答案。如果有人有任何集成椭圆函数的经验,或者可以给我指一个好的资源(不是wolfram),那就太好了。

    我将尝试maxima,试图得到一段样条函数的不定积分:我在 MathOverflow

    2 回复  |  直到 16 年前
        1
  •  6
  •   symmetry    16 年前

    因为x&y都是三次参数函数,所以对于简单函数并没有一个封闭解。数值积分是一种方法。集成弧长表达式或简单地添加线段长度-取决于所需的精度和所需的工作量。

    准确快速的“增加线段长度”方法:

    使用反向细分(de Casteljeau算法的一种形式)来生成点,可以用最少的点提供高精度的表示。 只有在细分不符合条件时才细分细分。通常,标准是基于连接控制点(船体或保持架)的长度。 对于立方体,通常比较p0 p1+p1 p2+p2 p3与p0p3的接近度,其中p0、p1、p2&p3是定义bezier的控制点。

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

    转换成python应该比较容易。 它将生成点。代码已经计算了段的长度,以便测试条件。您可以简单地累积这些长度值。

        2
  •  4
  •   Eric O. Lebigot    16 年前

    你可以整合这个功能 sqrt(x'(u)**2+y'(u)**2) 结束 u ,计算导数 x' y' 你的坐标 scipy.interpolate.splev . 集成可以使用 scipy.integrate ( quad 是精确的[克伦肖柯蒂斯], romberg 通常更快)。这应该更精确,并且可能比加上许多小距离(相当于与矩形规则集成)更快。

    推荐文章