用 Mathematica 求解多項式

2021-02-20 WOLFRAM

█ 本文譯自 Bill Gosper 在 Wolfram 社區發表的熱點文章:Solving polynomials

多項式是由一組常數係數,a、b、c、……(數值)確定的。

TableForm[{a x + b, a x^2 + b x + c, a x^3 + b x^2 + c x + d, ". . ."}] // TraditionalForm

多項式求解問題就是找到一個值 x,使這些項的總和等於 0. 根據 x 的最高次數分別稱為線性、二次、三次、四次、五次、六次、七次、八次. 多項式。我們稱 y = a x + b 為線性,是因為它的圖線是一條直線. 比如令 a = 2,b = 3,

Plot[2 x + 3, {x, -2, 1}]

2 x + 3 = 0 的(唯一)解是 x = -3/2. 一般情況下,有 x = -b/a. 由於含有 x 的平方項,y = a x^2 + b x + c 是二次的. 你會記得一元二次方程有兩個通解:

Solve[a x^2 + b x + c == 0, x]

這樣的表達式被稱為不盡根式. 最常見的應用是在幾何上. 圓、拋物線和雙曲線通常由二次多項式指定。當我們想知道一個二次多項式與已知直線何時相交時,我們就得到一個二次方程. 這甚至發生在 雙曲線是矩形的,例如:

Plot[{(1 - x)/(x + 2), 2 x + 3}, {x, -4, 1}, PlotRange -> {{-4, 1}, {-6, 6}}, AspectRatio -> 4/5]

表示雙曲線的分支與直線相交的方程為

(1 - x)/(x + 2) == 2 x + 3;

要得到形如 x^2 + b x + c ==0  的方程,需要兩邊同時乘以 x + 2,

Distribute[(x + 2)*%, Equal]

1 - x == (2 + x) (3 + 2 x)

再兩邊同時減去(2 + x) (3 + 2 x),

(2 + x) (3 + 2 x) - # & /@ %

-1 + x + (2 + x) (3 + 2 x) == 0

然後展開:

Expand@%

5 + 8 x + 2 x^2 == 0

因為 Mathematica 不是使用傳統的方法處理方程,"兩邊同時減去"這一步需要解釋一下. 它使用 & 定義了一個函數,從 (2 + x) (3 + 2 x)減去(#),然後"映射" ( /@ ) 到等式兩邊.

不管怎樣,求解二次方程:

Solve[%]

{{x -> 1/2 (-4 - Sqrt[6])}, {x -> 1/2 (-4 + Sqrt[6])}}

或者近似

N@%

{{x -> -3.22474}, {x -> -0.775255}}

當然,Mathematica 非常樂意直接求解:

Solve[(1 - x)/(x + 2) == 2 x + 3]

{{x -> 1/2 (-4 - Sqrt[6])}, {x -> 1/2 (-4 + Sqrt[6])}}

我們可以把這些值作為繪圖範圍

Flatten[% /. Rule -> List]

{x, 1/2 (-4 - Sqrt[6]), x, 1/2 (-4 + Sqrt[6])}

來直觀地檢查合理性:

Plot[{(1 - x)/(x + 2), 2 x + 3}, %[[{1, 2, 4}]]]

該圖形以交點作為起點和終點. ( {1, 2, 4} 是為了去除額外的 x.)

要是雙曲線是顛倒的,貌似就沒解了:

Plot[{(x - 1)/(x + 2), 2 x + 3}, {x, -4, 1}, PlotRange -> {{-4, 1}, {-6, 6}},
AspectRatio -> 4/5]

但 Mathematica 很聰明,它給的結果不是{},而是

Solve[(x - 1)/(x + 2) == 2 x + 3]

{{x -> 1/2 (-3 - I Sqrt[5])}, {x -> 1/2 (-3 + I Sqrt[5])}}

也就是說,解含有虛數. 二次方程是通過配方法來求解的,兩邊同時加上b^2/4a-c:

# + b^2/(4 a) - c & /@ (a x^2 + b x + c == 0)

b^2/(4 a) + b x + a x^2 == b^2/(4 a) - c

然後左邊配成平方除以4a:

Factor /@ %

(b + 2 a x)^2/(4 a) == -((-b^2 + 4 a c)/(4 a))

然後乘以 4a 後

4 a # & /@ %

(b + 2 a x)^2 == b^2 - 4 a c

我們可以取兩邊的平方根.

Sqrt /@ % // PowerExpand

b + 2 a x == Sqrt[b^2 - 4 a c]

現在它變成了一個線性方程. PowerExpand 強制 Mathematica 選擇 b + 2 a x,而不是 - b - 2 a x 作為平方的方根.

正如"每個人"都記著二次方程的解,"沒有人"記得三次方程的解。原因是:

Solve[ a x^3 + b x^2 + c x + d == 0, x] // TraditionalForm

現在考慮一個簡單情形:

Plot[x^3 - x + 1/3, {x, -3/2, 3/2}]

顯然它有三個實根,在 - 1.1, .35, 和 .75 附近. 具體是多少呢?

Solve[x^3 - x + 1/3 == 0]

嘿,等一下,根不是實數嗎?是不是 Mathematica 忘了化簡了?

Simplify@%%

這麼複雜的式子怎麼會是實數呢?讓我們看一下虛部:

ComplexExpand@Im[x /. %]

{0, 0, 0}

那好吧,老天爺,告訴我們實部是啥吧!

ComplexExpand@Re[x /. %%]

三角函數?!還不如平方根和立方根呢!

Developer`TrigToRadicals@%%

天啊!那些三角函數是實數,但為啥這裡卻跟著一堆虛數單位?- 1.1、.35 和 .75 在哪呢??請給出數來.

N@%

{0.742227 + 0. I, 0.394931 + 0. I, -1.13716 + 0. I}

它們就在那,但這些 0. i 是怎麼回事?奇怪的是,它們是不可避免的. 作為一個數學分支的伽羅瓦理論已經證明,不含虛數立方根的解式是不存在的,即使它們的加和為實數.

Henry Baker 的動畫(本文頂部可以看到實際動畫)展示了均為實數的三個根之間的關係:

這是張一般情況下的圖片——三個實根的三次方程有一個拐點,它們關於拐點對稱. 如果將拐點平移到原點,則會得到一個奇函數  f(-x )= -f(x).

四次方程可以通過將兩條曲線相交得到. 一般情況下的四次方程會讓人有點抓狂,如果不怕的話就按住 shift return 鍵試試吧.

Solve[ a x^4 + b x^3 + c x^2 + d x + e == 0, x]

求解五次方程就更是不要命了.

Solve[ a x^5 + b x^4 + c x^3 + d x^2 + e x + f == 0, x]

哈哈,Mathematica 放了我們一馬,結果被剪切了,但為什麼不至少提供一下互動大型表達式瀏覽器呢?因為它不能. 不存在一般五次方程的根表達式. 顯然,通過因式分解我們可以求解某些五次方程.

Expand@# == # &[(x^2 + 1) (x^3 - x - 1)]

-1 - x - x^2 + x^5 == (1 + x^2) (-1 - x + x^3)

歷經幾個世紀的挫敗,求解五次方程已經與三等分角和倍立方問題一樣成為困擾人們的幾大數學難題。

許多人錯誤地認為唯一可解的五次方程要麼是可因式分解的,要麼是顯而易見的,如(x + a)^ 5 + b = 0. 但只有一小部分,接近0%,可以巧妙地解決,比如:

x^5 - 5 x^2 - 3 == 0

它的根相當繁瑣. 唯一的實根是


至少從外觀看來是實數. 平凡的 Mathematica 無法求解——連驗證都不行!只能近似:

%^5 - 5`69 %^2

3.0000000000000000000000000000000000000000000000000000000000000000000

我曾經(正確地?)說服自己,每個可求解的六次方程都可以降次到具有二次不盡根係數的三次方程或具有三次不盡根係數的二次方程. 但誰會想要求解這樣一個方程呢?幾何再次派上用場了. 問題:將一個正方形拆分成有限個銳角、等腰三角形. 可以用十個:

確定 Subscript[x, 1]、Subscript[y, 1]、Subscript[x, 2] 和 Subscript[r, 3] 的方程是12次的!這些方程可以通過因式分解降為具有不盡根係數的六次方程,但專家 Noam Elkies 認為這是不可求解的. 然而當次數為6、8、9、……或任何複合數(或稱非質數)時,有時候會比較幸運.

Factor[5 + 4 x^2 - 4 x^3 + x^4 - 2 x^5 + x^6]

5 + 4 x^2 - 4 x^3 + x^4 - 2 x^5 + x^6

不能進行因式分解. 然而

Solve[% == 0]

可以求得所有六個解!怎麼實現呢?這個六次方程可以寫作

x^2 - 4 x + 5 /. x -> x^3 - x^2

5 - 4 (-x^2 + x^3) + (-x^2 + x^3)^2

Factor@%

5 + 4 x^2 - 4 x^3 + x^4 - 2 x^5 + x^6

也就是說,將三次方程替換為二次方程。如果我們注意到這一點,我們只是用y來代替 x ^ 3 - x ^ 2 - 2 ,對得到的二次方程求 y,然後求解關於 x 的三次方程,用 y 表示。我們是怎麼注意到這一點的?用魔法函數

Decompose[5 + 4 x^2 - 4 x^3 + x^4 - 2 x^5 + x^6, x]

{5 - 4 x + x^2, -x^2 + x^3}

這正好是 Solve 函數所了解的. 知道嗎?你的八次方程可能只是三個二次方程的組合.

但請注意:這個六次方程的解,既不能因式分解


5 + 18 x + 36 x^2 + 36 x^6

也不能正常分解.


{570630428688384000000 + 4891824455002619904 x +    161093791317491712

x^2 + 12153384861696 x^3 + 984379392 x^4 -    17280 x^5 + x^6}

Simplify[% /. x -> %%]

{0}

所以括號中的數量滿足最小次數為36的最小多項式!

令人驚奇的是,這是一個甚至連 Mathematica 第11版都不知道的訣竅:如果係數形成回文,六次甚至八次方程總是可以求解!例如,

Solve[1 + x + x x - x^3 + x^4 + x^5 + x^6 == 0]

(失敗。)但是我們可以對付完全一般的情況! 對於任意a,b,c,d,假設 x 滿足互反多項式(所以被稱作回文式)

a x^6 + b x^5 + c x^4 + d x^3 + c x x + b x + a

a + b x + c x^2 + d x^3 + c x^4 + b x^5 + a x^6

現在假設 y = x + 1/x (或寫作 x y = x^2 + 1),求六次多項式除以這個二次多項式(關於 x)的餘式:

Factor[PolynomialRemainder[%, x + 1/x - y, x]]

(-x - y + x y^2) (-2 b + d - 3 a y + c y + b y^2 + a y^3)

求這個餘式意味著減去二次式的倍數,使得六次多項式將簡化為關於 x 的線性多項式. 但是我們假定了二次和六次多項式都是0,所以我們從0減去0,得到x和y之間的可疑關係, 乘以我們可以求解的 y 的三次式! 通過 y = x + 1 / x 來求解x.

回文多項式被稱作互逆多項式的原因是,如果用 1/x 代替 x,兩者具有相同的根,從而將係數的次序逆轉(並除以 x^6).

這個令 y = x + 1/x 的技巧可以成功的關鍵是我們可以將各項用它們的倒數匹配,並利用關係:

1/x^3 + x^3 == -3 (1/x + x) + (1/x + x)^3

1/x^2 + x^2 == -2 + (1/x + x)^2

朱利安和我有一個七次方程求解程序,但他不相信它能找到所有的解. 超過七次以後,能找到一個強有力的求解器機會會大大減小,TA在理論上可以求解的概率也是如此. 但是如果你的問題不是隨機組成的,那麼總是值得一試.

相關文章

Wolfram 語言和 Mathematica 11.2 上線了

Wolfram|Alpha 橫掃全國各科高考試題

用 Mathematica 生成正多面體環

Wolfram語言新功能:增強的求導功能

相關焦點

  • 多項式與等比數列乘積的前n項和的求解思路
    雖然這兩種數列是最簡單、最基礎的數列,但從其前n項和的推導過程中,我們能夠學習和借鑑到其中的方法,下面我將演示利用錯位相減法求解更複雜的數列的前n項和。複雜數列構造及求解例如,定義這樣一種數列c,它的通項公式可寫成等差數列第n項和等比數列第n項乘積的形式。我們如何求解數列c的前n項和表達式?
  • 今晚8點|用 Mathematica 求解偏微分方程的符號和數值解
    更多 Wolfram 樹莓派諮詢:https://www.wolfram.com/raspberry-pi/因為這是實用動手講座,建議參加者安裝        Wolfram Mathematica(https://www.wolfram.com/mathematica/trial/)        和 System Modeler(https://www.wolfram.com
  • 多項式計算與因式分解
    多項式是由未知變量和數字進行四則運算組成的表達式,是代數中最基本的概念。未知變量可以是一個,也可以是多個,如果包含n個未知變量,那麼多項式就是n元的。知識的學習總是由簡到繁,多項式最簡單的就是一元的了,我們先看一元多項式。
  • 求解微分方程,用seq2seq就夠了,性能遠超 Mathematica、Matlab
    給定n 個運算子的表達式,通過計算機代數系統求解出該表達式的積分;如果不能求解,則將該表達式丟棄。顯然這種方式獲得的數據集只是問題空間的一個子集,也即只包含符號框架可以求解的函數積分;且求積分的過程往往是非常耗時的。Backward generation(BWD)。求微分是容易的。
  • 一個微積分的應用實例,用多項式轉換一個函數,並求它的特殊值
    停止討論它的速度有多快,我們來描述一下,在一個時間段內,怎麼樣用N重加速度(N階導數)來重塑它的位移公式?假設,從時間點t開始,到時間點x結束。位移S=f(x)-f(t)。把位移S分解成N份,得其中:S1是t點的初始速度f'(t)完成的,它的微分是f'(t)*△x,我們把△x寫成(x-t)/n。
  • 用多項式來表示布爾邏輯
    關注 哆嗒數學網 每天獲得更多數學趣文問題:用一些多項式來表示布爾邏輯表達式。即:若每個輸入變量x取值為0(對應於假)或1(對應於真)。則一般地,對應的多項式的輸出值應根據表達式的真假而分別為1或0。解答:只需一個多項式。
  • 一元線性回歸的求解
    1 最小二乘法及代數求解最小二乘法中的「二乘」代表平方,最小二乘也就是最小平方。
  • 勒讓德多項式的5個遞推公式
    為整數時,勒讓德方程的一個特解叫做勒讓德多項式勒讓德多項式有一種微分形式叫做羅德裡格斯(Rodriguez)公式:勒讓德多項式具有很多重要的性質,比如正交性:通常稱 在應用勒讓德多項式解決數學物理方程的定解問題時,常常需要將給定區間
  • 求解二次方程的新方法
    從中學的數學課堂上,我們知道尋找二次方程的根方法無外乎因式分解,或者配方法,再或者跳去求解過程,直接代入求根公式中。從某種意義上說,以上說的這些方法算不上不同方法,因為求根公式本就是通過配方法而推導得來的。對求解任意二次方程的探索可追溯到4000多年前的古巴比倫時期。4000多年來,許多數學領域的知名人物都在這個現在看來十分簡單的問題上留下了自己的記錄。
  • 什麼是公因式,閱讀掌握下面的內容,求解公因式變簡單了
    是只有多項式才有的,是指這個多項式中各項都具有的公共因式。它可以是一個單項式,也可以是一個多項式,還可以是一個單項式與一個多項式的積。那麼我們該如何求解公因式吶,下面我就為大家介紹一下:首先,我們了解一下公因式的求法:係數:各項係數的最大公約數;字母:各項都含有的字母;指數:相同字母的最低次冪。
  • 【SymPy】(七)方程求解(八)矩陣
    從前面的文章我們知道,SymPy中的符號方程不是用=或==表示的,而是用Eq表示的。在SymPy中,任何不在Eq中的表達式都被SynPy的求解函數(如solveset())假定等於0。這意味著我們可以不使用x==y,而使用x-y(被求解函數認為是x-y==0)。如果要求解的方程已經等於0,則這一點特別有用。
  • 多項式數列
    函數f(x)=3x+4是個多項式函數(一次函數),則an=3n+4是個多項式數列,其實它是個等差數列。因此,我們有第一個顯而易見的結論:等差數列是一個多項式數列。當然,多項式數列的範圍比等差數列大一些。
  • 第67期 多項式與多項式的乘除法
    (5)再用5x+20的第一項5x除以除式的第一項x,得5x÷x=5,這是商的第二項,寫在第一項x的後面,寫成代數和的形式.(6)以商式的第二項5與除式x+4相乘,得5x+20,寫在上述的差5x+20的下面.(7)相減得差0,表示恰好能除盡.(8)寫出運算結果,(x²+9x+20)÷(x+4)=x+5.
  • Mathematica軟體應用免費直播培訓
    課程簡介  本課程覆蓋了數值計算領域的基本理論和基本算法,包括插值與曲線擬合、非線性方程求根、線性方程組求解、數值積分與微分、常微分方程數值解等內容。本課程採用數值計算理論與科學計算並重的思想建設,同時基於Mathematica實驗平臺,熟練使用計算機軟體,理解各種算法的優缺點,通過編寫Mathematica小程序展示計算機代碼在實際問題求解中如何操作和使用。
  • 多項式(一)
    本篇的內容對於高等代數中的多項式進行一個鋪墊,介紹數域與一元多項式的相關定義。
  • 多項式(三)
    本篇文章我們來講述多項式的因式分解數域P上次數不小於
  • (助力2018考研)特徵多項式=最小多項式
    今天揚哥手寫了關於特徵多項式=最小多項式兩個結論的解答, 這也是最近同學問的比較多的知識點. 說明不止一個學校考過!
  • 素數判別和整數分解存在多項式算法
    這種順向求解易反向求解難的函數,就叫陷門函數。因此RSA體制就與素數判別和大數分解有密切聯繫。首先,要具體建立一個RSA體制就需要兩個大素數,因而就涉及到尋找大素數的問題;而RSA體制的破譯之可能性就依賴於分解一個大數可能性。於是,RSA體制的建立與破譯就等價於素數判別與大數分解問題。多元自變量較容易得到一元因變量,一元因變量不容易得到多元自變量。某分支出發找幹道容易,幹道出發找某分支難。
  • LabVIEW編程實例:如何求解自然常數e
    它的一個經典的數學定義公式是:使用計算機計算e的值時,可以使用下面的公式近似計算:那麼在LabVIEW中如何編程實現求解這個公式即e的值呢?編程思路從上面的近似公式可以看出,e的值與n的階乘有關,可將上式分解為兩個步驟:求解n的階乘:n!=1×2×3×......
  • 整式除法之多項式除以多項式
    多項式除以多項式多項式2x3+10x2+3x+5除以x2+ax+b 所得商式為2x, 餘式 3x+5, 求a、b的值.