2013-03-13 3 views
14

Я пытаюсь найти способ вычисления корней многочлена с комплексными коэффициентами в Java (т. Е. Эквивалент того, что смешно легко сделать с помощью корней() в MATLAB).Поиск полиномиального корня комплексного коэффициента в Java

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

Я смотрел на какое-то время, и ничто не было убедительным, кажется, доступно там, что я считаю довольно странным. Тогда я хотел бы спросить вас:

  1. Знаете ли вы (стабильный) Java библиотеку, которая выполняет корневой вывод по полиномам, определенных комплексными коэффициентами?

  2. Знаете ли вы (стабильную) библиотеку Java, которая выполняет вычисления, evd, svd, inverse и т. Д. На COMPLEX -значных матрицах?

Примечание: я уже смотрел на JAMA (не обрабатывает комплекс), Java Научной библиотеки Майкла Томаса Фланагана (не доступен), жеребенок (не представляется для обработки сложной), Efficient Java Matrix Библиотека (не сложна), DDogleg Numerics (не обрабатывает многочлен с комплексными коэффициентами), JScience (неясно, доступен ли evd) и common-math из Apache (неясно, разрешают ли они сложные матрицы, и если да, если evd доступен).

ответ

3

Durand-Kerner method также работает для сложных коэффициентов и не полагается на вычисления матрицы.

Это довольно просто реализовать, вы можете выполнить реализацию проекта (Stackoverflow запрещает мне связывать найденную мной) или сделать свой собственный. Вы можете использовать библиотеку jscience для сложных типов данных, а не для самого алгоритма.

РЕДАКТИРОВАТЬ: Не видел, что вам тоже нужен evd, не говоря о моем упоминании о jscience как о возможности выполнения сложной математической матрицы.

+0

Большое спасибо! Этот метод действительно был довольно прост в реализации, и я получаю хорошие результаты - проблема решена. – Virginie

1

Если вы хотите сохранить его в реальности, используйте Bairstow method. Если многочлен имеет нечетную степень, сначала используйте Newton's method, чтобы найти реальный корень и уменьшить полином до четной степени. Это позволяет избежать нечетной особенности метода Байршоу, где он сходится к квадратичному многочлену, который имеет бесконечность как один корень. Информация хорошего качества можно найти в обычных местах. Некоторые из них написаны или отредактированы вами по-настоящему.

Определить внутренний радиус корня r и использовать z^2-2r * cos (phi) * z + r^2 со случайным углом phi в качестве начального коэффициента для метода Байшрова. Он производит на каждом шаге квадратичный множитель, всегда в и с вещественными коэффициентами, содержащий либо пару вещественных корней, либо сопряженную пару комплексных корней.

Проверяйте каждый шаг скорости конвергенции и перезапуска при необходимости с другой начальной точкой. Найдите новые корни после дефляции и отполируйте корни или квадратичные факторы, выполнив метод с исходным многочленом и факторами в качестве отправной точки.