2013-03-13 15 views
14

Sto cercando di trovare un modo per calcolare le radici di un polinomio con coefficienti complessi in Java (ovvero un equivalente di ciò che è ridicolmente facilmente fatto con roots() in MATLAB).Ricerca di radici polinomiali a coefficiente complesso in Java

Sono pronto a ricodificare un algoritmo di individuazione radice che costruisce la matrice compagna e quindi utilizza la decomposizione a autovalore generalizzata per trovare le radici, ma per questo avrei bisogno di una libreria che gestisca operazioni con matrici a valori complessi.

Ho cercato per un po 'e niente di convincente sembra essere disponibile là fuori, il che penso sia piuttosto strano. Poi, vorrei chiederti:

  1. Sai una (stabile) libreria Java che esegue scoperta di root su polinomi definiti dai coefficienti complessi?

  2. Conoscete una libreria Java (stabile) che esegue evd, svd, inverse, ecc. Su matrici con valore COMPLEX?

Nota: Ho già guardato JAMA (non gestisce complessi), Java Scientific Library di Michael Thomas Flanagan (non più disponibile), Colt (non sembra gestire complessi), efficiente Java Matrix Libreria (nessun complesso), DDogleg Numerics (non gestisce il polinomio con coefficienti complessi), JScience (non chiaro se evd è disponibile) e common-math da Apache (non è chiaro se consentono matrici complesse e se sì, se evd è disponibile).

risposta

3

Durand-Kerner method funziona anche con coefficienti complessi e non si basa su calcoli a matrice.

È abbastanza semplice da implementare, è possibile implementare un'implementazione di Google (Stackoverflow mi impedisce di collegare quello trovato) o di crearne uno personalizzato. È possibile utilizzare la libreria jscience per i tipi di dati complessi, non per l'algoritmo stesso.

EDIT: Non ho visto che hai bisogno di evd anche, non importa che la mia menzione di jscience sia un'opzione per eseguire la complessa matematica delle matrici.

+0

Grazie mille! Questo metodo è stato davvero facile da implementare, e sto ottenendo buoni risultati come quello - problema risolto. – Virginie

1

Se si desidera mantenerlo reale, utilizzare Bairstow method. Se il polinomio ha un grado strano, utilizzare prima Newton's method per trovare una radice reale e ridurre il polinomio in modo uniforme. Questo evita una strana singolarità del metodo Bairstow in cui converge verso un polinomio quadratico che ha l'infinito come una radice. Informazioni di buona qualità possono essere trovate nei soliti posti. Alcuni di essi sono stati scritti o modificati dal sottoscritto.

Determinare un raggio della radice interna r e utilizzare z^2-2r * cos (phi) * z + r^2 con angolo casuale phi come fattore iniziale per il metodo di Bairstow. Produce in ogni passaggio un fattore quadratico, sempre in e con coefficienti reali, contenente una coppia di radici reali o una coppia coniugata di radici complesse.

Verificare in ogni passaggio la velocità di convergenza e riavviare con un altro punto iniziale, se necessario. Trova nuove radici dopo la deflazione e lucida le radici o i fattori quadratici eseguendo il metodo con il polinomio originale e i fattori come punto di partenza.

Problemi correlati