![薛定宇教授大讲堂(卷Ⅳ):MATLAB最优化计算](https://wfqqreader-1252317822.image.myqcloud.com/cover/152/29977152/b_29977152.jpg)
2.1 多项式方程的求解
多项式方程是实际应用中经常遇到的方程,本节先介绍多项式方程的数学形式,再介绍多项式方程的求解方法。
定义2-1 多项式方程的一般形式为
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P17_29284.jpg?sign=1739288610-Otya6WdUyUYT6NsSYEUBNuuvU10EywRm-0-154a0a1cbe2702ea82c0b5e85a25ab7f)
多项式方程根与系数的关系满足如下的Viète定理,又称Viète公式,该定理是以法国数学家François Viète(1540−1603)命名的。
定理2-1 (Viète定理)假设多项式方程的根为x1,x2,…,xn,则有
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P18_29287.jpg?sign=1739288610-roT9FCOzms4xs0upWweJWSRbzSpyHRyd-0-0052de5ff9ce33e1d27d879383773276)
本节侧重介绍低阶多项式方程的求根公式及其MATLAB实现,并给出高阶多项式方程的Abel–Ruffini定理。
2.1.1 一次方程与二次方程
一次与二次方程都有很简单的求解公式,这里将通过例子演示一元方程与二元方程的直接求解方法。
例2-1 一次多项式方程x+c=0的解是什么?
解 显然,一次多项式方程的解是x=−c,不论c是何值。
例2-2 公元四至五世纪的中国古代著名的数学著作《孙子算经》曾给出了鸡兔同笼问题:“今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?”
解 古典数学著作中有各种各样的方法求解鸡兔同笼问题。若引入代数方程的思维,则假设鸡的个数为x1,兔的个数为x2,这样容易地列出下面的二元一次方程组:
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P18_29291.jpg?sign=1739288610-TbhEhnkVOU4CYw1ABiifWyTdAnhBRwvQ-0-b465e95e969b3c5c9c1f8e31cf9f30a5)
由第一个方程,令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的根就可以了。如果采用配方法,可以从底层推导一元二次方程的求解公式。
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P19_29296.jpg?sign=1739288610-qCou0ojluzYxVHfz4Y83A3gk8RGY6ByR-0-8f7b79e15fdd034a742d48d0b679b4ce)
由最后一个方程显然可以得出
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P19_29299.jpg?sign=1739288610-FZYr7mej9g0B0a72u6L0t2DbBxGc2gRA-0-a5ff1a2dc6eec900482a44bf0214ca4c)
两端开方,求代数平方根,再经过简单处理,则可以得出原方程的两个根:
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P19_29302.jpg?sign=1739288610-LJPNS3ANEmYgyxficOGZ8NB2QrqJXBAX-0-aeda70a183396a080e8382f128f9a041)
2.1.2 三次方程的解析解
三次或三次以上代数方程的求解就没有这么简单了。古巴比伦人研究过三次多项式方程。中国三国时期著名数学家刘徽在265年出版了《九章算术注》,其中描述了三次方程(cubic equations)问题。中国唐代数学家王孝通在其著作《辑古算经》中建立并求解了25个特殊三次方程。
定义2-2 三次方程的一般形式为x3+c2x2+c3x+c4=0。
为简单起见,该方程进行了首一化处理。令x=t−c2/3,则可以将三次方程变换成t3+pt+q=0的形式,其中
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P19_29307.jpg?sign=1739288610-e6ZUcCGGCg0NN2aqgyA4vDFZCKzU7nQ8-0-e3eb1577eeccd0d9cf419dbaa5055ae0)
例2-4 试利用MATLAB证实式(2-1-3)的叙述。
解 利用MATLAB进行变量替换,则可以给出下面的语句:
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P19_29313.jpg?sign=1739288610-gvWk2tig12HORNelFxHTYekCKNLNenTp-0-0c2161f502b2a5d1007b3cb54190a498)
则可以立即得出结果如下,由此可以证实式(2-1-3)中的结果。
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P19_29309.jpg?sign=1739288610-5iTLzy7NcEs0678exylQjR64wpdzEOlX-0-8cf7c574624a3d207d243db5eddae938)
这样,变量t三个根的闭式求解公式为
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P19_29315.jpg?sign=1739288610-RaG4KkeCbpk5MZzutr17CUDstg35LKRZ-0-9009048c964dd30f576bfccb6f7e0f1c)
其中,ξ=(−1+)/2,且
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P19_29316.jpg?sign=1739288610-akoZNAfND9nZ2uv7sNVWaA2gK0gz8aNM-0-db3a1574d180981b0747f0c041b2087d)
不过在MATLAB实际计算中,由上式独立计算u和v的值有时会出现错误,因为开方运算解是不唯一的。为准确计算u和v值,可以考虑先计算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,则原方程会变换成什么形式?
解 利用下面的语句可以进行方程的变换。
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P20_29554.jpg?sign=1739288610-Xqj8MiMa68chbgA09n8w5i0Lo8tfWWKH-0-a57172b50a5c908b2e79e547df4a6500)
可以将方程变换成y4+py2+qy+s=0的特殊四次方程形式,其中,
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P20_29556.jpg?sign=1739288610-SENqS4LaXz3PLRC0RGMU4JMRP02PlToL-0-67d6f4d81a9c81acd7decb61c1a30ccf)
由给出的特殊形式,可以将y的方程变换成下面的形式。
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P20_29558.jpg?sign=1739288610-hxxglx8FnrED4dwfwOrJz2iDngaF3GGF-0-23936e60028dbde99d435073d52b2167)
其中,m为三次方程8m3+8pm2+(2p2−8s)m−q2=0的根。这个算法是意大利数学家Lodovico de Ferrari提出的。当然,这样做的前提是m̸=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()函数,得出方程根的数值解。
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P21_29562.jpg?sign=1739288610-8kln5qxY3N0tjg2RKnAKTRDbZjE4QWD5-0-ab12fc7abd5cd97325de98bbaecbabb8)
例2-6 试求解方程(s−5)4=0。
解 当然,如果以这种形式给出方程,则可以立即得出方程的四个重根,都是5。在实际应用时经常已知方程的展开形式,不知道分解的形式,如何求解呢?可以尝试MATLAB提供的roots()函数,也可以尝试新编写的roots1()函数。
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P21_29564.jpg?sign=1739288610-YUJsSFDh7jBStvhDF4ysYUBuDveGnSck-0-c48012a7b30379370cd438e9afd5c13e)
可以看出,roots1()函数得出所期望的四重根s=5,而roots()函数得出的结果为5.0010,5±0.001j,4.9990,可以看出,方程有重根时MATLAB函数数值求解有较大的误差,在双精度数据结构下,用其他数值算法也有同样的问题,在实际应用中可能引起麻烦。代入原方程后,e1=2.1690×10−12,e2=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×10−5,而roots1()函数的误差范数为0,说明这里给出的方程的解是精确的,roots1()函数同样适合求解复系数多项式方程。
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P22_29570.jpg?sign=1739288610-xaE6iLWvBoSW7IEiNXJ5IZ86oRaGthKh-0-792185643cfea0f5724429b39ffa6132)
2.1.4 高次代数方程与Abel-Ruffini定理
定义2-4 方程的代数解法是利用有限次加减乘除、整数次乘方、开方运算可以构造出来的闭式求解公式。
定理2-2(Abel–Ruffini定理) 任意系数的五次或五次以上的多项式方程是没有代数解法的。该定理又称Abel不可能性定理。
意大利数学家Paolo Ruffini(1765−1822)在1799年给出了该定理的不完全证明,挪威数学家Niels Henrik Abel在1824年给出了定理的证明。所以对一般高次多项式方程而言,只能采用数值解方法。