Mathematica 如何计算单个非多项式方程的实数和复数解?

计算科学 数值分析 算法 非线性方程 寻根
2021-12-25 16:22:01

StackOverflow 上的这个问题让我问自己,使用 Python 程序员可用的工具来解决像这样的等式会涉及什么。

0.125567841d2.25=2.513274d+0.10053+2.11πd+0.04

可以使用哪些基本数值工具来获得该方程的一个实数和四个复数根(WolframAlpha)?我已经(认真地)查看了 Mathematica 文档,但无法辨别它们可能是什么。这可能主要是我的无知。

2个回答

由于另一个答案已经涉及将符号根求解器应用于这个特定方程的可能性(通过转换为多项式形式,尽管程度为),我将对数值求根做一些评论。5

当我们想找到一个连续函数的实根时,中值定理是一个基本的工具。在实函数是连续的并且在端点之间改变符号的封闭有界区间上,该区间内部的某处将有一个实根。二分法允许我们在该区间内至少近似一个这样的根。

在这里,我们可以通过交叉相乘和收集一侧的项,将方程转换为找到实数连续函数的根:

0.125567841d2.25=2.513274d+0.10053+2.11πd+0.04

0.125567841(d+0.04)=(2.513274d+0.10053+2.11π)d2.25

F(d)2.513274d3.25+(0.10053+2.11π)d2.250.125567841d0.00502271364=0

这种形式的问题更容易分析,但我们应该检查交叉乘法是否引入了伪根,即不满足原始方程的修正方程的根。当我们将两边都乘以分母时d2.25d+0.04,这可能会引入一个或多个新根,其中这些因素为零,即d=0要么d=0.04. 幸运的是F(0)0F(0.04)0,所以在这种情况下我们没有引入工件根。

应该小心定义什么(如果有的话)d2.25表示实数值d. 不可避免地,必须放弃该表达式的任何实值,因为它需要对负数取平方根。这是依赖于诸如 Wolfram Alpha 之类的工具的一个特别弱点,因为它试图通过积极地假设即使对于否定论点也能对表达式做出某种意义来提供帮助d.

幸运的是,在这种情况下,Wolfram Alpha 找到的根不在实轴的负半边d. 有正实根d0.06087,并且找到的其他根是复共轭对。

一旦我们意识到,真正的根可以通过标准方法(例如二分法)找到F(d)是连续的并且在区间上改变符号[0,1]. 那是,F(0)=0.00502271364F(1)9.11197, 所以必须有一个中间值d0函数在哪里F(d0)=0. 一旦根的位置d0通过二等分等适当地缩小,可以使用更快速收敛的方法(如牛顿法)。

当一个函数像F(d)有理幂的实系数具有复根,这些将自然地出现在复共轭对中。然后可以用对复共轭根对的二维搜索代替对实根的一维搜索d=x±iy. 一个经典的方法是Bairstow 方法,它使用 Newton-Raphson 迭代来定位复数共轭根对,仅使用实数算术。

就像对符号求根感兴趣的 Python 用户应该熟悉一样sympy,对数值求根感兴趣的人也会被这个numpy库所吸引。在许多问题中,这两种方法的综合是有利的,例如,sympy用于获得可以通过 中的例程评估的函数的导数numpy

您可以通过更改变量用整数指数重写。这看起来像,其中是有理化指数的分母的 LCM。在您的情况下,我们有并且:d=xrrr=4

6.724270.125568x4+2.51327x13=0

这可以通过通常的方式解决。Mathematica中,符号解和数值解有明显的区别。您有浮点数在四处跳动,因此弹出的解决方案是数值近似的结果。这些在其扩展的内部文档中进行了描述:http ://reference.wolfram.com/language/tutorial/SomeNotesOnInternalImplementation.html#2118

13 个根位于复平面中的一个圆上: 在此处输入图像描述