Vous connaissez tous la méthode de Newton pour approximer les racines d'une fonction, n'est-ce pas? Mon objectif dans cette tâche est de vous présenter un aspect intéressant de cet algorithme.
L'algorithme de Newton ne converge que pour certaines, mais surtout pour les valeurs d'entrée complexes. Si vous imaginez la convergence de la méthode pour toutes les valeurs d'entrée sur le plan complexe, vous obtenez généralement une belle fractale comme celle-ci:
Caractéristiques
Le but de cette tâche est de générer de telles fractales. Cela signifie que vous obtenez un polynôme en entrée et que vous devez imprimer la fractale correspondante en tant qu'image dans un format de votre choix en tant que sortie.
Contribution
L'entrée est une liste de nombres complexes séparés par des espaces. Ils sont écrits dans le style <Real part><iImaginary part>
, comme ce numéro: 5.32i3.05
. Vous pouvez supposer que le nombre d'entrée n'a pas plus de 4 décimales et est inférieur à 1000. Le premier d'entre eux ne doit pas être nul. Par exemple, cela pourrait être une entrée pour votre programme:
1 -2i7,5 23,0004i-3,8 i12 0 5,1233i0,1
Les nombres sont interprétés comme les coefficients d'un polynôme, en commençant par la puissance la plus élevée. Dans le reste de cette description, le polynôme d'entrée est appelé P . L'entrée ci-dessus est égale à ce polynôme:
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'entrée peut vous venir soit de stdin, soit d'un argument passé au programme, soit d'une invite affichée à votre programme. Vous pouvez supposer que l'entrée ne contient aucun espace blanc de début ou de fin.
Le rendu
Vous devez rendre la fractale de la manière suivante:
- Choisissez autant de couleurs que de racines de P plus une couleur supplémentaire pour la divergence
- Pour chaque nombre dans le plan visible, déterminez si la méthode converge et si oui vers quelle racine. Colorez le point en fonction du résultat.
- N'imprimez pas de règles ou d'autres objets de fantaisie
- Imprimez un point noir aux points, qui sont les racines des polynômes d'orientation. Vous pouvez imprimer jusqu'à quatre pixels autour de chaque racine.
- Trouvez un moyen de choisir le plan visible de manière à ce que toutes les racines se distinguent et se propagent largement à travers celui-ci, si possible. Bien qu'un placement parfait du cadre de sortie ne soit pas requis, je me réserve le droit de refuser d'accepter une réponse qui choisit le cadre d'une manière inacceptable, par exemple. toujours aux mêmes coordonnées, toutes les racines sont en un seul point, etc.
- L'image de sortie doit avoir une taille de 1024 * 1024 pixels.
- Le temps de rendu est de 10 minutes maximum
- L'utilisation de valeurs à virgule flottante simple précision suffit
Sortie
La sortie doit être une image graphique raster dans un format de fichier de votre choix, lisible par un logiciel standard pour un système d'exploitation de marque X. Si vous souhaitez utiliser un format rare, pensez à ajouter un lien vers un site Web où l'on peut télécharger une visionneuse pour celui-ci.
Sortez le fichier sur stdout. Si votre langue ne prend pas en charge la mise de quelque chose sur stdout ou si vous trouvez cette option moins pratique, trouvez un autre moyen. De toute façon, il doit être possible d'enregistrer l'image générée.
Restrictions
- Aucune bibliothèque de traitement d'image
- Aucune bibliothèque génératrice de fractales
- Le code le plus court gagne
Extensions
Si vous aimez cette tâche, vous pouvez essayer de colorer les points en fonction de la vitesse de convergence ou d'autres critères. J'aimerais voir des résultats intéressants.
Réponses:
Python,
827777 caractèresLes trouvailles affichent les limites (et les racines) en trouvant des points de convergence pour un groupe d'échantillons aléatoires. Il trace ensuite le graphique en calculant les points de convergence pour chaque point de départ et en utilisant une fonction de hachage pour obtenir des couleurs aléatoires pour chaque point de convergence. Regardez de très près et vous pouvez voir les racines marquées.
Voici le résultat de l'exemple de polynôme.
la source
Java,
1093 1058 10991077 caractèresL'entrée est des arguments de ligne de commande - par exemple, run
java F 1 0 0 -1
. La sortie est à stdout au format PPM (pixmap ASCII).L'échelle est choisie en utilisant la borne de Fujiwara sur la valeur absolue des racines complexes d'un polynôme; Je multiplie ensuite celui lié par 1,5. J'ajuste la luminosité par le taux de convergence, donc les racines seront dans les patchs les plus brillants. Par conséquent, il est logique d'utiliser du blanc plutôt que du noir pour marquer les emplacements approximatifs des racines (ce qui me coûte 41 caractères pour quelque chose qui ne peut même pas être fait "correctement". Si j'étiquette tous les points qui convergent à moins de 0,5 pixel d'eux-mêmes) alors certaines racines sortent sans étiquette; si j'étiquette tous les points qui convergent à moins de 0,6 pixels d'eux-mêmes, alors certaines racines sortent étiquetées sur plus d'un pixel; donc pour chaque racine j'étiquette le premier point rencontré pour converger à moins de 1 pixel de lui-même ).
Image pour l'exemple de polynôme (converti en png avec le GIMP):
la source
x^6-9x^3+8
, soigneusement conçue en choisissant les racines puis en utilisant Wolfram Alpha pour simplifier le polynôme. Ok, j'ai triché en échangeant les teintes après dans le GIMP.Python, 633 octets
Après les accélérations et l'embellissement (756 octets)
Le graphique ci-dessous concerne la fractale de Newton de la fonction log (z).
la source
;
. Supprimez également tous les espaces possibles.matplotlib
ici), donc aucune garantie qu'il fonctionne toujours.