Consiglio vivamente di non utilizzare soluzioni in forma chiusa poiché tendono ad essere numericamente molto instabili. È necessario prestare la massima attenzione nel modo e nell'ordine delle valutazioni del discriminante e di altri parametri.
L'esempio classico è quello dell'equazione quadratica . Calcolare le radici come ti metterà nei guai per i polinomi in cui da allora otterrai la cancellazione nella numeratore. Devi calcolare .ax2+bx+c=0
x1,2=−b±b2−4ac−−−−−−−√2a
b≫4acx1=−(b+sign(b)b2−4ac−−−−−−−√)2a;x2=ca1x1
Higham nel suo capolavoro "Precisione e stabilità degli algoritmi numerici" (2a edizione, SIAM) utilizza un metodo di ricerca diretta per trovare coefficienti di un polinomio cubico per il quale la classica soluzione cubica analitica fornisce risultati molto imprecisi. L'esempio che fornisce è . Per questo polinomio le radici sono ben separate e quindi il problema non è mal condizionato. Tuttavia, se calcola le radici usando l'approccio analitico e valuta il polinomio in queste radici, ottiene un residuo di usando un metodo standard stabile (il metodo della matrice compagna) , il residuo è di ordine[a,b,c]=[1.732,1,1.2704]O(10−2)O(10−15). Propone una leggera modifica all'algoritmo, ma anche in questo caso può trovare un insieme di coefficienti che portano a residui di che sicuramente non è buono. Vedi p480-481 del libro sopra citato.O(10−11)
Nel tuo caso, applicherei il metodo di Bairstow . Usa una combinazione iterativa di iterazione di Newton su forme quadratiche (e quindi le radici del quadratico sono risolte) e deflazione. È facilmente implementabile e ci sono anche alcune implementazioni disponibili sul web.