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.
Antworten:
Python,
827777 ZeichenFindet Anzeigegrenzen (und -wurzeln), indem Konvergenzpunkte für eine Reihe von Zufallsstichproben ermittelt werden. Anschließend wird das Diagramm gezeichnet, indem die Konvergenzpunkte für jeden Startpunkt berechnet und mit einer Hash-Funktion zufällige Farben für jeden Konvergenzpunkt ermittelt werden. Schauen Sie genau hin und Sie können die markierten Wurzeln sehen.
Hier ist das Ergebnis für das Beispielpolynom.
quelle
Java,
1093 1058 10991077 ZeichenEingabe sind Kommandozeilenargumente - zB run
java F 1 0 0 -1
. Die Ausgabe erfolgt im PPM-Format (ASCII-Pixmap).Die Skala wird unter Verwendung des Fujiwara gewählt, der an den Absolutwert der komplexen Wurzeln eines Polynoms gebunden ist; Ich multipliziere dann die Grenze mit 1,5. Ich passe die Helligkeit durch die Konvergenzrate an, so dass die Wurzeln in den hellsten Flecken sind. Daher ist es logisch, Weiß anstelle von Schwarz zu verwenden, um die ungefähren Positionen der Wurzeln zu markieren (das kostet mich 41 Zeichen für etwas, was nicht einmal "richtig" gemacht werden kann. Wenn ich alle Punkte beschrifte, die innerhalb von 0,5 Pixel von sich selbst konvergieren dann kommen einige Wurzeln unbeschriftet heraus; wenn ich alle Punkte beschrifte, die innerhalb von 0,6 Pixeln von sich selbst konvergieren, dann kommen einige Wurzeln über mehr als ein Pixel hinaus beschriftet, so beschrifte ich für jede Wurzel den ersten Punkt, der angetroffen wird, um innerhalb von 1 Pixel von sich selbst zu konvergieren ).
Bild für das Beispielpolynom (mit GIMP in PNG konvertiert):
quelle
x^6-9x^3+8
und sorgfältig entworfen werden, indem man die Wurzeln auswählt und dann Wolfram Alpha verwendet, um das Polynom zu vereinfachen. Ok, ich habe geschummelt, indem ich die Farben hinterher in der GIMP vertauscht habe.Python, 633 Bytes
Nach Beschleunigung und Verschönerung (756 Bytes)
Das folgende Diagramm ist für Newton Fractal der log (z) -Funktion.
quelle
;
. Entfernen Sie auch alle möglichen Leerzeichen.matplotlib
hier), also keine Garantie, dass es immer noch funktioniert.