如何解高次方程:一种创新的数值逼近方法
如何解高次方程:一种创新的数值逼近方法
最近,我发现了一个有趣的现象:很多人都喜欢解方程,但是一遇到高次方程,就很难解出来。通常,大家都会执着于找出一个根式解,即找出一个公式解。但是,我想尝试一种不同的方法:放弃寻找公式解,转而采用分步求解的方式。
考虑一个五次方程(方程1):
这是一个拥有三个根的5次方程。我们的目标是求出它与x轴交点的横坐标。
观察方程的图像,我们可以注意到,方程的根一定存在于拐点和拐点之间,或者拐点和正/负无穷的区间上。但是,这并不意味着拐点和拐点之间,或者拐点和正/负无穷的区间上一定有根。
为了确定根的范围,我们首先对方程1求导,得到方程2,目的是找出其中拐点的位置:
这是一个4次方程,虽然求解起来比较困难,但仍然符合我们刚才发现的规律。因此,我们再次对它求导,得到方程3:
这是一个三次方程,求解起来依然有难度。于是,我们再次求导,得到方程4:
这次我们发现方程变得容易求解了!求得两根:-0.4和0。这些拐点对应了方程3中可能含有根的区间。
接下来,我们需要一种高效、准确的方法来确定区间内是否有根。考虑到在每一个区间内使用牛顿迭代法可能会收敛到错误的地方,或者在没有根的区间内浪费算力,我们需要一种能够准确判断区间内是否有根的算法。
首先,我们来判断方程3在不同区间内的根:
- 区间[-∞, -0.4]:方程在负无穷处的极限为负无穷,在-0.4处的值为-6.78667,同号,无根
- 区间[-0.4, 0]:方程在-0.4的值为-6.78667,在0处的值为-7,同号,无根
- 区间[0, ∞]:方程在0处的值为-7,在正无穷处的极限为正无穷,异号,有根
已经找出了有根的区间,接下来确定根的位置。注意到开区间内方程(函数)的走势为严格单调递增,可以应用牛顿迭代。如果能够获取区间内另一个异号点(异号的函数值点)的话,则可以应用以下算法:
- 取区间中值,根据函数走势判断根在中值点左边还是右边
- 判断完成后再取新区间中值
- 重复,直到区间长度小于允许的误差范围,或者取到的中值接近于零,在可以容忍的误差范围内
应用此方法,求解出方程3的解为0.85074。这意味着对于方程2,只有一个拐点,并且只有两个可疑的区间了:
- 区间[-∞, 0.85074]
- 区间[0.85074, ∞]
检查这两个区间的根:
- 函数在负无穷处的极限为正无穷,在拐点处为-9.26116
- 函数在正无穷处的极限为正无穷,在拐点处为-9.29116
都是异号,则有两个根,分别在(-∞, 0.85074)和(0.85074, ∞)区间内。任取一点应用牛顿迭代或者注意到当x=2和x=-2时为正,则应用刚才的算法,最终求得两根:-0.72132和1.59394。
接下来,可以对方程1求根了。三个可疑的区间:
- [-∞, -0.72312]
- [-0.73212, 1.59394]
- [1.59394, ∞]
开始检查:
- lim x->-∞ equation(x) = -∞, equation(-0.72312) = 6.81096, true
- equation(-0.72312) = 6.81096, equation(1.59394) = -6.28077, true
- equation(1.59394) = -6.28077, lim x->∞ equation(x) = ∞, true
发现三个区间都有根,那么:
- 注意到x = -2,函数值为-4.3333…,那么对于[-2, -0.72312]应用区间中值算法,求得-1.79189
- 对于[-0.73212, 1.59394]应用区间中值算法,求得0.69126
- 注意到x = 3,函数值为66.5,那么应用区间中值算法,求得2.13196
至此,方程得解。
这种方法通过应用介值定理判断根是否存在,利用了正整数次幂函数处处连续可导的特性,并通过高阶导数求根辅助低阶导数求根这种递进的方式求得最终的根,甚至可以对原方程积分,求出更高次方程的拐点和根。