2015-07-21 2 views
1

Я пытаюсь использовать mpmath.polyroots, чтобы найти корни простого многочлена с целыми коэффициентами x*(x-4)**3, который при расширении имеет вектор коэффициентов [1, -12, 48, 64, 0]. Следующий код не:Поиск корней простого многочлена с mpmath

import mpmath 
p = [ 1, -12, 48, -64, 0] 
print mpmath.polyroots(p,maxsteps=2000) 

с ошибкой:

Traceback (most recent call last): 
    File "poly.py", line 3, in <module> 
    print mpmath.polyroots(p,maxsteps=2000) 
    File "/usr/local/lib/python2.7/dist-packages/mpmath/calculus/polynomials.py", line 188, in polyroots 
    % maxsteps) 
mpmath.libmp.libhyper.NoConvergence: Didn't converge in maxsteps=2000 steps. 

Увеличение числа шагов не помогает. Ожидаемый ответ, очевидно, [0,4,4,4].

Неужели mpmath не может найти корни многочлена, если существует некоторая множественность? Как я могу это решить?

+0

Тройной корень приводит к уровню ошибки '1e-5' в числовом решателе из-за возмущений в оценке с плавающей запятой. С типичным уровнем по умолчанию «1е-6» или меньше это может быть невозможно разрешить. Кластерный анализ для поиска нескольких или близких корней может помешать этому. – LutzL

+0

@ LutzL Я думаю о кластерном анализе, возможно, в другом свете (например, мой вариант использования для него был бы похож на анализ основных компонентов). Как кластерный анализ связан с поиском нескольких корней? – Hooked

+1

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

ответ

1

В документации упоминается, что для достижения конвергенции может потребоваться увеличение extraprec. Это относится к вашему примеру из-за множественности корня.

>>> mpmath.polyroots(p, maxsteps=100, extraprec=110) 
[mpf('0.0'), mpf('4.0'), mpf('4.0'), mpf('4.0')] 

extraprec Параметр означает, что дополнительное количество цифр, которые будут использоваться в процессе расчета, по сравнению количества цифр, необходимых в результате (который является 15 по умолчанию, установленный на глобальном уровне в mpmath.np.dps). Его значение по умолчанию - 10; увеличивая его до 110, достигается конвергенция в 100 шагов. Это фактически занимает меньше времени, чем попытка (и неудача) найти корни с maxsteps=2000 по умолчанию extraprec.

 Смежные вопросы

  • Нет связанных вопросов^_^