Soluzione di equazione quartica


10

Esiste un'implementazione C aperta per la soluzione di equazioni quartiche:

ax+bx³+cx²+dx+e=0

Sto pensando a un'implementazione della soluzione Ferrari. Su Wikipedia ho letto che la soluzione è stabile computazionale solo per alcune delle possibili combinazioni di segni dei coefficienti. Ma forse sono fortunato ... Ho ottenuto una soluzione pragmatica risolvendo analiticamente usando un sistema di algebra del computer ed esportando in C. Ma se c'è un'implementazione testata preferirei usare questo. Cerco un metodo veloce e preferisco non usare un root finder generale.

Ho bisogno solo di soluzioni reali.


Hai bisogno di tutte le soluzioni (reali) contemporaneamente? Come dice GertVdE di seguito, se si hanno problemi di stabilità con una soluzione a forma chiusa, non c'è davvero un buon motivo per non usare un algoritmo di ricerca delle radici.
Godric Seer,

3
Trovo divertente che questo fosse etichettato algebra non lineare, dal momento che potevi semplicemente calcolare gli autovalori della matrice compagna, che è già in forma di Hessenberg e l'applicazione di QR sweep sarebbe piuttosto semplice.
Victor Liu,

2
Dai un'occhiata ai solutori cubici / quartici pubblicati in ACM TOMS (Algorithm 954) . Il codice che arriva a quel giornale è di solito di altissima qualità. Il documento stesso è dietro un paywall ma il codice può essere scaricato da questo link .
GoHokies,

... (modifica successiva) il codice ACM è scritto in FORTRAN 90 ma la mia prima impressione è che si possa chiamarlo da C senza fare troppi sforzi.
GoHokies,

1
@GoHokies Penso che dovresti convertire il tuo commento in una risposta perché penso che sia una buona risposta a questa domanda. Soprattutto perché il documento collegato riesce a evitare le solite instabilità numeriche, e non è assolutamente una cosa da poco.
Kirill,

Risposte:


20

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±b24ac2a
b4ac
x1=(b+sign(b)b24ac)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(102)O(1015). 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(1011)

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.


1
Potresti spiegare cosa intendi con "Vorrei fortemente sconsigliare l'uso di soluzioni in forma chiusa poiché tendono ad essere numericamente molto instabili". Questo vale solo per i polinomi di 4 ° grado o è una regola generale?
NoChance,

@EmmadKareem Ho aggiornato la mia risposta sopra.
GertVdE,

3

Vedi questi:


2
Usando questo codice sul polinomio con i coefficienti indicati nella mia risposta, trovo quanto segue: , che ha un errore relativo di rispetto alla radice reale (calcolato usando il comando roots di Octave che utilizza il metodo matrix companion). Ha un residuo di mentre la radice del metodo matrice compagno ha un residuo di . Dipende da te se è abbastanza buono (per la computer grafica potrebbe essere, per alcune altre applicazioni, non lo sarà)x1=1.602644912244132e+00O(108)O(107)O(1015)
GertVdE

1

Le ricette numeriche in c forniscono espressione in forma chiusa per radici reali di quadratica e cubica che presumibilmente hanno una discreta precisione. Poiché la soluzione algebrica del quartico comporta la risoluzione di un cubo e quindi la risoluzione di due quadratiche, forse una quartica a forma chiusa con una buona precisione non è fuori discussione.


Ho appena citato la radice dell'esempio cubico entro 2e-16 (un po 'sulla precisione dei miei galleggianti) usando le ricette numeriche in formule cubiche c (press et al). Quindi c'è motivo di sperare.
Nemocopperfield,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.