确定两个已知点之间给定弧长的抛物线

时间:2018-01-28 12:16:47

标签: python geometry curve-fitting

设(0,0)和(Xo,Yo)是笛卡尔平面上的两个点。我们想要确定抛物线曲线,Y = AX ^ 2 + BX + C,它从这两个点通过并且具有等于S的给定弧长。显然,S> 1。 sqrt(Xo ^ 2 + Yo ^ 2)。由于曲线必须从(0,0)传递,因此它应该是C = 0。因此,曲线方程简化为:Y = AX ^ 2 + BX。我怎样才能确定{A,B}知道{Xo,Yo,S}?有两个解决方案,我想要一个A> 0的解决方案。

我有一个解析解(复数)给出了一组{A,B,Xo,Yo}的S,虽然这里的问题是倒置的......我可以通过数值求解一个复杂的方程组来进行。 ..但也许有一个数字例程就是这样做的?

任何有用的Python库?其他想法?

非常感谢: - )

1 个答案:

答案 0 :(得分:0)

请注意,二次a*x0^2 + b*x0的弧长(线积分)由sqrt(1 + (2ax + b)^2)x = 0x = x0的积分给出。在求解积分时,积分的值为0.5 * (I(u) - I(l)) / a,其中u = 2ax0 + b; l = b;和I(t) = 0.5 * (t * sqrt(1 + t^2) + log(t + sqrt(1 + t^2))sqrt(1 + t^2)的积分。

y0 = a * x0^2 + b * x0b = y0/x0 - a*x0以来。替换bulu = y0/x0 + a*x0l = y0/x0 - a*x0的值。在行积分(弧长)的解中替换ul,我们得到弧长作为a的函数:

s(a) = 0.5 * (I(y0/x0 + a*x0) - I(y0/x0 - a*x0)) / a

现在我们将弧长作为a的函数,我们只需找到a的{​​{1}}的值。这是我最喜欢的寻根算法Newton-Raphson method再次发挥作用的地方。

Newton-Raphson寻找根的方法的工作算法如下:

对于要获取其根的函数s(a) = S,如果f(x)是根的x(i)猜测,

i

其中x(i+1) = x(i) - f(x(i)) / f'(x(i)) f'(x)的衍生物。这个过程一直持续到两个连续猜测之间的差异非常小。

在我们的案例中,f(x)f(a) = s(a) - S。通过简单应用链规则和商规则,

f'(a) = s'(a)

s'(a) = 0.5 * (a*x0 * (I'(u) + I'(l)) + I(l) - I(u)) / (a^2)

剩下的唯一问题是计算好的初始猜测。由于the graph of s(a)的性质,该函数是Newton-Raphson方法的优秀候选者,并且I'(t) = sqrt(1 + t^2)的初始猜测在大约5-6次迭代中收敛到解决方案的容差/ epsilon y0 / x0

找到1e-10的值后,a只是b

将其写入代码:

y0/x0 - a*x0

Run the example on CodeSkulptor

请注意,由于作为示例中函数输入的弧长的有理逼近,所获得的系数可能与预期值略有不同。