Самое быстрое численное решение действительного кубического полинома?

StackOverflow https://stackoverflow.com/questions/2003465

  •  18-09-2019
  •  | 
  •  

Вопрос

Р вопрос:Ищете самый быстрый способ ЧИСЛЕННОГО решения группы произвольных кубик, которые, как известно, имеют действительные коэффициенты и три действительных корня.Сообщается, что функция поликорня в R использует алгоритм Дженкинса-Трауба 419 для комплексных полиномов, но для реальных полиномов авторы ссылаются на свою более раннюю работу.Каковы более быстрые варианты для реального кубического числа или, в более общем смысле, для вещественного многочлена?

Это было полезно?

Решение

Конкретизируя ответ Ариетты выше:

> a <- c(1,3,-4)
> m <- matrix(c(0,0,-a[1],1,0,-a[2],0,1,-a[3]), byrow=T, nrow=3)
> roots <- eigen(m, symm=F, only.values=T)$values

Будет ли это быстрее или медленнее, чем использование кубического решателя в пакете GSL (как предложено knguyen выше), зависит от его сравнительного анализа в вашей системе.

Другие советы

Численное решение для многократного выполнения этого надежно и стабильно включает в себя:(1) Сформируйте сопутствующую матрицу, (2) найдите собственные значения сопутствующей матрицы.

Вы можете подумать, что эту проблему решить сложнее, чем исходную, но именно так решение реализуется в большинстве рабочих кодов (скажем, в Matlab).

Для полинома:

p(t) = c0 + c1 * t + c2 * t^2 + t^3

сопутствующая матрица:

[[0 0 -c0],[1 0 -c1],[0 1 -c2]]

Найдите собственные значения такой матрицы;они соответствуют корням исходного многочлена.

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

Обратите внимание, что коэффициент t^3 один, если в ваших полиномах это не так, вам придется разделить все это на коэффициент и затем продолжить.

Удачи.

Редактировать:Numpy и октава также зависят от этой методологии вычисления корней многочленов.См., например, эта ссылка.

Самый быстрый известный способ (насколько я знаю) найти действительные решения - это система произвольных полиномов в н переменные являются полиэдральной гомотопией.Подробное объяснение, вероятно, выходит за рамки ответа StackOverflow, но по сути это алгоритм пути, который использует структуру каждого уравнения с использованием торической геометрии.Гугл даст вам ряд документов.

Возможно, этот вопрос больше подходит для mathoverflow?

Вам нужны все три корня или только один?Если бы только один, я думаю, метод Ньютона сработал бы нормально.Если все 3, то это может быть проблематично в обстоятельствах, когда два находятся близко друг к другу.

1) Найдите производный полином P', чтобы найти три корня.Видеть там чтобы знать, как это сделать правильно.Назовите эти корни a и b (с a < b)

2) Для среднего корня используйте несколько шагов деления пополам между a и b, и когда вы подойдете достаточно близко, закончите методом Ньютона.

3) Для поиска минимального и максимального корня «поищите» решение.Для максимального корня:

  • Начните с x0 = b, x1 = b + (b - a) * лямбда, где лямбда — умеренное число (скажем, 1,6).
  • делайте x_n = b + (x_{n - 1} - a) * лямбда до тех пор, пока P(x_n) и P(b) не будут иметь разные знаки
  • Выполните деление пополам + Ньютон между x_{n - 1} и x_n.

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

Если у вас нелинейный система с другой стороны (напр.система на N полиномиальных уравнениях с N неизвестными), такой метод, как Ньютон высокого порядка может быть использовано.

Вы пробовали изучить пакет GSL? http://cran.r-project.org/web/packages/gsl/index.html?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top