Поиск полиномиального корня комплексного коэффициента в Java - программирование
Подтвердить что ты не робот

Поиск полиномиального корня комплексного коэффициента в Java

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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