Sie alle kennen die Newton-Methode, um die Wurzeln einer Funktion zu approximieren, nicht wahr? Mein Ziel bei dieser Aufgabe ist es, Ihnen einen interessanten Aspekt dieses Algorithmus vorzustellen.
Newtons Algorithmus konvergiert nur für bestimmte, vor allem aber für komplexe Eingabewerte. Wenn Sie sich die Konvergenz der Methode für alle Eingabewerte über die komplexe Ebene vorstellen, erhalten Sie normalerweise ein schönes Fraktal wie das folgende:
Spezifikationen
Ziel dieser Aufgabe ist es, solche Fraktale zu generieren. Dies bedeutet, dass Sie ein Polynom als Eingabe erhalten und das entsprechende Fraktal als Bild in einem Format Ihrer Wahl als Ausgabe ausdrucken müssen.
Eingang
Die Eingabe ist eine durch Leerzeichen getrennte Liste komplexer Zahlen. Sie sind im Stil niedergeschrieben <Real part><iImaginary part>
, wie diese Zahl ein : 5.32i3.05
. Sie können davon ausgehen, dass die eingegebene Zahl nicht mehr als 4 Dezimalstellen hat und kleiner als 1000 ist. Die erste von ihnen darf nicht Null sein. Dies könnte beispielsweise eine Eingabe für Ihr Programm sein:
1 -2i7.5 23.0004i-3.8 i12 0 5.1233i0.1
Die Zahlen werden als Koeffizienten eines Polynoms interpretiert, beginnend mit der höchsten Potenz. Im Rest dieser Beschreibung wird das Eingabepolynom P genannt . Die obige Eingabe entspricht diesem Polynom:
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
Die Eingabe kann entweder von stdin, von einem an das Programm übergebenen Argument oder von einer an Ihr Programm angezeigten Eingabeaufforderung kommen. Sie können davon ausgehen, dass die Eingabe keine führenden oder nachfolgenden Leerzeichen enthält.
Rendern
Sie müssen das Fraktal folgendermaßen rendern:
- Wählen Sie so viele Farben wie die Wurzeln von P und eine zusätzliche Farbe für die Divergenz
- Bestimmen Sie für jede Zahl in der sichtbaren Ebene, ob die Methode konvergiert und wenn ja, zu welcher Wurzel. Färben Sie den Punkt entsprechend dem Ergebnis.
- Drucken Sie keine Lineale oder andere ausgefallene Dinge
- Drucken Sie einen schwarzen Punkt an den Punkten, die die Polynomwurzeln zur Orientierung darstellen. Sie können bis zu vier Pixel um jede Wurzel drucken.
- Suchen Sie nach einer Möglichkeit, die sichtbare Ebene so zu wählen, dass alle Wurzeln unterscheidbar und möglichst weit verteilt sind. Obwohl eine perfekte Platzierung des Ausgaberahmens nicht erforderlich ist, behalte ich mir das Recht vor, die Annahme einer Antwort zu verweigern, die den Rahmen in nicht akzeptabler Weise auswählt, z. immer bei den gleichen Koordinaten, alle Wurzeln sind in einem Punkt usw.
- Das Ausgabebild sollte eine Größe von 1024 * 1024 Pixel haben.
- Die Renderzeit beträgt maximal 10 Minuten
- Die Verwendung von Gleitkommawerten mit einfacher Genauigkeit ist ausreichend
Ausgabe
Die Ausgabe sollte ein Raster-Grafikbild in einem Dateiformat Ihrer Wahl sein, das von Standardsoftware für ein Brand X-Betriebssystem gelesen werden kann. Wenn Sie ein seltenes Format verwenden möchten, sollten Sie einen Link zu einer Website hinzufügen, auf der Sie einen Viewer herunterladen können.
Gib die Datei auf stdout aus. Wenn Ihre Sprache es nicht unterstützt, etwas auf Standard zu setzen, oder wenn Sie diese Option als weniger praktisch empfinden, suchen Sie einen anderen Weg. In jedem Fall muss es möglich sein, das generierte Bild zu speichern.
Beschränkungen
- Keine Bildverarbeitungsbibliotheken
- Keine fraktalerzeugenden Bibliotheken
- Der kürzeste Code gewinnt
Erweiterungen
Wenn Ihnen diese Aufgabe gefällt, können Sie versuchen, die Punkte nach der Konvergenzgeschwindigkeit oder nach anderen Kriterien einzufärben. Ich würde gerne interessante Ergebnisse sehen.