Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用 Mathematica 求解多项式

用 Mathematica 求解多项式

作者头像
WolframChina
发布于 2018-05-31 03:21:11
发布于 2018-05-31 03:21:11
3.8K00
代码可运行
举报
文章被收录于专栏:WOLFRAMWOLFRAM
运行总次数:0
代码可运行

█ 本文译自 Bill Gosper 在 Wolfram 社区发表的热点文章:Solving polynomials

多项式是由一组常数系数,a、b、c、……(数值)确定的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 是二次的. 你会记得一元二次方程有两个通解:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Solve[a x^2 + b x + c == 0, x]

这样的表达式被称为不尽根式. 最常见的应用是在几何上. 圆、抛物线和双曲线通常由二次多项式指定。当我们想知道一个二次多项式与已知直线何时相交时,我们就得到一个二次方程. 这甚至发生在 双曲线是矩形的,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Plot[{(1 - x)/(x + 2), 2 x + 3}, {x, -4, 1}, PlotRange -> {{-4, 1}, {-6, 6}}, AspectRatio -> 4/5]

表示双曲线的分支与直线相交的方程为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(1 - x)/(x + 2) == 2 x + 3;

要得到形如 x^2 + b x + c ==0 的方程,需要两边同时乘以 x + 2,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Distribute[(x + 2)*%, Equal]

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

再两边同时减去(2 + x) (3 + 2 x),

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(2 + x) (3 + 2 x) - # & /@ %

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

然后展开:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Expand@%

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

因为 Mathematica 不是使用传统的方法处理方程,"两边同时减去"这一步需要解释一下. 它使用 & 定义了一个函数,从 (2 + x) (3 + 2 x)减去(#),然后"映射" ( /@ ) 到等式两边.

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Solve[%]

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

或者近似

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
N@%

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

当然,Mathematica 非常乐意直接求解:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Solve[(1 - x)/(x + 2) == 2 x + 3]

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

我们可以把这些值作为绘图范围

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Flatten[% /. Rule -> List]

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

来直观地检查合理性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Plot[{(1 - x)/(x + 2), 2 x + 3}, %[[{1, 2, 4}]]]

该图形以交点作为起点和终点. ( {1, 2, 4} 是为了去除额外的 x.)

要是双曲线是颠倒的,貌似就没解了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Plot[{(x - 1)/(x + 2), 2 x + 3}, {x, -4, 1}, PlotRange -> {{-4, 1}, {-6, 6}},
 AspectRatio -> 4/5]

但 Mathematica 很聪明,它给的结果不是{},而是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# + 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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Factor /@ %

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

然后乘以 4a 后

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
4 a # & /@ %

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

我们可以取两边的平方根.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Sqrt /@ % // PowerExpand

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

现在它变成了一个线性方程. PowerExpand 强制 Mathematica 选择 b + 2 a x,而不是 - b - 2 a x 作为平方的方根.

正如"每个人"都记着二次方程的解,"没有人"记得三次方程的解。原因是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Solve[ a x^3 + b x^2 + c x + d == 0, x] // TraditionalForm

现在考虑一个简单情形:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Plot[x^3 - x + 1/3, {x, -3/2, 3/2}]

显然它有三个实根,在 - 1.1, .35, 和 .75 附近. 具体是多少呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Solve[x^3 - x + 1/3 == 0]

嘿,等一下,根不是实数吗?是不是 Mathematica 忘了化简了?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Simplify@%%

这么复杂的式子怎么会是实数呢?让我们看一下虚部:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ComplexExpand@Im[x /. %]

{0, 0, 0}

那好吧,老天爷,告诉我们实部是啥吧!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ComplexExpand@Re[x /. %%]

三角函数?!还不如平方根和立方根呢!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Developer`TrigToRadicals@%%

天啊!那些三角函数是实数,但为啥这里却跟着一堆虚数单位?- 1.1、.35 和 .75 在哪呢??请给出数来.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
N@%

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

它们就在那,但这些 0. i 是怎么回事?奇怪的是,它们是不可避免的. 作为一个数学分支的伽罗瓦理论已经证明,不含虚数立方根的解式是不存在的,即使它们的加和为实数.

Henry Baker 的动画(本文顶部可以看到实际动画)展示了均为实数的三个根之间的关系:

这是张一般情况下的图片——三个实根的三次方程有一个拐点,它们关于拐点对称. 如果将拐点平移到原点,则会得到一个奇函数 f(-x )= -f(x).

四次方程可以通过将两条曲线相交得到. 一般情况下的四次方程会让人有点抓狂,如果不怕的话就按住 shift return 键试试吧.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Solve[ a x^4 + b x^3 + c x^2 + d x + e == 0, x]

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Solve[ a x^5 + b x^4 + c x^3 + d x^2 + e x + f == 0, x]

哈哈,Mathematica 放了我们一马,结果被剪切了,但为什么不至少提供一下互动大型表达式浏览器呢?因为它不能. 不存在一般五次方程的根表达式. 显然,通过因式分解我们可以求解某些五次方程.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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%,可以巧妙地解决,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x^5 - 5 x^2 - 3 == 0

它的根相当繁琐. 唯一的实根是

至少从外观看来是实数. 平凡的 Mathematica 无法求解——连验证都不行!只能近似:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%^5 - 5`69 %^2

3.0000000000000000000000000000000000000000000000000000000000000000000

我曾经(正确地?)说服自己,每个可求解的六次方程都可以降次到具有二次不尽根系数的三次方程或具有三次不尽根系数的二次方程. 但谁会想要求解这样一个方程呢?几何再次派上用场了. 问题:将一个正方形拆分成有限个锐角、等腰三角形. 可以用十个:

确定 Subscript[x, 1]、Subscript[y, 1]、Subscript[x, 2] 和 Subscript[r, 3] 的方程是12次的!这些方程可以通过因式分解降为具有不尽根系数的六次方程,但专家 Noam Elkies 认为这是不可求解的. 然而当次数为6、8、9、……或任何复合数(或称非质数)时,有时候会比较幸运.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

不能进行因式分解. 然而

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Solve[% == 0]

可以求得所有六个解!怎么实现呢?这个六次方程可以写作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x^2 - 4 x + 5 /. x -> x^3 - x^2

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Factor@%

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

也就是说,将三次方程替换为二次方程。如果我们注意到这一点,我们只是用y来代替 x ^ 3 - x ^ 2 - 2 ,对得到的二次方程求 y,然后求解关于 x 的三次方程,用 y 表示。我们是怎么注意到这一点的?用魔法函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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}

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Simplify[% /. x -> %%]

{0}

所以括号中的数量满足最小次数为36的最小多项式!

令人惊奇的是,这是一个甚至连 Mathematica 第11版都不知道的诀窍:如果系数形成回文,六次甚至八次方程总是可以求解!例如,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Solve[1 + x + x x - x^3 + x^4 + x^5 + x^6 == 0]

(失败。)但是我们可以对付完全一般的情况! 对于任意a,b,c,d,假设 x 满足互反多项式(所以被称作回文式)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)的余式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 的技巧可以成功的关键是我们可以将各项用它们的倒数匹配,并利用关系:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1/x^3 + x^3 == -3 (1/x + x) + (1/x + x)^3

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

朱利安和我有一个七次方程求解程序,但他不相信它能找到所有的解. 超过七次以后,能找到一个强有力的求解器机会会大大减小,TA在理论上可以求解的概率也是如此. 但是如果你的问题不是随机组成的,那么总是值得一试.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-10-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WOLFRAM 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring Batch批处理框架,真心强啊!!
Spring Batch 是 Spring 提供的一个数据处理框架。企业域中的许多应用程序需要批量处理才能在关键任务环境中执行业务操作。
终码一生
2022/10/28
1.2K0
Spring Batch批处理框架,真心强啊!!
批处理框架 Spring Batch 这么强,你会用吗?
spring batch是spring提供的一个数据处理框架。企业域中的许多应用程序需要批量处理才能在关键任务环境中执行业务操作。这些业务运营包括:
Java小咖秀
2021/07/12
1.4K0
Spring Batch 批处理框架,真心强啊!!
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/07/19
1.5K0
Spring Batch 批处理框架,真心强啊!!
Spring Batch 详解
调用这个Job Launcher方法:可以通过java程序来通过JobLauncher来启动,也可以通过定时任务例如Quartz scheduler来启动.
全栈程序员站长
2022/08/24
8820
Spring Batch 批处理(3) - Job、Flow、Split
在成功创建一个job后,Spring Batch 默认在项目启动时候执行配置的job。往往在正常业务处理中,需要我们手动或者定时去触发job,所以这边便引入了jobLauncher、jobOperator两个执行器。
chenchenchen
2020/05/26
1.9K0
Spring Batch(1)——数据批处理概念
Spring Batch为批处理提供了一个轻量化的解决方案,它根据批处理的需要迭代处理各种记录,提供事物功能。但是Spring Batch仅仅适用于"脱机"场景,在处理的过程中不能和外部进行任何交互,也不允许有任何输入。
随风溜达的向日葵
2019/07/04
2K0
Spring Batch(1)——数据批处理概念
Spring Batch(3)——Step控制
批处理任务的主要业务逻辑都是在Step中去完成的。可以将Job理解为运行Step的框架,而Step理解为业务功能。
随风溜达的向日葵
2019/07/08
6.5K1
Spring Batch(3)——Step控制
Spring Batch实战(一)
虽然开源软件项目和相关社区把更多的注意力集中在基于web和微服务的体系结构框架上,但明显缺乏对可重用体系结构框架的关注,以适应基于java的批处理需求,尽管仍然需要在企业IT环境中处理此类处理。缺乏标准的、可重用的批处理体系结构导致了在客户企业IT功能中开发的许多一次性的内部解决方案的激增。
xdd
2022/07/12
1.8K0
Spring Batch实战(一)
SpringBatch文档
Spring Batch 是一个轻量级的、完善的批处理框架,旨在帮助企业建立健壮、高效的批处理应用。
全栈程序员站长
2022/09/01
5.5K0
【Spring底层原理高级进阶】Spring Batch清洗和转换数据,一键处理繁杂数据!Spring Batch是如何实现IO流优化的?本文详解!
批处理是企业级业务系统不可或缺的一部分,spring batch是一个轻量级的综合性批处理框架,可用于开发企业信息系统中那些至关重要的数据批量处理业务.SpringBatch基于POJO和Spring框架,相当容易上手使用,让开发者很容易地访问和利用企业级服务.spring batch具有高可扩展性的框架,简单的批处理,复杂的大数据批处理作业都可以通过SpringBatch框架来实现。
苏泽
2024/03/10
8780
【Spring底层原理高级进阶】Spring Batch清洗和转换数据,一键处理繁杂数据!Spring Batch是如何实现IO流优化的?本文详解!
Spring Batch 批处理(8) - JobLauncher和JobOperator
在成功创建一个job后,Spring Batch 默认在项目启动时候执行配置的job。往往在正常业务处理中,需要我们手动或者定时去触发job,所以这边便引入了jobLauncher、jobOperator两个执行器。
chenchenchen
2020/05/26
3.5K0
批处理框架 Spring Batch 这么强,你真的会用吗?
概念词就不多说了,我简单地介绍下 , spring batch 是一个 方便使用的 较健全的 批处理 框架。
用户1220090
2025/05/08
2940
批处理框架 Spring Batch 这么强,你真的会用吗?
Spring Batch实战(二)
在Spring Batch中,Job只是Step实例的容器。它将在逻辑上属于一个流的多个步骤组合在一起,并允许配置所有步骤的全局属性,比如可重新启动性。作业配置包含:
xdd
2022/07/12
1K0
Spring Batch实战(二)
SpringBoot整合SpringBatch实用简例
作用和Hadoop很相似,不过Hadoop是基于重量级的分布式环境(处理巨量数据),而SpringBatch是基于轻量的应用框架(处理中小数据)。
EalenXie
2020/09/21
1.3K0
SpringBoot整合SpringBatch实用简例
Spring Batch(2)——Job配置与运行
在 Spring Batch(1)——数据批处理概念 文中介绍了批处理的概念以及Spring Batch相关的使用场景,后续将会陆续说明在代码层面如何使用。
随风溜达的向日葵
2019/07/08
4.5K1
Spring Batch快速入门
Spring Batch简单来说就是一个轻量级的批处理框架,从名字就可以知道它是Spring 的子项目。我们在企业开发中可能会面临到一些需要处理较大数据量的场景,例如将一个表的全部数据导入到另一张表结构类似的表中、批量读取一个或多个文件内容并写入到数据库中,又或者将一张表的数据批量更新到另一张表中。而Spring Batch可以帮助我们快速的开发这种场景下的批处理应用程序。
端碗吹水
2020/09/23
2K0
Spring Batch快速入门
Java一分钟之-Spring Batch:批量处理框架
在企业级应用开发中,批量数据处理是一项常见且关键的任务,它涉及到大规模数据的导入、导出、转换等操作。Spring Batch,作为Spring家族的一员,专为此类需求设计,提供了一套强大且灵活的批处理框架。本文旨在深入浅出地介绍Spring Batch的基础、常见问题、易错点及其规避策略,并配以实用的代码示例,帮助开发者高效利用这一工具。
Jimaks
2024/06/13
5140
Java一分钟之-Spring Batch:批量处理框架
spring batch数据库表数据结构
博客因为域名未被实名被暂停解析,申请实名加审批到域名重新可用,上下折腾导致博客四五天不能访问,这期间也成功了使用spring batch Integration 完成了spring batch分区远程的工程搭建,期间有使用ActiveMQ(JMS)的实现也有基于RabbitMQ(AMQP)的实现,最终选择了基于RabbitMQ的远程主从模式搭建项目,最终项目模型支持一主多从,多主多从,主从混用的使用,极大的提高了批处理的效率,解决了单机批处理的性能瓶颈。为了强化对spring batch关键概念的理解,故有了如下的对spring batch元数据结构的记录描述
kl博主
2018/04/13
4.7K0
spring batch数据库表数据结构
Spring Batch之批处理实践
Spring Batch 是Spring的子项目,基于Spring的批处理的框架,通过其可以构建出批量的批处理框架。
mySoul
2020/06/17
9720
springbatch 批处理框架的介绍
Spring Batch 是什么? 官网中介绍 Spring Batch is a lightweight, comprehensive batch framework designed to enable the development of robust batch applications vital for the daily operations of enterprise systems.(一款轻量的、全面的批处理框架,用于开发强大的日常运营的企业级批处理应用程序。)相对于他的特点定义我们肯定更倾向于他的使用的业务场景以及他是如何运作的。下面的篇幅将介绍整个springbatch的使用业务场景和它的结构原理以及如何去使用它们(最后会通过一个demo来演示)。 springbatch结合springboot 的demo:https://github.com/kellypipe/springbatch-springboot-demo
全栈程序员站长
2022/09/02
1.4K0
推荐阅读
相关推荐
Spring Batch批处理框架,真心强啊!!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验