Самое быстрое численное решение действительного кубического полинома?
-
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?