让微积分穿梭于工作与学习之间(20):圆弧直线的曲率及其在趋于直线时的极限
曲率对于一般的编程人员来说似乎已经过于高深,但是我们的项目中还是用到了。
在第17篇中,我们指出了按角度排序需要用到圆弧的切线,但是随着问题的逐步深入,仅仅算切线是不够的。因为不同的线条,切线可能完全重合,如下图所示,AB,AC,AD,AE的切线均为AD,所以单算切线无法得到角度排序的结果。
但是它们的“角度”大小是不一样的,AE往着负方向(此处假定逆时针为负)弯曲的速度比AC要快,所以AE要排在AC的前面,然后AD完全没弯曲,所以AD在AC的后面。然后AB虽然也有弯曲,但它是往着正向去弯曲的,因此需要排在AD的后面。
数学教材中指出,一阶导数反映的是变速直线运动的瞬时速度,而反映瞬时加速度的,则是二阶导数了。然后这里我们用了一阶导数求得弧线的角度,那么角度的变化速度,我就很理所当然地套用了二阶导数了。结果发现怎么算都是不对的。究其原因,是在于二阶导数所提及的加速度仅仅是变速直线运动,如果不是直线,那么就需要通过类似于正交分解的方法分成两个方向单独计算。而此处我们要研究的是角度变化,因此直接套二阶导数并不合适。
角度的变化速度,数学上已经有现成的概念了,它被定义为曲率K,计算方法如下。
这个公式在实际中不太好操作,因此有化为用导数计算的式子。
可见它也用到了二阶导数。
现在我们的圆弧直线方程是一个多值的隐函数,二阶导数的求解会过于繁琐,所以此处我打算偷懒一下,直接利用一个现成的结论,就是圆的曲率处处相等,并且等于半径的倒数。
这次,我们的R不再取标准位置的值了,而以一般的位置代之,其结果在上一篇有推导过,我们把它搬过来。
于是有
大家可能会发现,我这个地方写得并不严谨,因为按定义,曲率是不存在负数的,半径也是,但是凸度可正可负,当b取负数的时候,半径和曲率都变负数了。我从15篇开始,全程都没加绝对值符号对此进行控制,其实是为了贪图方便。毕竟在很多场合,如果这些变量被绝对值号统一成非负数了,那么到后面又得重新分开情况讨论,从而对我们研究核心问题带来太多的干扰。
那串长长的根号大家不用怕,也就是一个常量而已。我们在这个公式下对取b趋于0时的极限看看。
也就是说,弧线趋于直线的时候,曲率趋于0,这跟直线的曲率处处为0的结论相吻合。
由于这里的K可正可负,所以本文开头给出的图里面,弯曲的方向也能通过K的符号获取得到(说白了就是看b的符号)。然后在项目中,我们还需要注意一点,如果图中的A点是某条弧线(比如AB)的终点而非起点,那么从B到A的走向将和b的符号相反,此时需要取反一下K值才能得到正确的结果。
虽然半径趋于无穷导致1/R无法在非数学编程语言中无法计算(少数是支持的,我用的AS计算1/无穷大可以得到0),但是当它变成b的表达式之后,我们发现其极限完全可以用纯初等函数的表达式进行代入得到,因此曲率无须用if进行区分。