Решение полиномов с комплексными коэффициентами с помощью симпы

Я очень новичок в Python, так что прости меня, если это просто исправить. Я пытаюсь решить полиномы с комплексными коэффициентами, используя 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]: []

что намного сложнее и возвращает пустой список. Я могу, однако, решить это с помощью клена, например. Также обратите внимание, что при удалении сложных коэффициентов нет проблем,

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() и вычленить корни один за другим, хотя мне тоже не повезло с этим методом.

1 ответ

Решение

Согласно комментарию 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]
Другие вопросы по тегам