简体   繁体   English

用sympy求解复系数多项式

[英]Solving polynomials with complex coefficients using sympy

I'm very new to python so forgive me if this has a simple fix. 我是python的新手,请原谅我,如果这有一个简单的解决方案。 I'm trying to solve polynomials with complex coefficients using sympy. 我正在尝试使用sympy来求解具有复系数的多项式。 I find that I get a blank output if k is 'too complicated'... I'm not quite sure how to define what that means just yet. 如果k'太复杂',我发现我得到一个空白输出......我不太确定如何定义那意味着什么。 As a first example consider this fourth order polynomial with complex coefficients, 作为第一个例子,考虑具有复系数的这个四阶多项式,

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

there are no problems obtaining an output. 获得输出没有问题。 I'm interested, though, in solving something like, 不过,我有兴趣解决类似的问题,

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

which is a lot more complicated and returns an empty list. 这更复杂并返回一个空列表。 I can, however, solve this using maple, for instance. 但是,我可以使用枫木来解决这个问题。 Also, note that in removing the complex coefficients, there are no issues, 另请注意,在删除复杂系数时,没有问题,

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

The elements of the resulting array can be evaluated numerically. 可以用数字方式评估结果数组的元素。

So, is this a problem to do with complex coefficients? 那么,这与复杂系数有关吗? How can I solve equations like the one on line [427]? 我如何解决像在线[427]那样的方程式?

I have tried to solve with nsolve() and factor the roots out one by one, though I've had no luck with this method either. 我试图用nsolve()解决并逐个考虑根,但我也没有运气这个方法。

As per the comment of Stelios , you can use sympy.polys.polytools.nroots : 根据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]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM