Я б настійно радив не використовувати рішення закритої форми, оскільки вони, як правило, є дуже нестабільними. Вам потрібно бути дуже обережними в порядку та порядку ваших оцінок дискримінантних та інших параметрів.
Класичний приклад - це для квадратичного рівняння . Обчисливши коріння як , ви у проблеми для поліномів, де з тих пір ви отримуєте скасування в чисельник. Вам потрібно обчислити .x 1 , 2 = - b ± √а х2+ b x + c = 0 b≫4ac
х1 , 2= - b ± b2- 4 а c-------√2 а
b ≫ 4 a cх1=−(b+sign(b)b2−4ac−−−−−−−√)2a;x2=ca1x1
Гігхем у своєму шедеврі «Точність та стабільність чисельних алгоритмів» (2-е видання, СІАМ) використовує метод прямого пошуку для пошуку коефіцієнтів кубічного многочлена, для яких класичний аналітичний кубічний розчин дає дуже неточні результати. Приклад, який він наводить, є . Для цього полінома корені добре відокремлені, а отже, проблема не обумовлена. Однак якщо він обчислює корені за допомогою аналітичного підходу та оцінює поліном у цих коренях, він отримує залишок , використовуючи стабільний стандартний метод (метод супутньої матриці) , залишок порядку[ a , b , c ] = [ 1.732 , 1 ,1.2704]О ( 10- 2)О ( 10- 15). Він пропонує незначну модифікацію алгоритму, але вже тоді він може знайти набір коефіцієнтів, що призводять до залишків що, безумовно, не добре. Див. P480-481 вищезгаданої книги.О ( 10- 11)
У вашому випадку я застосував би метод Бейрстоу . Він використовує ітеративну комбінацію ітерації Ньютона на квадратичні форми (і тоді вирішуються корені квадратичної форми) та дефляції. Це легко реалізується і є навіть деякі реалізації, доступні в Інтернеті.