让微积分穿梭于工作与学习之间(10):在椭圆弧上做匀速运动,我就无能为力了

在曲线上做匀速运动(其实匀速有两种情况,一种是匀速度,一种是匀速率,这里讲的是后者,即按长度等分),就要求得曲线的长度,然后算出等分的位置从而把效果实现出来。

这是动画制作软件的常用功能,所以肯定有成熟的做法,当年的我也坚信自己能解决下来。

计算曲线长度其实跟计算面积是一样的,都是照着分割-近似求和-取极限这样的路线,因此可以用定积分来算。只要把被积函数替换成计算短线段长度的函数即可代入。

让微积分穿梭于工作与学习之间(10):在椭圆弧上做匀速运动,我就无能为力了

把曲线用多条线段来模拟,近似的长度就是这多条线段的长度总和。

以单段线为例,给出两端点的坐标,上图中AB的长度就可以用勾股定理求得:

让微积分穿梭于工作与学习之间(10):在椭圆弧上做匀速运动,我就无能为力了

x1-x0,y1-y0分别代表x方向和y方向的差值,因此一般可以简写为

让微积分穿梭于工作与学习之间(10):在椭圆弧上做匀速运动,我就无能为力了

在微分学中,教材指出,对于y=f(x)这种形式的函数来说,Δy的表达式往往会很复杂。比如前面提到的arcsinx,代入到Δy中就真的很不好化简了。

让微积分穿梭于工作与学习之间(10):在椭圆弧上做匀速运动,我就无能为力了

我们要的是无限分割,所以A和B会无限靠近,而在无限靠近的过程中,AB的连线会趋于切线。

让微积分穿梭于工作与学习之间(10):在椭圆弧上做匀速运动,我就无能为力了

所以一般情况下,我们都采用微分(在一元函数很多东西跟导数等价)来代替Δ,即

让微积分穿梭于工作与学习之间(10):在椭圆弧上做匀速运动,我就无能为力了

然后,上面的这个就是被积函数的表达式了。

我们试着把它弄到椭圆的方程上(此处不考虑矩阵史诗级玩法中的那种斜椭圆什么的,偏移也不管)。

让微积分穿梭于工作与学习之间(10):在椭圆弧上做匀速运动,我就无能为力了

这是一个多值函数,一个x对应多个y,并且带着根号:

让微积分穿梭于工作与学习之间(10):在椭圆弧上做匀速运动,我就无能为力了

这样的式子拿去运算很不方便,因此我们一般都用椭圆的参数方程代替。

让微积分穿梭于工作与学习之间(10):在椭圆弧上做匀速运动,我就无能为力了

这种形式的话,dy就不用y'来化简了,而是直接对t求导。

让微积分穿梭于工作与学习之间(10):在椭圆弧上做匀速运动,我就无能为力了

我们知道,sint和cost的平方和等于1,所以我们可以化走其中一个

让微积分穿梭于工作与学习之间(10):在椭圆弧上做匀速运动,我就无能为力了

这个式子看着很复杂,其实很简单,因为a和b都是常数,常数因子在积分中可以直接提取到积分号以外,因此根号外的系数可以忽略,而cost平方的系数也是一个常数而已,我们用c来表示,这样,积分表达式看着就真的不怎么复杂了。

让微积分穿梭于工作与学习之间(10):在椭圆弧上做匀速运动,我就无能为力了

如果知道椭圆弧的起点和终点对应的t值,那么这段椭圆弧的长度就可以写成以下的定积分:

让微积分穿梭于工作与学习之间(10):在椭圆弧上做匀速运动,我就无能为力了

根据牛顿-莱布尼茨公式,我们只要把被积函数的原函数求出来即可得到结果。但是这个只要并没我想象中容易。

求原函数的常用套路往往是先用换元法去掉积分函数中的根号(除非根号内的内容恰好跟基本积分表中的公式吻合)。

比如积分表达式是sqrt(1-x)dx,那么就设t=sqrt(1-x),根号就没了,但是别忘了dx也是积分表达式的一部分,所以dx中的x也要化走。t=sqrt(1-x)的话,x就等于1-t^2,然后积分表达式就变成了td(1-t^2)=t*(-2t)*dt=-2tdt

如果积分表达式是个二次函数,比如sqrt(1-x^2)dx,还是让t等于根号的全部内容,那x就变成了sqrt(1-t^2),根号就无法去掉了。这时候要改掉换元的方法,让x=cost,那么dx=-sint,然后sqrt(1-x^2)就成了sint了。根号也被去掉了,但是已经感觉到没一次的时候轻松。

而这个地方就更蛋疼了,根号内的地方带了个三角函数,我尝试了很多方法,比如用二倍角公式降次,或者是用正余弦乘积代替平方,等等,都失败了。但我记得椭圆的周长公式是很简单的啊,不可能变成弧就求不出来了吧。

万般无奈之下,我只好求助百度,椭圆弧长,椭圆周长,椭圆弧等分,椭圆的定积分计算等等,终于发现了,原来这玩意儿是真的求不出初等函数。而那个简单的椭圆周长公式L=2πb+4(a-b),其实只是一个近似公式,而非精确式。也就是说,我那段时间的研究都给白干了。然后我也百度了椭圆匀速运动的代码,他们的实现也是近似求和,用的是抛物线法,我给了那个求助的网友,基本够他用了,抛物线法其实很容易让积分结果接近准确值,一个完整的椭圆,拆分成40段可以精确到第5位小数,就算有的区段分割次数偏多,浪费了一点点性能,但是这点损失真的可以忽略了。

在百度的过程中,我学到了一门学科,叫椭圆积分,它的诞生就是为了解决椭圆弧长的计算问题,其可以应用到其它的一些曲线(如三次贝塞尔曲线等)的长度计算中。然而这里面有很多东西我看不懂,涉及到的基础知识太多了,比如复变函数,无穷级数等等。所幸的是我有段时间为了搞懂傅里叶变换而自学了一趟关于级数的东西,因此还能勉强前进着。以后我看看要不要把椭圆积分的东西拿点出来分享给大家,毕竟这块我至今还是半吊子。

这个问题一下让我彻底认识到自己不会的东西真的太多太多了。有句话说得好,“知识是一个圆,圆内是你懂的东西,圆外是你不懂的东西,你懂的越多,就越会发现自己不懂的更多。”自此以后,我真的不敢再说自己微积分厉害了。

回到椭圆弧长的问题上,其实不管是不是椭圆,其积分表达式都带着根号。而带根号的在积分公式表中没几种可用的形式。因此我们需要去掉根号。去掉根号的难度,直接决定了这个函数的积分计算难度。一个看似简单的函数,比如本例的1+(cosx)^2,只要给它加上根号,那我们就直接挂了。所以,不能求出原函数的初等数学函数,远比能求的要多很多很多。至少求弧长的领域是这样。

下篇我要酝酿一下该写什么了。继续讲椭圆积分可能太难,所以我打算换个东西写。具体写什么正在考虑,敬请期待!