Optimierung meines Mandelbrot-Explorers



  • @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?


  • Gesperrt

    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;
    	}
    

  • Gesperrt

    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 heissen

    if ( (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.


Anmelden zum Antworten