- 薛定宇教授大講堂(卷Ⅳ):MATLAB最優化計算
- 薛定宇
- 2262字
- 2020-04-24 14:21:29
2.1 多項式方程的求解
多項式方程是實際應用中經常遇到的方程,本節先介紹多項式方程的數學形式,再介紹多項式方程的求解方法。
定義2-1 多項式方程的一般形式為

多項式方程根與系數的關系滿足如下的Viète定理,又稱Viète公式,該定理是以法國數學家Fran?ois Viète(1540?1603)命名的。
定理2-1 (Viète定理)假設多項式方程的根為x1,x2,…,xn,則有

本節側重介紹低階多項式方程的求根公式及其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實際計算中,由上式獨立計算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,則原方程會變換成什么形式?
解 利用下面的語句可以進行方程的變換。

可以將方程變換成y4+py2+qy+s=0的特殊四次方程形式,其中,

由給出的特殊形式,可以將y的方程變換成下面的形式。

其中,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()函數,得出方程根的數值解。

例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×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()函數同樣適合求解復系數多項式方程。

2.1.4 高次代數方程與Abel-Ruffini定理
定義2-4 方程的代數解法是利用有限次加減乘除、整數次乘方、開方運算可以構造出來的閉式求解公式。
定理2-2(Abel–Ruffini定理) 任意系數的五次或五次以上的多項式方程是沒有代數解法的。該定理又稱Abel不可能性定理。
意大利數學家Paolo Ruffini(1765?1822)在1799年給出了該定理的不完全證明,挪威數學家Niels Henrik Abel在1824年給出了定理的證明。所以對一般高次多項式方程而言,只能采用數值解方法。
- Java程序設計(慕課版)
- LabVIEW 2018 虛擬儀器程序設計
- TypeScript入門與實戰
- 測試驅動開發:入門、實戰與進階
- PowerCLI Cookbook
- VSTO開發入門教程
- CoffeeScript Application Development Cookbook
- Orleans:構建高性能分布式Actor服務
- RESTful Web Clients:基于超媒體的可復用客戶端
- 零基礎學HTML+CSS第2版
- 深入解析Java編譯器:源碼剖析與實例詳解
- IPython Interactive Computing and Visualization Cookbook
- 金融商業數據分析:基于Python和SAS
- Learning WordPress REST API
- Python趣味創意編程