数学建模社区-数学中国

标题: 用 Mathematica 求解多项式 [打印本页]

作者: Asdmath2020    时间: 2020-3-17 14:54
标题: 用 Mathematica 求解多项式
4.gif # U& g2 \* U' S5 N# c! A0 D
多项式是由一组常数系数,a、b、c、……(数值)确定的。 ) s7 B! Y3 W! |7 p, x% U# }+ Q
TableForm[{a x + b, a x^2 + b x + c, a x^3 + b x^2 + c x + d, ". . ."}] //
. L- N$ O4 m1 M* v4 ^: t 01.png , e7 Y5 x% Z. u5 I0 I  V
多项式求解问题就是找到一个值 x,使这些项的总和等于 0. 根据 x 的最高次数分别称为线性、二次、三次、四次、五次、六次、七次、八次...... 多项式。我们称 y = a x + b 为线性,是因为它的图线是一条直线. 比如令 a = 2,b = 3,
/ `& D- O0 W6 }( N4 @( v; Y9 C9 ~
Plot[2 x + 3, {x, -2, 1}]
  p( d- T9 }9 V
% J! ~: F: d0 {2 P# v" x; w/ B( x- W
02.png & e4 C/ z+ [& N; {' c" _
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 5 B; x6 s5 P: X( R5 l; o# ^( m, ?
这样的表达式被称为不尽根式. 最常见的应用是在几何上. 圆、抛物线和双曲线通常由二次多项式指定。当我们想知道一个二次多项式与已知直线何时相交时,我们就得到一个二次方程. 这甚至发生在 双曲线是矩形的,例如:' w$ W/ c1 K4 i
Plot[{(1 - x)/(x + 2), 2 x + 3}, {x, -4, 1}, PlotRange -> {{-4, 1}, {-6, 6}}, 04.png # @6 L2 _4 ]: F+ t( t9 {
表示双曲线的分支与直线相交的方程为
(1 - x)/(x + 2) == 2 x + 3;
要得到形如 x^2 + b x + c ==0  的方程,需要两边同时乘以 x + 2,
Distribute[(x + 2)*%, Equal][color=rgba(0, 0, 0, 0.498)]1 - x == (2 + x) (3 + 2 x)
$ w8 t6 L$ t2 z# v+ G( \
再两边同时减去(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
4 f# W: @) D) ]8 x. F
因为 Mathematica 不是使用传统的方法处理方程,"两边同时减去"这一步需要解释一下. 它使用 & 定义了一个函数,从 (2 + x) (3 + 2 x)减去(#),然后"映射" ( /@ ) 到等式两边.
不管怎样,求解二次方程:
Solve[%]
{{x -> 1/2 (-4 - Sqrt[6])}, {x -> 1/2 (-4 + Sqrt[6])}}
或者近似* k% ]2 ~4 o; t0 ^- l9 }! T
N@%
{{x -> -3.22474}, {x -> -0.775255}}
. C# f; W, V4 b  \7 P" K
当然,Mathematica 非常乐意直接求解:
Solve[(1 - x)/(x + 2) == 2 x + 3]
{{x -> 1/2 (-4 - Sqrt[6])}, {x -> 1/2 (-4 + Sqrt[6])}}
我们可以把这些值作为绘图范围9 x& y1 }: G/ z# \* ^- ~
Flatten[% /. Rule -> List]
{x, 1/2 (-4 - Sqrt[6]), x, 1/2 (-4 + Sqrt[6])}
来直观地检查合理性:

8 L3 F. `5 K  RPlot[{(1 - x)/(x + 2), 2 x + 3}, %[[{1, 2, 4}]]]5 }( z7 ^% v, l: w; L4 B. [
05.png
1 i/ c5 O+ }0 {0 R4 H9 O
该图形以交点作为起点和终点. ( {1, 2, 4} 是为了去除额外的 x.)+ B% X+ x  O6 M/ z& F/ M9 e
要是双曲线是颠倒的,貌似就没解了:
2 t+ J( g* h/ [7 \+ m0 I
Plot[{(x - 1)/(x + 2), 2 x + 3}, {x, -4, 1}, PlotRange -> {{-4, 1}, {-6, 6}},; C9 L- D* m4 T* G4 y
AspectRatio -> 4/5]( B. e* ^& `% `6 Q) f
06.png ' M8 W, N6 _& }
但 Mathematica 很聪明,它给的结果不是{},而是
& G% ]5 O# l! C) f9 j" B* Y
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:
" j$ h& i6 n0 Q; @# `
Factor /@ %
5 n# \+ ~/ S1 K; B; Q5 _- }5 Q3 \3 s
(b + 2 a x)^2/(4 a) == -((-b^2 + 4 a c)/(4 a))
然后乘以 4a 后
7 N- a! k8 r: I2 @
4 a # & /@ %
(b + 2 a x)^2 == b^2 - 4 a c
我们可以取两边的平方根.
3 r6 m; w* R! i6 G  a# H
Sqrt /@ % // PowerExpand
b + 2 a x == Sqrt[b^2 - 4 a c]
现在它变成了一个线性方程. PowerExpand 强制 Mathematica 选择 b + 2 a x,而不是 - b - 2 a x 作为平方的方根.
7 s) d. n' J8 J% A( Y" b, G3 v& j4 v
正如"每个人"都记着二次方程的解,"没有人"记得三次方程的解。原因是:
  T! @7 }3 p% t9 y* n3 H
Solve[ a x^3 + b x^2 + c x + d == 0, x] // TraditionalForm* w( g6 d4 a3 W3 q; w" l
07.png
" a& U: w# }5 a2 e7 V现在考虑一个简单情形:
( l2 |, G( H0 E6 O% F& i$ gPlot[x^3 - x + 1/3, {x, -3/2, 3/2}] 08.png 3 n1 H7 Q+ B6 h. A
显然它有三个实根,在 - 1.1, .35, 和 .75 附近. 具体是多少呢?/ R; ?5 W# @# {2 S2 ]
Solve[x^3 - x + 1/3 == 0]
% x% u+ B  ^6 x; P" N5 V) b/ X 09.png
2 F  T7 u4 w- O
嘿,等一下,根不是实数吗?是不是 Mathematica 忘了化简了?
1 h4 [) e+ v7 y2 T  a0 L3 E
Simplify@%%
: L- [0 c. w7 y9 _, E- m( K: g4 T 010.png 8 p$ u/ Z4 w  P- y' C) f. [+ [
这么复杂的式子怎么会是实数呢?让我们看一下虚部:
; f7 x, O6 W7 m) i3 }# U% ^1 ]
ComplexExpand@Im[x /. %]
{0, 0, 0}
那好吧,老天爷,告诉我们实部是啥吧!
- {* f/ U0 I) D" r5 s. s
ComplexExpand@Re[x /. %%]
7 x. w' f2 W$ Q% ~- k7 ~$ _ 011.png ) ~3 b. R, s( u( Q3 N* I
三角函数?!还不如平方根和立方根呢!
& y% W: I' T* E4 t& W; d3 g
Developer`TrigToRadicals@%%
# t- _7 Q. H; m+ A' D/ F; t 012.png
/ o. `0 I. B9 O2 \. S" {9 `
天啊!那些三角函数是实数,但为啥这里却跟着一堆虚数单位?- 1.1、.35 和 .75 在哪呢??请给出数来.
$ q! f6 M6 u. v2 X$ B/ q% k
N@%
{0.742227 + 0. I, 0.394931 + 0. I, -1.13716 + 0. I}
它们就在那,但这些 0. i 是怎么回事?奇怪的是,它们是不可避免的. 作为一个数学分支的伽罗瓦理论已经证明,不含虚数立方根的解式是不存在的,即使它们的加和为实数.
( W- k3 n( S7 m+ d4 ?: Z
Henry Baker 的动画(本文顶部可以看到实际动画)展示了均为实数的三个根之间的关系:
0 b2 B. N7 B) S4 w
013.png ) B- m; k! N# V& |
这是张一般情况下的图片——三个实根的三次方程有一个拐点,它们关于拐点对称. 如果将拐点平移到原点,则会得到一个奇函数  f(-x )= -f(x).
0 F5 j' o& ~, f9 i" Z& \" J
四次方程可以通过将两条曲线相交得到. 一般情况下的四次方程会让人有点抓狂,如果不怕的话就按住 shift return 键试试吧.
Solve[ a x^4 + b x^3 + c x^2 + d x + e == 0, x]
求解五次方程就更是不要命了.
$ n2 F  h5 p1 M; b8 O
Solve[ a x^5 + b x^4 + c x^3 + d x^2 + e x + f == 0, x]$ M* o$ V- e9 K2 E& J1 r2 u
014.png
1 U( T5 }# f- s% h* S1 T
哈哈,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
它的根相当繁琐. 唯一的实根是
% T5 X. X2 W7 Y
015.png
$ T% h0 ]8 v4 T( v
至少从外观看来是实数. 平凡的 Mathematica 无法求解——连验证都不行!只能近似:
%^5 - 5`69 %^2
3.0000000000000000000000000000000000000000000000000000000000000000000
我曾经(正确地?)说服自己,每个可求解的六次方程都可以降次到具有二次不尽根系数的三次方程或具有三次不尽根系数的二次方程. 但谁会想要求解这样一个方程呢?几何再次派上用场了. 问题:将一个正方形拆分成有限个锐角、等腰三角形. 可以用十个:

/ I( q; V5 G  s/ X$ j 016.png
4 v$ e3 U1 }0 r9 u) W
确定 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
不能进行因式分解. 然而
) f- T7 L: C7 k: _/ J* @6 J
Solve[% == 0]9 G- p. ~5 T. }. U/ a
017.png , k1 {0 j, U9 y7 A8 e- F7 X- Q
可以求得所有六个解!怎么实现呢?这个六次方程可以写作3 K% h1 L6 T) A! \0 @; b' T
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 表示。我们是怎么注意到这一点的?用魔法函数* n# }: d, V  F$ z4 L2 I
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 函数所了解的. 知道吗?你的八次方程可能只是三个二次方程的组合.
8 Q! N1 ~, X1 \: r
但请注意:这个六次方程的解,既不能因式分解
# P, Y/ _7 T8 N" z: r
018.png
2 o% W2 c: U4 Q4 K* c, G
5 + 18 x + 36 x^2 + 36 x^6
也不能正常分解.& y7 b3 P) [; |4 h: o
" W# b% V" E; E% @2 t
{570630428688384000000 + 4891824455002619904 x +    161093791317491712
x^2 + 12153384861696 x^3 + 984379392 x^4 -    17280 x^5 + x^6}
Simplify[% /. x -> %%]
{0}
所以括号中的数量满足最小次数为36的最小多项式!! C0 l7 Q8 ]+ u
令人惊奇的是,这是一个甚至连 Mathematica 第11版都不知道的诀窍:如果系数形成回文,六次甚至八次方程总是可以求解!例如,
Solve[1 + x + x x - x^3 + x^4 + x^5 + x^6 == 0]' }6 I. t' t& p. J& C. G
019.png 8 u1 C* h+ N! y
(失败。)但是我们可以对付完全一般的情况!对于任意a,b,c,d,假设 x 满足互反多项式(所以被称作回文式)
" z5 b: s7 D; j6 e" B4 P. t
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在理论上可以求解的概率也是如此. 但是如果你的问题不是随机组成的,那么总是值得一试.
! M) R% ]% R: Z% W, q
若想咨询Mathematica软件,欢迎联系武汉墨光科技market@asdoptics.com ; @0 g# k+ z  |' l0 w! ^

; N" ^* u) D" _) ?$ q1 H3 Y$ O+ |3 n: K8 T9 q4 w6 f

- c3 _6 ]' L& Q; B9 Z




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5