Поиск всех корней сложного многочлена с помощью SymPy

Я пытаюсь символически решить многочлен с комплексными числами и их сопряженными с SymPy. Я думаю, что проделал долгий путь, но solve не дает мне никаких решений, хотя полином разрешим.

from sympy import *

# set up symbols
a, b = symbols("a b", real=True)
t = a+I*b
T = functions.conjugate(t)

# set up polynomial
a1=0.005+I*0.0009
a2=0.9+I*-0.9
a3=0.4+I*0.5
a4=8+I*-80
a5=284+I*-1.5
a6=27100+I*-11500
poly=t**2 * T * a1 + t * T * a2 + t**2 * a3 + T * a4 + t * a5 + a6

# Trying to solve symbolically...
solve([re(poly), im(poly)], a, b)
#     Output: []

# Solving numerically works, but only finds one solution...
nsolve((re(poly), im(poly)), (a, b), (0, 0))
#     Output: matrix(
#             [['-137.962596090596'],
#              ['52.6296963395752']])

# verify with two solutions obtained in Maxima
poly.subs({a:-137.9625935162095, b:52.6296992481203}).n()
#     Output: 0.000540354631040322 + 0.00054727003909351*I
poly.subs({a:-332.6474382554614+I*-185.9848818313149, b:258.0065640091016+I*-272.3344263478699}).n()
#     Output: -6.55448222470652e-12 - 1.41238056784605e-12*I

Любые идеи?


person Christian    schedule 05.04.2013    source источник
comment
это действительно странно. Просто вопрос, чтобы быть уверенным: учитывая, что значение после замены первого далеко от нуля, может ли быть так, что поли не может быть решен, а максимумы дали вам числовое приближение? (Я не очень хорошо знаю максимумы, поэтому я действительно не знаю, как они себя ведут)   -  person EnricoGiampieri    schedule 05.04.2013
comment
@EnricoGiampieri Вполне может быть, что Maxima дала мне числовое приближение, но в своем выводе не упоминает об этом. Я тоже не эксперт по Maxima :-( В любом случае, было бы хорошо, если бы SymPy давал решения, которые давала Maxima, даже если они были просто числовыми приближениями.   -  person Christian    schedule 05.04.2013
comment
Я немного пытался работать с такими уравнениями и похоже, что проблема в механизме решения sympy, который плохо работает с комплексными числами. Я пытаюсь выяснить, не пропустили ли мы какое-то условие, необходимое для его работы...   -  person EnricoGiampieri    schedule 05.04.2013
comment
Мне это не кажется многочленом. Многочлен имеет постоянные коэффициенты типа a_0 z^0 + a_1 z^1 + .... У вас есть такие термины, как a_1 z^2 z*, т.е. член a1 умножается на его комплекс conj. Если бы у вас был полиномиальный mpmath от sympy, он должен работать отлично docs.sympy.org /dev/modules/mpmath/calculus/polynomials.html   -  person Hooked    schedule 05.04.2013
comment
Кажется, что SymPy просто не может решить эту проблему, но даже если бы он мог, он не дал бы вам тех результатов из Maxima, потому что вы установили a и b как реальные, поэтому solve() дал бы вам только те значения a и b, которые реальны.   -  person asmeurer    schedule 05.04.2013
comment
Я открыл задачу SymPy code.google.com/p/sympy/issues/ detail?id=3735 для этого. Надеюсь, мы исправим это.   -  person asmeurer    schedule 05.04.2013
comment
@asmeurer Спасибо, что открыли ошибку. Вы, очевидно, правы, использовать комплексные решения Maxima не имело никакого смысла. Я должен был вставить их в t и сохранить полученную действительную часть в a, а комплексную часть в b.   -  person Christian    schedule 08.04.2013


Ответы (1)


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

Использование f=10000*simplify(re(poly)) и g=10000*simplify(im(poly)) и редактирование результатов дает многочлены с целочисленными коэффициентами. Затем CAS (Magma в моем случае) может создать треугольное представление идеала f и g, которое задается как многочлены

a - 2483798807340123709959247/13545514719183259347425004828125*b^4
  + 66732206412048596386372283/541820588767330373897000193125*b^3 
  - 3849759933277117021785191063/86691294202772859823520030900*b^2
  + 9245906471290310401430681453/1733825884055457196470400618*b
  - 31414499425567273751868164900/866912942027728598235200309,

b^5 - 189465979625/206648369*b^4 
    + 330827538698125/826593476*b^3
    - 17645868534640625/206648369*b^2 
    + 1724106750659765625/206648369*b
    - 52548859891484375000/206648369

что говорит нам о том, что существует 5 решений. Численные решения для второго многочлена:

174.10461010682254746847015187264557067610513554291323564643772 
 + 63.402741884833821878468926640811609033267039765104756747285816*i

174.104610106822547468470151872645570676105135542913235646437738
 - 63.402741884833821878468926640811609033267039765104756747285804*i

258.006564009101655109715962546854008929462784282347754971379392
  + 272.334426347869856080204881056671278679761260094680345276069337*i

258.006564009101655109715962546854008929462784282347754971379382
 - 272.334426347869856080204881056671278679761260094680345276069359*i

52.62969633957523864698147679803879873180829265956656342643376

приводит к ровно одному действительному решению. Числовой результат sympy был правильным и полным.

person Lutz Lehmann    schedule 12.12.2013