2.1 多项式方程的求解

多项式方程是实际应用中经常遇到的方程,本节先介绍多项式方程的数学形式,再介绍多项式方程的求解方法。


定义2-1 多项式方程的一般形式为

多项式方程根与系数的关系满足如下的Viète定理,又称Viète公式,该定理是以法国数学家François Viète(1540−1603)命名的。


定理2-1 (Viète定理)假设多项式方程的根为x1x2xn,则有

本节侧重介绍低阶多项式方程的求根公式及其MATLAB实现,并给出高阶多项式方程的Abel–Ruffini定理。

2.1.1 一次方程与二次方程

一次与二次方程都有很简单的求解公式,这里将通过例子演示一元方程与二元方程的直接求解方法。


例2-1 一次多项式方程x+c=0的解是什么?

显然,一次多项式方程的解是x=−c,不论c是何值。


例2-2 公元四至五世纪的中国古代著名的数学著作《孙子算经》曾给出了鸡兔同笼问题:“今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?”

古典数学著作中有各种各样的方法求解鸡兔同笼问题。若引入代数方程的思维,则假设鸡的个数为x1,兔的个数为x2,这样容易地列出下面的二元一次方程组:

由第一个方程,令x1=35−x2,将其带入第二个方程,有

2(35−x2)+4x2=70−2x2+4x2=70+2x2=94

立即得出x2=12,代入则可以得出x1=35−x2=23。将根代入原始方程,则可以看出误差都为零,说明得出的根是正确的。当然,求解这类方程有许多种方法,这里暂时不去探讨了。


例2-3 一元二次方程ax2+bx+c=0的求解。

古巴比伦人早在公元前1800年就开始研究这类问题,后来诸多数学家也在研究二次方程的求解方法,直到1615年出版的法国数学家François Viète的著作中,给出了一般多项式方程根与系数之间的关系,即前面给出的Viète定理。

提取方程两端的系数a,则可以得出a(x2+bx/a+c/a)=0,如果a不等于零,则探讨方程x2+bx/a+c/a=0的根就可以了。如果采用配方法,可以从底层推导一元二次方程的求解公式。

由最后一个方程显然可以得出

两端开方,求代数平方根,再经过简单处理,则可以得出原方程的两个根:

2.1.2 三次方程的解析解

三次或三次以上代数方程的求解就没有这么简单了。古巴比伦人研究过三次多项式方程。中国三国时期著名数学家刘徽在265年出版了《九章算术注》,其中描述了三次方程(cubic equations)问题。中国唐代数学家王孝通在其著作《辑古算经》中建立并求解了25个特殊三次方程。


定义2-2 三次方程的一般形式为x3+c2x2+c3x+c4=0。

为简单起见,该方程进行了首一化处理。令x=t−c2/3,则可以将三次方程变换成t3+pt+q=0的形式,其中


例2-4 试利用MATLAB证实式(2-1-3)的叙述。

利用MATLAB进行变量替换,则可以给出下面的语句:

则可以立即得出结果如下,由此可以证实式(2-1-3)中的结果。

这样,变量t三个根的闭式求解公式为

其中,ξ=(−1+)/2,且

不过在MATLAB实际计算中,由上式独立计算uv的值有时会出现错误,因为开方运算解是不唯一的。为准确计算uv值,可以考虑先计算u,再用Viète定理计算v的值,v=−p/(3u)。

当然,有一种特殊情况必须考虑,就是当u=0时,v=0,这时方程的三重根为x=−c2/3。

将得出的t代入x=t−c2/3,可以得出方程的三个根。这个闭式解公式是意大利数学家Gerolamo Cardano在1545年提出的。

2.1.3 四次方程的解析解

一般四次方程(quartic equation)可以先经过特殊的变量替换转换成特殊形式的四次方程,最后给出闭式求解公式。


定义2-3 四次方程的一般形式为x4+c2x3+c3x2+c4x+c5=0。


例2-5 对一般四次方程,若令x=y−c2/4,则原方程会变换成什么形式?

利用下面的语句可以进行方程的变换。

可以将方程变换成y4+py2+qy+s=0的特殊四次方程形式,其中,

由给出的特殊形式,可以将y的方程变换成下面的形式。

其中,m为三次方程8m3+8pm2+(2p2−8s)m−q2=0的根。这个算法是意大利数学家Lodovico de Ferrari提出的。当然,这样做的前提是=0。如果m=0,则意味着q=0,这样y的方程可以写成y4+py2+s=0,易于求解y2,再求出y。有了y,则可以由变换表达式求出相应的x

MATLAB提供的roots()函数是基于矩阵特征值计算的多项式方程求解函数,具体的调用格式为r=roots(p),其中,p为降幂排列的多项式系数向量,r为方程的数值解,为列向量。

该函数在求解有重根方程时经常被诟病,因为得出的根误差比较大。综合考虑上面给出的低次方程求解算法,可以编写出roots()函数的替代函数,该函数有望得出精确的低次方程的数值解,而方程阶次高于4时自动嵌入MATLAB的原始roots()函数,得出方程根的数值解。


例2-6 试求解方程(s−5)4=0。

当然,如果以这种形式给出方程,则可以立即得出方程的四个重根,都是5。在实际应用时经常已知方程的展开形式,不知道分解的形式,如何求解呢?可以尝试MATLAB提供的roots()函数,也可以尝试新编写的roots1()函数。

可以看出,roots1()函数得出所期望的四重根s=5,而roots()函数得出的结果为5.0010,5±0.001j,4.9990,可以看出,方程有重根时MATLAB函数数值求解有较大的误差,在双精度数据结构下,用其他数值算法也有同样的问题,在实际应用中可能引起麻烦。代入原方程后,e1=2.1690×1012e2=0。通过上面演示还可以看出,利用符号运算总能得出正确的结果。


例2-7 试在双精度框架下求解复系数多项式方程并评价精度。

f(s)=s4+(5+3j)s3+(6+12j)s2−(2−14j)s−(4−4j)=0

到现在为止介绍了两个多项式方程的数值求解函数roots()和roots1(),其实,构造原方程时,是假设方程的三重根为−1+1j,还有一个实数根−2。现在可以由下面的语句直接求解,得出结果后与已知根的解析解相比,可见,roots()函数得出的根的误差范数为3.5296×105,而roots1()函数的误差范数为0,说明这里给出的方程的解是精确的,roots1()函数同样适合求解复系数多项式方程。

2.1.4 高次代数方程与Abel-Ruffini定理


定义2-4 方程的代数解法是利用有限次加减乘除、整数次乘方、开方运算可以构造出来的闭式求解公式。


定理2-2(Abel–Ruffini定理) 任意系数的五次或五次以上的多项式方程是没有代数解法的。该定理又称Abel不可能性定理。


意大利数学家Paolo Ruffini(1765−1822)在1799年给出了该定理的不完全证明,挪威数学家Niels Henrik Abel在1824年给出了定理的证明。所以对一般高次多项式方程而言,只能采用数值解方法。