Conoscete tutti il metodo Newton per approssimare le radici di una funzione, vero? Il mio obiettivo in questo compito è di introdurti in un aspetto interessante di questo algoritmo.
L'algoritmo di Newton converge solo per determinati, ma soprattutto valori di input complessi. Se immagini la convergenza del metodo per tutti i valori di input sul piano complesso, di solito ottieni un bellissimo frattale come questo:
Immagine dai beni comuni di Wikimedia
specificazioni
L'obiettivo di questo compito è generare tali frattali. Ciò significa che ottieni un polinomio come input e devi stampare il frattale corrispondente come immagine in un formato a tua scelta come output.
Ingresso
L'input è un elenco separato da spazi bianchi di numeri complessi. Essi sono svalutate in stile <Real part><iImaginary part>
, come questo numero: 5.32i3.05
. Si può presumere che il numero di input non abbia più di 4 cifre decimali e sia inferiore a 1000. Il primo di essi non deve essere zero. Ad esempio, questo potrebbe essere un input per il tuo programma:
1 -2i7,5 23.0004i-3,8 i12 0 5.1233i0.1
I numeri sono interpretati come i coefficienti di un polinomio, a partire dalla massima potenza. Per tutto il resto di questa descrizione, il polinomio di ingresso viene chiamato P . L'input sopra è uguale a questo polinomio:
f (x) = x 5 + (-2 + 7.5 i ) x 4 + (23.0004 - 3.8 i ) x 3 + 12 i x 2 + 5.1233 + 0.1 i
L'input può provenire da stdin, da un argomento passato al programma o da un prompt visualizzato nel programma. Si può presumere che l'input non contenga caratteri di spazi bianchi iniziali o finali.
interpretazione
Devi eseguire il rendering del frattale nel modo seguente:
- Scegli tanti colori quante le radici di P e un colore in più per la divergenza
- Per ogni numero nel piano visibile, determinare se il metodo converge e se sì in quale radice. Colora il punto in base al risultato.
- Non stampare righelli o altre cose fantasiose
- Stampa un punto nero nei punti, che sono le radici dei polinomi per l'orientamento. È possibile stampare fino a quattro pixel attorno a ciascuna radice.
- Trova un modo per scegliere il piano visibile in un modo, in modo che tutte le radici siano distinguibili e si diffondano ampiamente su di esso, se possibile. Sebbene non sia necessario un perfetto posizionamento del frame di output, mi riservo il diritto di rifiutare di accettare una risposta che scelga il frame in modo inaccettabile, ad es. sempre alle stesse coordinate, tutte le radici sono in un punto, ecc.
- L'immagine in uscita dovrebbe avere una dimensione di 1024 * 1024 pixel.
- Il tempo di rendering è massimo di 10 minuti
- L'uso di valori a virgola mobile a precisione singola è sufficiente
Produzione
L'output dovrebbe essere un'immagine grafica raster in un formato di file a tua scelta, leggibile da software standard per un sistema operativo di marca X. Se si desidera utilizzare un formato raro, prendere in considerazione l'aggiunta di un collegamento a un sito Web in cui è possibile scaricare un visualizzatore per esso.
Invia il file a stdout. Se la tua lingua non supporta l'inserimento di qualcosa in stdout o se trovi questa opzione meno conveniente, trova un altro modo. In ogni caso, deve essere possibile salvare l'immagine generata.
restrizioni
- Nessuna libreria di elaborazione delle immagini
- Nessuna libreria generatrice di frattali
- Vince il codice più corto
estensioni
Se ti piace questa attività, puoi provare a colorare i punti in base alla velocità di convergenza o ad altri criteri. Mi piacerebbe vedere alcuni risultati interessanti.