Optimierung meines Mandelbrot-Explorers
-
Nicht viel mehr als was ich bisher schon geschrieben habe. Ich würde z.B. mal beide Abbruchskriterien gleichzeitig laufen lassen und schauen ob das was bringt. Bzw. es würde mich auch interessieren wieso mein Verfahren langsamer ist als deins -- ich vermute immer noch dass es einfach später (nach mehr Iterationen) abbricht. Denn wie ich schon geschrieben habe: eine Addition/Subtraktion ist viel billiger als eine Multiplikation, speziell bei so grossen Zahlen.
Bzw. ich fände es auch interessant einfach ein paar Dinge mitzufählen. z.B. wie oft wurde Abgebrochen und nach der wie vielten Iteration. Und bei meiner Variante dann auch noch: war der Punkt unmittelbar vor dem Abbruch weiter als z.B. 2 Epsilon entfernt oder nicht? Dann wüsste man wie viele Ausgangswerte zu einem einzigen Wert konvergieren und wie viele in einem stabilen Zyklus enden.
Ebenso fände ich interessant eine andere Abstandsmetrik zu verwenden. Ja, dazu muss man ein klein wenig mehr rechnen, aber dafür kann man auch früher abbrechen. Weil die Fläche von
a²-b²
halt (u.U. deutlich) grösser ist als|a-b|
.
-
Ok, ich mach ne Version, bei der man zwischen beiden Verfahren wählen kann. Mein DeepChaos stellt soviele Analyse-Möglichkeiten bereit, dass Du ermitteln kannst, was dich interessiert. Ich hab ne Bedienungsanleitung angefangen, damit man leichter reinkommt. Dauert aber noch, vielleicht zu lange, bis fertig.
-
@RudiMBM OK. Ich wollte nur sagen: Mach dir bitte keine Arbeit nur wegen mir. Mich interessiert das ein wenig, und wenn es leicht gegangen wäre hätte ich mich kurz damit gespielt. Ich kann aber nicht versprechen dass die Lust mich damit zu beschäftigen auch in ein paar Tagen noch bzw. wieder da ist. (Aktuell z.B. gerade nicht, weil ich in der Arbeit genug zu tun habe.)
Also wenn du es für dich selbst interessant findest, klar, aber nur für mich wäre es vermutlich verschwendete Zeit.
-
Wie auch immer, vieleicht interessiert es ja auch andere.
Ich hab eben eine neue Version wieder auf https://github.com/RudiMBM/DeepChaos reingestellt. Holt Euch die .exe, .ini, .txt und .pdf runter.
Die meisten Einstellungen sind in der .ini vorbereitet.
Um die Unterschiede der hier diskutierten Rechenarten auszutesten, brauchen nur die Parameter für MaxIter, Konvergenzabbruch und Epsilon variiert werden.
Programm starten, Bild1 öffnen und rechnen (r) lassen. Im Bild mit dem Testpunkt (.t) die Werte ablesen (Oder im Cursor-Panel).@hustbaer Mach Dir keinen Kopf - Ich mach das schon seit 20Jahren. Ausserdem ist da ja die Quaratäne. Und Rente hab ich auch schon. Ausserdem hab ich in Version 3 Dein |a-b| programmiert. Ist sehr interesant. Vielleich sogar das beste Verfahren.
-
Also Leute:
Ich bin verwundert, 1400 Klicks hier, schien doch interesse zu bestehen. Selbst wenn 1400/43 Klicks = solten 32 Interessierte vorhandensein. Will denn keiner wissen, wie die finale Lösung programmiert wird? Gibt es keine Neugier mehr? Wie kann dieses Forum funktionieren, wenn keine Fragen mehr gestellt werden? Wenn nur noch Spanner unterwegs sind?
-
Dieser Beitrag wurde gelöscht!
-
@RudiMBM sagte in Optimierung meines Mandelbrot-Explorers:
Wenn nur noch Spanner unterwegs sind?
Ich hatte mir das angeschaut, aber Deine Oberfläche scheint keinerlei Skalierung zu haben. Unter WQHD sind die Beschriftungen kaum zu erkennen, in der selben Größe wie in der pdf, nur kann man dort mit Mausscrollen wenigstens vergrößern.
Die Programmierung und das Thema kann ich nicht beurteilen, vielleicht wenn ich mich selbst mal damit beschäftige. Deshalb ist dieser Beitrag eigentlich schon überflüssig, aber ein Hinweis, warum man nichts dazu schreiben könnte.
-
@RudiMBM sagte in Optimierung meines Mandelbrot-Explorers:
Will denn keiner wissen, wie die finale Lösung programmiert wird?
Mich intertessiert das schon. Allerdings ... also nachfragen wird jetzt keiner kommen. Wenn du nichts weiter schreibst, dann gehe zumindest ich davon aus dass es nix zu berichten gibt, oder du nicht mehr daran interessiert bist es hier zu beschreiben/diskutieren. Was ja auch völlig in Ordnung wäre.
Nachfragen gehe ich nur wenn mich etwas wirklich brennend interessiert bzw. wenn ich etwas brauche/gut brauchen könnte.
-
Hallo, ich muss mich für meinen provokanten Post entschuldigen.
@titan99_ Du hast recht, das will ich bestimmt nicht. Ich hoffe jedoch, dass mehr als Einer was sinnvolles beizutragen hat.
@zeropage Ich hab das Programm noch mit C++Builder5 begonnen, und mühsam nach C++Builder2009 portiert, was wegen der LMD-Tools nicht gleich funktionierte. Damals gab es ja noch nicht mal HD! Zur Zeit arbeite ich mit immer noch 2009er und 2k + 1k Bildschirm. Skalierung war damals nicht nötig. Schon deshalb sollte die Benutzeroberfläche neu erstellt werden. Ich schaff das mit meinen 71Jahren wohl nicht mehr.
@hustbaer Oh, ich bin sehr interessiert, und ich möchte nicht weiter im eigenem Saft schmoren. Deshalb hab ich vor kurzem fast alles auf https://github.com/RudiMBM/DeepChaos als Opensource bereitgestellt. Dort kann man eigenhändig ausprobieren welche Bilder die, hier besprochenen Skripts liefern, wenn man mit den Variablen mal variiert.
Hier noch Script 3 als Pseudocode:
struct RV { float=ci, float=cr, int=ic, float=zq } // zq = ci² + cr² war für Script 1 u. 2 Rv r, rref; float epsylon = 0.000001; rref.ci = rref.cr = 4; rref.ic = 0; loop x, y loop Itermax { r = iterate_1mal(x,y); if ( abs(( r.ci - rref.ci ) + ( r.cr - rref.cr )) < epsylon ) return; //Iterloop ende if ( r.ic == rref.ic ) { rref.ci = r.ci; rref.cr = r.cr; rref.ic *= 2; if ( iterate_end() ) return; }
-
Dieser Beitrag wurde gelöscht!
-
@RudiMBM sagte in Optimierung meines Mandelbrot-Explorers:
if ( abs(( r.ci - rref.ci ) + ( r.cr - rref.cr )) < epsylon ) return;
Also falls das in deinem Programm auch so vorkommt: das ist falsch.
Es müsste heissenif ( (abs( r.ci - rref.ci ) + abs( r.cr - rref.cr )) < epsylon ) return;
-
Hallo, ach du scheiße.... ich hab es nicht richtig beschrieben:
tatsächlich habe ich programmiert:
if ( abs( (abs( r.ci - rref.ci ) + abs( r.cr - rref.cr ))) < epsylon ) return;
ist nicht falsch, aber Deine Version genügt und spart Rechenzeit. Die Bilder funktionieren aber mit beiden Versionen, deshalb hab ich nicht gezweifelt. Ich danke, dass Du mich zum zweifeln gebracht hast und zur Optimierung beigetragen hast.
-
Bitte
-
Lieb...
ich geb es zu, ich hatte bedenken, dass Du zwecks mathematischer Genauigkeit fordern könntest:if ( sqrt( (r.ci - rref.ci )² + ( r.cr - rref.cr )²) < epsylon ) return;
Das würde wegen des begrenzen Zahlenraumes im Computer die Genauigkeit halbieren und ausserdem viel Rechenzeit benötigen. Ohne dies ist es nur eine akzeptable Annäherung.
-
Jetzt bin ich verwirrt. Die Manhatten-Distance (
abs(dx) + abs(dy)
) zu verwenden war doch genau einer meiner Vorschläge. Siehe https://www.c-plusplus.net/forum/topic/351050/optimierung-meines-mandelbrot-explorers/21
-
Hallo. Ja war es. Zum Zeitpunkt der Diskussion war mir nicht klar wie das anzuwenden wäre. Ich war in Version 1 und 2 fixiert auf den Ansatz:
if ( abs( r.zq - rref.zq )) < epsylon ) return; //Iterloop ende
Das ist die Differnz der Strecken r.c -> (0.0,0.0) mit rref.c->(0,0,0.0). Dies lässt aber die Argumente der Vektoren unberücksichtigt. Version 3 dagegen ermittelt, ob sich die Spirale des Iterationsverlaufes den späteren Ziel-Konvergenzkoordinaten nähert. Deshalb entstehen die, nur leicht welligen, Kreise in den Bildern, die die Iterationsnummern repräsentieren, bei der Abgebrochen wird. Ich vermute mit:
if ( sqrt( (r.ci - rref.ci )² + ( r.cr - rref.cr )²) < epsylon ) return;
verschwindet auch die Welligkeit, das ist es mir aber nicht wert.
-
Wenn du die Welligkeit auch noch wegbekommen willst könntest du es auch so machen:
if ( (abs( r.ci - rref.ci ) + abs( r.cr - rref.cr )) < two_epsylon ) { if ( (( r.ci - rref.ci )² + ( r.cr - rref.cr )²) < epsylon_squared ) return; }
Also die schnelle Variante als Vortest verwenden und dann den genauen Test zusätzlich machen.
Ich kann jetzt nicht gut abschätzen wie viel das zusätzlich kosten würde, da ich nicht weiss wie schnell das am Ende konvergiert. Ich vermute aber dass es vermutlich relativ viel kosten würde, weil die meisten Dinge erst schnell und dann immer langsamer konvergieren. Könnte also leicht sein dass du bei sehr vielen Werten den 2. aufwendigeren Test machen musst.
-
Im Prinzip ja. Ich hab aber noch nicht getestet, wie sich der Vers3-Algo auf Iterationsverläufe auswirkt, die erst sehr spät divergieren (i>~100k). Könnte sein, sowas wird der M zugerechnet.
Und im Computer, mit begrenztem Zahlenraum, kommt es zu einem Effekt, den ich als Pseudo-Konvergenz bezeichne. Ich werde in den nächsten Wochen(?) eine Doku.pdf auf GitHub einstellen, wo man dies findet.
Kurzbeschreibung: Wenn die Genauigkeit des Zahlenraumes der Variablen nach vielen Iterationen ausgeschöpft ist, springt sie in einem Zyclus zurück, um immer wieder diesen Zyclus durchzurechnen. Dabei findet keine Konvergenz mehr statt, rechnet aber ewig. Ich hab den Vers.3-Algo noch nicht getestet, ob er diesen Effekt überlebt. Ich vermute, wenn Epsylon allzuklein gewählt ist, tritt dieser Fall ein.
Ich wünschte mir, jemand hat Zeit und Lust mir beim Testen zu helfen.