![薛定宇教授大讲堂(卷Ⅳ):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=1739295045-IWwjG1xRcWJMvcMapSOCSrlyHGFDi4ak-0-3cac0a1a014c4962eac53544452a2f4d)
多项式方程根与系数的关系满足如下的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=1739295045-yLuGlgkJKg9HhqdCClFlkJXnZBVxYpJK-0-17b10771f9bc672e6ba4e24e08cea76f)
本节侧重介绍低阶多项式方程的求根公式及其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=1739295045-YNDc65Idb3SKNTN5fRb9n1tqaaBIcuMG-0-8736cbb7efcaacfe2909fff565f98677)
由第一个方程,令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=1739295045-szO0FIBwcVOD2jE0uFHT64cuTcv7M1qr-0-a8c4e4c403e3b4266c26fc0c38e9edb4)
由最后一个方程显然可以得出
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P19_29299.jpg?sign=1739295045-lCfN86T4DvnWfLJDmQpUnk2l7xMj4AhV-0-16747273c181c8f4468e8f84c5647fc1)
两端开方,求代数平方根,再经过简单处理,则可以得出原方程的两个根:
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P19_29302.jpg?sign=1739295045-rZQPWERQixC9J8eMBwZq4C0t3LZy9X5n-0-35017ec837f7799b47e8fecfb4e49daa)
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=1739295045-wpdpC9MV0OviBzZfslksGwVUdx7ok3L8-0-f22e98085e205e203c248ed2d7e805a2)
例2-4 试利用MATLAB证实式(2-1-3)的叙述。
解 利用MATLAB进行变量替换,则可以给出下面的语句:
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P19_29313.jpg?sign=1739295045-6yYrBE7IK9NqH5YyS1gUrCvpqNj4hwKM-0-1ada9d87a39d05a6c9306d5a34123e32)
则可以立即得出结果如下,由此可以证实式(2-1-3)中的结果。
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P19_29309.jpg?sign=1739295045-a1V17TEv4yNDIWNTDnDSqD8z5Ahzcux9-0-2375d743c738fa76405aea69c7c5bbaa)
这样,变量t三个根的闭式求解公式为
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P19_29315.jpg?sign=1739295045-6FIajxQSr1SSQUiCxlPBurjOeSUnyFvw-0-287ac1b8fbd8ce96d825a8bb1e1a7339)
其中,ξ=(−1+)/2,且
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P19_29316.jpg?sign=1739295045-4A8WHOkLwuiKmiLFe28k9U9xjWFH9bu7-0-d1b557cb5c0d58583be4543e4324b45b)
不过在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=1739295045-YQnREx9lUy0wEtyhEWqoBxxQJG3PnQ0Z-0-e7aa21226d4e443dd9ea2c6bcf3e113e)
可以将方程变换成y4+py2+qy+s=0的特殊四次方程形式,其中,
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P20_29556.jpg?sign=1739295045-ayOqB818YmT7yE3q8AGacDDs43XnPalN-0-480ebb108762e15fbf37b56cd29ce9df)
由给出的特殊形式,可以将y的方程变换成下面的形式。
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P20_29558.jpg?sign=1739295045-JnrHrD5e6AL9f9ktb1V6CAh0vXzXvimq-0-62d46c8217fd82c147550b1b75268ec1)
其中,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=1739295045-Oe1hgOJBCsGvhfBzPYxuRLki3cvcB1DG-0-7a36bb4d3995f0458dfd6c57fa6122a1)
例2-6 试求解方程(s−5)4=0。
解 当然,如果以这种形式给出方程,则可以立即得出方程的四个重根,都是5。在实际应用时经常已知方程的展开形式,不知道分解的形式,如何求解呢?可以尝试MATLAB提供的roots()函数,也可以尝试新编写的roots1()函数。
![](https://epubservercos.yuewen.com/2E5615/16499866905000206/epubprivate/OEBPS/Images/Figure-P21_29564.jpg?sign=1739295045-wU3Slo4kcAj9rotjw8z0mfLHlAqwCROa-0-7d36b79ca36ef5a6c9cd61f5c09bfdf3)
可以看出,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=1739295045-JhWWY9DVl7Z1x2FQYxFiqL157jxjDrFa-0-a14eec20db15156cad6f45cc92bd6f9f)
2.1.4 高次代数方程与Abel-Ruffini定理
定义2-4 方程的代数解法是利用有限次加减乘除、整数次乘方、开方运算可以构造出来的闭式求解公式。
定理2-2(Abel–Ruffini定理) 任意系数的五次或五次以上的多项式方程是没有代数解法的。该定理又称Abel不可能性定理。
意大利数学家Paolo Ruffini(1765−1822)在1799年给出了该定理的不完全证明,挪威数学家Niels Henrik Abel在1824年给出了定理的证明。所以对一般高次多项式方程而言,只能采用数值解方法。