用 Mathematica 求解多項式

4.gif

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

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

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

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

    

02.png

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]

03.png

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

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

04.png

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

(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}]]]
05.png

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

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

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

但 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
07.png

現在考慮一個簡單情形:

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

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

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

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

Simplify@%%
010.png

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

ComplexExpand@Im[x /. %]

{0, 0, 0}

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

ComplexExpand@Re[x /. %%]
011.png

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

Developer`TrigToRadicals@%%
012.png

天?。∧切┤呛瘮凳菍崝?,但為啥這里卻跟著一堆虛數單位?- 1.1、.35 和 .75 在哪呢??請給出數來.

N@%

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

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

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

013.png

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

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

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

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

014.png

哈哈,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

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

015.png

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

%^5 - 5`69 %^2

3.0000000000000000000000000000000000000000000000000000000000000000000

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

016.png

確定 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]
017.png

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

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 函數所了解的. 知道嗎?你的八次方程可能只是三個二次方程的組合.

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

018.png

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

也不能正常分解.

0019.png

{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]

019.png

(失敗。)但是我們可以對付完全一般的情況!對于任意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在理論上可以求解的概率也是如此. 但是如果你的問題不是隨機組成的,那么總是值得一試.

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP