7

使用 scipy 的interpolate.splprep函数在 parameter 上得到一个参数样条u,但 的域u不是样条的线积分,它是输入坐标的分段线性连接。我试过integrate.splint了,但这只是给出了个人积分u。显然,我可以对一堆笛卡尔微分距离进行数值积分,但我想知道是否有封闭形式的方法来获取我忽略的样条线或样条线段(使用 scipy 或 numpy)的长度。

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

我将尝试 Maxima 来尝试获得我认为是样条线段的函数的不定积分:我在MathOverflow上交叉发布了这个

4

2 回答 2

6

因为 x 和 y 都是三次参数函数,所以就简单函数而言,没有封闭的解决方案。数值积分是要走的路。整合弧长表达式或简单地添加线段长度 - 取决于您所追求的准确性以及您想要施加多少努力。

一种准确快速的“添加线段长度”方法:

使用递归细分(de Casteljeau 算法的一种形式)生成点,可以用最少的点为您提供高度准确的表示。仅在不满足标准时才细分细分。通常,标准基于连接控制点(船体或笼子)的长度。对于立方,通常比较 P0P1+P1P2+P2P3 与 P0P3 的接近度,其中 P0、P1、P2 和 P3 是定义贝塞尔曲线的控制点。

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

转换为 Python 应该相对容易。它将生成点。代码已经计算了段的长度以测试标准。您可以简单地累积这些长度值。

于 2010-02-02T08:42:57.230 回答
4

您可以将函数集成到sqrt(x'(u)**2+y'(u)**2)scipy.interpolate.splev计算u导数x'y'坐标的位置。可以使用scipy.integrate中的一个例程来完成集成(精确 [Clenshaw-Curtis],通常更快)。这应该比将许多小距离相加(相当于与矩形规则集成)更精确,并且可能更快。quadromberg

于 2010-02-02T13:10:25.810 回答