Я бы настоятельно рекомендовал не использовать закрытые формы решений, поскольку они, как правило, очень нестабильны. Вы должны быть предельно внимательны в отношении порядка и порядка оценки дискриминанта и других параметров.
Классическим примером является пример для квадратного уравнения . Вычисляя корни как вы попадете в беду для многочленов, где с тех пор вы получаете отмену в числитель. Вам нужно вычислить .ax2+bx+c=0
x1,2=−b±b2−4ac−−−−−−−√2a
b≫4acx1=−(b+sign(b)b2−4ac−−−−−−−√)2a;x2=ca1x1
Хаймам в своем шедевре «Точность и стабильность численных алгоритмов» (2-е изд, SIAM) использует метод прямого поиска, чтобы найти коэффициенты кубического полинома, для которого классическое аналитическое кубическое решение дает очень неточные результаты. В качестве примера он приводит . Для этого многочлена корни хорошо отделены, и, следовательно, проблема не является плохо обусловленной. Однако, если он вычисляет корни, используя аналитический подход, и оценивает многочлен от этих корней, он получает остаток от , используя метод стабильного стандарта (метод матрицы-компаньона) остаток имеет порядок[a,b,c]=[1.732,1,1.2704]O(10−2)O(10−15), Он предлагает небольшую модификацию алгоритма, но даже тогда он может найти набор коэффициентов, ведущих к вычетам что определенно не годится. См. P480-481 вышеупомянутой книги.O(10−11)
В вашем случае я бы применил метод Барстоу . Он использует итеративную комбинацию итераций Ньютона на квадратичных формах (а затем решаются корни квадратичных) и дефляцию. Это легко реализовать, и в Интернете даже есть несколько реализаций.