让微积分穿梭于工作与学习之间(23):用极限的思想把一元一次方程和一元二次方程的根式解统一起来

写这篇博客最浪费时间的地方是标题。之前打算照着前面圆弧直线系列的那种句式,题名为“一元二次方程的根式解及其二次项系数在趋于0时的极限”,但想想上一篇很容易把大家看晕,就还是别取这标题了,免得吓坏更多的人。

前面先说一下,这篇是为后续的圆弧直线的一些算法打个基础。

从上小学开始,我就在数学课上听到一些从特殊到一般或者从一般到特殊的命题,诸如“正方形是长宽相等的长方形”,“等边三角形是特殊的等腰三角形”,“圆是离心率等于0的椭圆”等等。它们之间的很多性质和公式都相互通用,从而为一些问题的讨论提供了相当多的便利。

然后在我学一元二次方程的时候,我心里就萌生了一个类似的命题:一元一次方程是二次项系数等于0的一元二次方程。然后我就尝试着去探讨一次方程和二次方程的关系,并且希望可以用同一套求根公式进行求解,从而有效简化与此相关的一些问题。

首先从一元一次方程是无法简单演化到二次的,因为这个过程增加了新的项,而从二次到一次仅仅为系数的特殊化。所以我们先来看一元二次方程的根式解。

一元二次方程

让微积分穿梭于工作与学习之间(23):用极限的思想把一元一次方程和一元二次方程的根式解统一起来

的根式解相信大家都很熟悉了

让微积分穿梭于工作与学习之间(23):用极限的思想把一元一次方程和一元二次方程的根式解统一起来

让微积分穿梭于工作与学习之间(23):用极限的思想把一元一次方程和一元二次方程的根式解统一起来

当时学完这个公式之后我就在想,如果让a=0,方程就变成一元一次方程了

让微积分穿梭于工作与学习之间(23):用极限的思想把一元一次方程和一元二次方程的根式解统一起来

那不就一条公式通吃一次和二次么?

然而很可惜,a=0时,分母为0,算不出结果来。直到我学了极限,卡着我好几年的这个问题终于可以继续了。

一开始我还是觉得不太可能的,因为从二次到一次,根的数量少了一个,但是算极限的过程并没有把二次方程的根给去掉。

不过既然有了想法,那就尝试吧,a不能等于0,但我们可以让a趋于0,先看x1,我们对a取极限

让微积分穿梭于工作与学习之间(23):用极限的思想把一元一次方程和一元二次方程的根式解统一起来

此处除了a以外,其它都是常量。然后我们可以用洛必达法则上下求导得到极限,也可以用中学学的一些简单套路,分子凑平方差去根号。我更倾向于后者,主要是洛必达法则有点死,而且懂的人也没那么多,不好装逼。

好了,我们继续。

让微积分穿梭于工作与学习之间(23):用极限的思想把一元一次方程和一元二次方程的根式解统一起来

带着绝对值号去不掉了,然后我们把x2也取下极限

让微积分穿梭于工作与学习之间(23):用极限的思想把一元一次方程和一元二次方程的根式解统一起来

所以当a趋于0时,有

让微积分穿梭于工作与学习之间(23):用极限的思想把一元一次方程和一元二次方程的根式解统一起来

变成一次方程后,方程依然有两个解。但是如果我们尝试让b>0或者b<0去代入,会发现总有一个解的分母为0。

让微积分穿梭于工作与学习之间(23):用极限的思想把一元一次方程和一元二次方程的根式解统一起来

让微积分穿梭于工作与学习之间(23):用极限的思想把一元一次方程和一元二次方程的根式解统一起来

 

可见不管b是大于0还是小于0,两个解都是一样的,一个是无穷大(c=0就是无意义),需要去掉,而另一个则是-c/b,这跟一元一次方程

让微积分穿梭于工作与学习之间(23):用极限的思想把一元一次方程和一元二次方程的根式解统一起来

的解刚好一样。

如果b也等于0,那么方程就成了c=0,就成了要么无解(c≠0),要么有无穷多个解(c=0)了。二次方程取极限的式子对于这种情况依然适用。

现在我们把一元二次方程根式解取极限之前的结果取出来。

让微积分穿梭于工作与学习之间(23):用极限的思想把一元一次方程和一元二次方程的根式解统一起来

有没有一次方程的时候出现根号内的判别式小于0的情况呢?答案是没有,因为此时a=0,根号内的部分成了b的平方,一定能求出实数解。

总结起来,不管是一元二次方程还是一元一次方程,都可以用以下公式进行求解:

让微积分穿梭于工作与学习之间(23):用极限的思想把一元一次方程和一元二次方程的根式解统一起来

求出来的根是否有效,看分母是否为0即可(delta<0视作虚根)。

至此我用了非常完美的一条公式把一元一次方程和一元二次方程给统一起来,感兴趣的读者甚至可以把目前数学界能求出根式解的最高次方程——4次方程给逐层取极限,得到一条通吃4种次数的公式。反正我是没这勇气了,毕竟3次和4次还要分情况讨论。

然而,最后我要很不幸地告诉大家,这条公式我不敢在我们公司的项目里面使用。原因在于我们项目对精度要求特别高,而且我们用得最多的是水平线和竖直线,很多地方都喜欢去贴边,对0.00000001甚至更小的误差都会很敏感。

而这种经过变换的公式很容易在运算过程中产生轻微的误差,在水平竖直线的贴边问题上就会因为这些误差导致各种误判然后产生各种莫名其妙的bug。

如果你们的项目对精度要求跟我们的项目一样甚至更高,那还是乖乖地把一次和二次区分开来吧。如果是精度要求不太高的,比如游戏的碰撞检测,运动轨迹的控制等等就可以用我本文最后给出来的公式把一次和二次方程给统一起来。