Optimierung meines Mandelbrot-Explorers
-
@RudiMBM
Also anders gesagt: du nimmst in Kauf dass dein "effektives" Epsilon abhängig vom Betrag von z schwankt. Korrekt?Dann kann mMn. der Unterschied nur mehr sein dass deine "Variante 1" die Konvergenz mit weniger Zyklen erkennt als die auf meinem Vorschlag basierende "Variante 2". Denn wenn du dir die Anzahl an Operationen ansiehst die du hier pro Schritt benötigst, also speziell die Multiplikationen, dann können eine Subtraktion und ein Vergleich das nicht so drastisch langsamer machen.
BTW: Hast du mal probiert was passiert wenn du beide Abbruchbedingungen kombinierst? Also eine Variante "1&2"?
-
@hustbaer sagte in Optimierung meines Mandelbrot-Explorers:
Also anders gesagt: du nimmst in Kauf dass dein "effektives" Epsilon abhängig vom Betrag von z schwankt. Korrekt?
Wieso soll es schwanken? Epsilon und Epsilon² ist über alle Bildpunkte und Zwischeniterationsergenisse eine Konstande. Ich hab es ja schon mal erwähnt: Die Hüllkurve. zB. c = (0.5,0.5) das ist ein Grundzyclus. Im Verlauf der Iteration werden sich die Iterationsergenisse einem bestimmt Punkt z annähern. Dadurch werden sich der Betrag(z von i) und der Betrag(z von i-x) annähern. Unterschreitet die Differenz Epsilon dann.... Erstaunlicher Weise funktioniert das auch bei allen anderen Zyclen. (Aber die Begründung dafür würde einen neuen Thread benötigen)
"Variante 1" die Konvergenz mit weniger Zyclen erkennt als die auf meinem Vorschlag basierende "Variante 2"
Ich bin nicht sicher wieviele Iterationen jeweils nötig sind, vielleich sogar mehr, aber es ist sicher, dass in Vers.1 viel weniger Codezeilen pro Iteration ausgeführt werden.
zu BTW: ich hab keinen Plan dazu.
Jetzt sollte aber noch der Begriff "Zyclus" vs. Iteration geklärt werden, wie mir auffällt. Ich glaube wir sprechen da von verschiedenen Parametern. c = (-1|0) wäre ein 2er Zyclus.
-
Wieso soll es schwanken? Epsilon und Epsilon² ist über alle Bildpunkte und Zwischeniterationsergenisse eine Konstande.
Ja, sorry, ich hab das wohl etwas zu undeutlich formuliert. Mit "effektives" Epsilon meine ich die Distanz (
|a-b|
) zwischen den beiden Punkten. Da du eine andere Formel für das Abbruchkriterium verwendest (a²-b²
) gibt es keinen fixen Grenzwert für die Distanz|a-b|
.Jetzt sollte aber noch der Begriff "Zyclus" vs. Iteration geklärt werden, wie mir auffällt.
Sorry, ich meinte damit Iterationen.
aber es ist sicher, dass in Vers.1 viel weniger Codezeilen pro Iteration ausgeführt werden.
Naja, wie viele Codezeilen es sind ist nicht unbedingt wichtig, weil nicht jede Codezeile gleich lange dauert. Eine Addition von zwei 360 Bit Zahlen ist viel schneller als eine Multiplikation von zwei solchen Zahlen und diese ist wiederrum viel schneller als eine Division usw.
Ist dein Code Open-Source? Falls ja könnte ich mir den ja mal ansehen und selbst ein wenig damit rumspielen.
-
@hustbaer Hätte ich nichts dagegen. Der Code ist bisher privat und unveröffendlicht. Was interessiert Dich? Der ganze Explorer, oder nur Fixpoint (Ist nur für diese Anwendung gemacht (geeignet?)). Ist halt alles mit c++Builder 2009 gemacht und nicht unbedingt State of the Art.
|a-b| wäre natürlich ideal. Aber 1. will nicht Rechnzeit mit sqrt() verschwenden, und 2. a²-b² funktioniert annähernd genausgut.
-
OK. Ich hab meine aktuelle Programmversion auf https://github.com/RudiMBM/DeepChaos bereitgestellt. Da ist das, was hier besprochen wurde, schon drin.
Ich wünsch einen schönen Osterspaß.
-
Danke. Und sorry für die späte Antwort. Ich werde es mir mal ansehen, schauen ob ich das mit Visual Studio zum Laufen bekommen.
ps: Achje, nein, wenn dann hätte mich der Source interessiert. Um verschiedene Dinge auszuprobieren.
-
@hustbaer Ich hab gezögert, ich glaub nicht, dass es mit was anderem als Borlandc++2009 compilierbar ist. Ich hab den Fehler begangen LMD-Tools einzubinden. Nach nem Absturz 2012 hatte immense Probleme das zu rekonstruieren. Ich kann zum anschauen schon Source reinstellen. Compilieren aber habe ich wenig Hoffnung. Und welche Funktionen interessieren Dich? Könnte sein, dass diese über einige Classen verteilt sind. Ein gewöhliches MBM-Programm, wie es hundertfach auf Github gibt, ist meines nicht. Und wenn Du an der Source rumschrauben willst, wirst Du dich erst mal ne längere Weile einfuchsen müssen. Liegt nicht an Dir, ich habs kompliziert gemacht. Ich das Projekt seit 8 Jahren nicht angefasst, jetzt in Quaratäne war mir langweilig und ich habs wieder ausgegraben. Ich musste selber wieder reinkommen.
Hast Du die exe wenigstens mal ausprobiert?
-
Hallo, ich habe nun auch Sourcecode nach github kopiert. Ich bin gespannt, was Ihr damit macht. Ich hoffe, Ihr teilt mir das mit.
-
Ah, ja, ich hatte die Hoffnung gehabt dass man das mit mittlerem Aufwand mit nem anderen Compiler zum Laufen bekommen könnte. Dann wäre es einfach gewesen da ein paar Änderungen zu machen und zu schauen was die bringen. Aber sieht so aus als wäre das ziemlich unmöglich
Macht nix. Trotzdem danke für's Hochladen!
-
Es klingt so, als hättest Du eine Idee. Falls Du sie mir mitteilen willst, kann ich sie ja einbauen und guggen was passiert. Wenn nicht, wäre es schade, es hat bisher Spass gemacht.
-
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!