Mandelbrotmenge 1. Iter. Diagonale

foerster7891

Aktives Mitglied
Hi,

wollte fragen ob mir jemand erklären kann, warum bei der Berechnung der Mandelbrotmenge in der 1. Iteration immer nur ne Diagonal rauskommt. Es muss eigentlich nen Kreis rauskommen mit dem Radius 2.

Java:
double zx, zy, cx = -2.66, cy;
		do {
			cy = -2;
			do {
				zx = 0;
				zy = 0;
				for ( int i = 1; i <= 1; i++ ) {
					zx = zx * zx + cx;
					zy = zy * zy + cy;
				}
                                //überprüft in der Abfrage auf Abstand von 2 von (x,y) zum Nullpunkt
				if ( Math.sqrt( Math.pow( Math.abs(zx), 2 ) + Math.pow( Math.abs(zy), 2 ) ) <= 2 ) {
					image.setPixel( ( int ) ( -800 / 5.32 * cx + width / 2 ), ( int  ) ( -600 / 5.32 * cx + height / 2 ), Color.black);
				}
				cy += 0.005;
			} while ( cy <= 2 );
			cx += 0.005;
		} while ( cx <= 2.66 );
 
Zuletzt bearbeitet:

Bernd Hohmann

Top Contributor
Darum:
Code:
for ( int i = 1; i <= 1; i++ ) {

Ansonsten hier ein Rechenbeispiel für eine Ascii-Darstellung.


Java:
package de.harddiskcafe.draw;

public class Mandel {
	public static void main(String a[]) {
		float b, e, r, n, d;
		int h;
		for (e = 1.1f; e > -1.2; e -= .1) {
			for (b = -2; b < 1; b += .04) {
				r = n = 0;
				for (h = 127; r * r + n * n < 4 && --h > 32;) {
					d = r;
					r = r * r - n * n + b;
					n = 2 * d * n + e;
				}
				System.out.write(b > 0.98 ? 10 : h);
			}
		}
	}
}
 

foerster7891

Aktives Mitglied
sry ich versteh weder ihr Beispiel, noch was an meiner Schleife falsch sein soll.

die letzte (3.) Schleife ist doch dazu da die Iterationstiefe festzulegen. Solange ich dort bei einer iterationstiefe von 1 bleibe - ein durchlauf durch die Schleife. Müsste doch ein Kreis ausgegeben werden.

Ich glaube gerne, dass sie möglicherweise falsch ist, nur finde ich den Fehler leider nicht. Könnten Sie mir möglicher weise den Fehler erklären?
 

Bernd Hohmann

Top Contributor
Java:
public class Test {
	public static void main(String str[]) {
		for (int i = 1; i <= 1; i++) {
			System.out.println(i);
		}

	}
}

Ausgabe:
Code:
1

Die Schleife wird genau 1x durchlaufen.

Bernd
 

njans

Top Contributor
Das Beispiel ist ja auch absolut unleserlich und unverständlich. Die variablen sagen nichts aus, was da genau mathematisch passiert, ist auch nicht ersichtlich.
 

foerster7891

Aktives Mitglied
Ja richtig, ich wollte die Schleife genau einmal durchlaufen lassen für jede mögliche Kombination von x und y um so als erstes einen Kreis zu bekommen. Wenn ich es dann öfter durchlaufen lasse später bekomm ich dann eine immer genauere Mandelbrotmenge.
Allerdings bekomm ich bei meiner Variante irgendwie nur nen Strich von links oben nach rechts unten.
Den Teil versteh ich nicht. Versuch schon den ganzen Tag den Fehler zu finden kann ihn aber nicht entdecken.

Aso und die Variablen bei mir sind:

z = z^2 + c

und dann hab ich die halt nur in Real und Imaginärteil zerlegt
 
Zuletzt bearbeitet:
D

Dow Jones

Gast
Könnte es daran liegen? ;)

image.setPixel( ( int ) ( -800 / 5.32 * cx + width / 2 ), ( int ) ( -600 / 5.32 * cx + height / 2 ), Color.black);

PS @Bernd: Dein Apfelmännchen für die Console finde ich top! :applaus:
 

foerster7891

Aktives Mitglied
thx

omg omg omg
4h oder so und ich hab den fehler überall gesucht

warum war der da????

UNFAIR


edit:
Äh es geht nur für den ersten rekursionsschritt auf für die anderen funktioniert es immer noch nicht
 
Zuletzt bearbeitet:

foerster7891

Aktives Mitglied
Da ich meinen Beitrag nicht mehr editieren kann, wollte ich hier den Fehler beschreiben:

Also wenn ich die iteration erhöhe auf 2 kommt ein Viereck mit abgerundeten Ecken und insgesamt leicht schiefen Kanten raus. Das wird dann immer schlimmer. Irgendwann ist innen drin eine Art Rastermuster an der unteren rechten Ecke.

Da ich relativ sicher bin, dass meine Formel stimmt weiß ich leider nicht wo der Fehler herkommt.
Hoffe jemand von euch weiß es, bzw. sieht wo und wie ich die Formel für die Mandelbrotmenge falsch benutze.

Aktuell der Code:
Java:
		double zx, zy, cx = -2.66, cy;
		do {
			cy = -2;
			do {
				zx = 0;
				zy = 0;
				for ( int i = 1; i <= 1; i++ ) {
					zx = zx * zx + cx;
					zy = zy * zy + cy;
				}
				if ( Math.sqrt( Math.pow( zx, 2 ) + Math.pow( zy, 2 ) ) <= 2 ) {
					image.setPixel( ( int ) ( -height / 5.32 * cx + height/2 + 100 ), ( int  ) ( -height / 5.32* cy + height/2 ), Color.black);
				}
				cy += 0.005;
			} while ( cy <= 2 );
			cx += 0.005;
		} while ( cx <= 2.66 );

Ps.: gerade eben mal die Konsolenmandelbrotmenge angeschaut - sieht schon geil aus, trotzdem blick ich nicht was er da genau gemacht hat. Wenn also meine Gleichung falsch ist, würd ich mich freuen, wenn es mir jemand sagt und vllt auch sagt wie es richtig geht.
 
Zuletzt bearbeitet:

Bernd Hohmann

Top Contributor
Ps.: gerade eben mal die Konsolenmandelbrotmenge angeschaut - sieht schon geil aus, trotzdem blick ich nicht was er da genau gemacht hat. Wenn also meine Gleichung falsch ist, würd ich mich freuen, wenn es mir jemand sagt und vllt auch sagt wie es richtig geht.

Schau mal nach in Mandelbrot-Menge ? Wikipedia im Abschnitt "Iteration eines Bildpunktes"

Erstmal geht es um die Folge z_{n+1} = z_n^2 + c im komplexen Zahlenraum. Also Quadrierung einer komplexen Zahl und Addition einer Konstanten. Das lässt sich mit dem Wissen aus Wikpedia zum Thema Komplexe Zahl ? Wikipedia relativ einfach in einen Real- und Imaginärteil auflösen. Nach Ausmultiplikation dann sowas heraus, was ich in meinem Beispiel in der "for" Schleife angeführt habe

Ich kann Dir gerne auch eine Lösung posten, aber der komplexe Zahlenraum ist zum einen sehr einfach zu begreifen wenn es nur um addition geht und zum anderen auch sehr spannend sodass ich Dir etwas Einarbeitung anrate.

Bernd
 

foerster7891

Aktives Mitglied
Also wenn man sich dort mal Galerie der Iterationen anguckt(auf der Wiki), sieht man super was dort eigentlich passiert, deshalb hatte ich mir dies bereits angesehen und auch die verwendung der Gleichung ist dort super erklärt.

Ich kann auch mit komplexen Zahlen rechnen sie in allen Möglichen Weisen umformen in irgendwelchen Normen und Metriken darstellen...

trotzdem versteh ich nicht warum mein Programm nicht geht. Ich habe die Gleichung für komplex und für real teil geschrieben, dass ist jeweils zx und zy genauso wie cx und cy. Und ich rechne dann einfach:

zx:=zx^2+cx
zy:=zy^2+cy
->z:=zx+i*zy=(zx+i*zy)^2+cx+i*cy

und die iterationsschritte sagen einfach nur aus, wie oft ich es ausführe
dies tue ich dann für jedes cx zwischen -2 und 2; cy zwischen -2,66 und 2,66
und überprüfe dann auf den Betrag von z nach x iterationsschritten ob er <=2 ist.
Wenn das zutrifft zeichne ich die Koordinate der gaußschen Zahlenebene schwarz. Allerdings macht mein Programm es nicht so wie ich es will.

PS.: fügt mal eine Möglichkeit Latex zu verwenden ein plz.
 

Bernd Hohmann

Top Contributor
Ich habe die Gleichung für komplex und für real teil geschrieben, dass ist jeweils zx und zy genauso wie cx und cy. Und ich rechne dann einfach:

zx:=zx^2+cx
zy:=zy^2+cy

Im komplexen Zahlenraum kann man z²+c nicht so nach real²+c und imag²+c auflösen. Ich habe mir das vor 25 Jahren und nochmal vor 10 Jahren selber beibringen müssen - verzeihe einem alten Sack, dass ich zu später Stunde dazu keine Lust habe das nochmal zu tun :)

Eines weiss ich noch: eine Komplexe Zahl besteht aus einem Real- und Imaginäranteil (letzterer als "i" bezeichnet und für den gilt i²=-1)

z(real) = z*z + c(real)
z(imag) = zi * zi + c(imag)

Und ab da verlassen sie mich - vielleicht hat einer der Kollegen die Herleitung noch im Kopf.

Bernd
 

foerster7891

Aktives Mitglied
naja so hab ich garnicht gedacht, stimmt:

phi = arcsin(zx/sqrt(zx^2+zy^2))=arccos(zy/sqrt(zx^2+zy^2))

z=(zx^2+zy^2)*e^(phi*i)^2=(zx^2+zy^2)*e^(phi*i*2)
zx= (zx^2+zy^2)*cos(phi*2)=(zx^2+zy^2)*cos(arccos(zy/sqrt(zx^2+zy^2))*2)=(zx^2+zy^2)*(zx/sqrt(zx^2+zy^2))*2
zx= (zx^2+zy^2)*sin(phi*2)=zx=(zx^2+zy^2)*sin(arcsin(zx/sqrt(zx^2+zy^2))*2)=(zx^2+zy^2)*(zx/sqrt(zx^2+zy^2))*2

könntest du mir dann vllt. doch bitte die Lösung geben, ich würde gerne schlafen gehen und das jetzt noch entsprechend zu vereinfachen, dazu bin ich echt zu müde^^
 
Zuletzt bearbeitet:

Bernd Hohmann

Top Contributor
nein nein nein - das lässt sich alles über i² = -1 und normale multiplikation/addition auflösen. Man muss sich nur überwinden und akzeptieren, dass i² = -1 ist und das an entsprechender Stelle gnadenlos einsetzen. Also auch nichts mit Polarkoordinaten. Irgendwo kam noch der Binomische Satz (a + b)² = a² + 2ab + b² vor (das 2ab findet sich in meinem Beispiel wieder) zum tragen.

Ich will Dir leider nicht weiterhelfen - entweder ich gehe nicht ins Bett oder Du (und ich brauche langsam mal etwas Ruhe) :)

Bernd
 
Zuletzt bearbeitet:

foerster7891

Aktives Mitglied
Habs!

Java:
		double zx, tmp, zy, cx = -2.66, cy;
		do {
			cy = -2;
			do {
				zx = 0;
				zy = 0;
				for ( int i = 1; i <= 30; i++ ) {
					tmp = zx * zx - zy * zy + cx;
					zy = 2 * zx * zy + cy;
					zx = tmp;
				}
				if ( Math.sqrt( Math.pow( zx, 2 ) + Math.pow( zy, 2 ) ) <= 2 ) {
					image.setPixel( ( int ) ( -height / 2.66 * cx + height / 2 ), ( int  ) ( height / 2.66 * cy + height / 2 ), Color.black);
				}
				cy += 0.001;
			} while ( cy <= 2 );
			cx += 0.001;
		} while ( cx <= 2.66 );

Danke nochmal an alle!
 

Ähnliche Java Themen

Neue Themen


Oben