使用sympy解决具有复数系数的多项式问题

5

我非常新手,如果这有一个简单的解决方法,请原谅我。我正在尝试使用sympy解决具有复系数的多项式。我发现,如果k“太复杂”,我会得到一个空白输出...我还不确定如何定义这意味着什么。首先考虑这个具有复系数的四次多项式作为一个例子:

In [424]: solve(k**4+ 2*I,k)
Out[424]: 
[-2**(1/4)*sqrt(-sqrt(2)/4 + 1/2) - 2**(1/4)*I*sqrt(sqrt(2)/4 + 1/2),
 2**(1/4)*sqrt(-sqrt(2)/4 + 1/2) + 2**(1/4)*I*sqrt(sqrt(2)/4 + 1/2),
 -2**(1/4)*sqrt(sqrt(2)/4 + 1/2) + 2**(1/4)*I*sqrt(-sqrt(2)/4 + 1/2),
 2**(1/4)*sqrt(sqrt(2)/4 + 1/2) - 2**(1/4)*I*sqrt(-sqrt(2)/4 + 1/2)]

获取输出没有问题。但是我更感兴趣的是解决类似以下问题的情况:

In [427]: solve(k**6 + 3*I*k**5 - 2*k**4 + 9*k**3 - 4*k**2 + k - 1,k)
Out[427]: []

这个问题比较复杂且会返回一个空列表。但是,我可以使用Maple来解决。同时,需要注意的是,在去除复数系数时没有任何问题。

In [434]: solve(k**6 + 3*k**5 - 2*k**4 + 9*k**3 - 4*k**2 + k - 1,k)
Out[434]: 
[CRootOf(k**6 + 3*k**5 - 2*k**4 + 9*k**3 - 4*k**2 + k - 1, 0),
 CRootOf(k**6 + 3*k**5 - 2*k**4 + 9*k**3 - 4*k**2 + k - 1, 1),
 CRootOf(k**6 + 3*k**5 - 2*k**4 + 9*k**3 - 4*k**2 + k - 1, 2),
 CRootOf(k**6 + 3*k**5 - 2*k**4 + 9*k**3 - 4*k**2 + k - 1, 3),
 CRootOf(k**6 + 3*k**5 - 2*k**4 + 9*k**3 - 4*k**2 + k - 1, 4),
 CRootOf(k**6 + 3*k**5 - 2*k**4 + 9*k**3 - 4*k**2 + k - 1, 5)]

生成的数组元素可以进行数值评估。

那么,这是与复系数有关的问题吗?我如何解决像[427]行上的方程?

我已经尝试使用nsolve()解决并逐个分解根,但是这种方法也没有成功。


你需要一个能在复数平面上工作的求解器。在实数线上工作的根查找器将找到离散点,每个根一个。而复数根查找器将不得不在复数平面上找到曲线。这是一个更难的问题。 - duffymo
1
sympy.nroots() 能够找到所讨论的多项式的(数值)根。 - Stelios
非常感谢您的帮助,@Stelios。我以前没有接触过 sympy.nroots。这很有效。 - ben_afobe
我猜CRootOf还不支持复数系数。 - asmeurer
1个回答

2
根据Stelios评论,您可以使用sympy.polys.polytools.nroots
>>> from sympy import solve, nroots, I
>>> from sympy.abc import k
>>> solve(k**6 + 3*I*k**5 - 2*k**4 + 9*k**3 - 4*k**2 + k - 1,k)
[]
>>> nroots(k**6 + 3*I*k**5 - 2*k**4 + 9*k**3 - 4*k**2 + k - 1)
[-2.05972684672 - 0.930178254620881*I, -0.0901851681681614 + 0.433818575087712*I, -0.0734840785305346 - 0.434217215694685*I, 0.60726931721974 - 0.0485101438937812*I, 0.745127208196241 + 0.945593905069312*I, 0.870999568002712 - 2.96650686594768*I]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接