Lehrer Nussbaumer - JAVA (eine kleine Einführung ;)

Grundlagen

GUI

Eingabe

Ausgabe

Applikationen

  1. Wurfbahnen
  2. Satellitenbahnen
  3. Interaktion
  4. Notizzettel
  5. Typkonvertierung
  6. Rechner
  7. Mandelbrot-Menge
  8. Julia-Menge

Applets

Servlets

Beispiele

Spiele

IDEs

Skriptum

JAVA-DOCS


-----------------
letzte Änderung:
09 December 2021
-----------------
Lehrer Nussbaumers Seite

... in Arbeit ...

Die Julia-Menge

Der französische Mathematiker Gaston Julia hat zu Beginn des 20. Jahrhunderts eine Menge von komplexen Zahlen untersucht. Diese komplexen Zahlen haben die Eigenschaft, dass sie bei der Iteration

z(n+1) = z(n)² + c

konvergieren. Stellt man die komplexen Zahlen, die diese Eigenschaft aufweisen, farblich dar, so erhält man komplizierte Flächenmuster, deren Gestalt von der Wahl der Konstanten c abhängt. Man sich leicht davon überzeugen, dass eine geringfügig anders gewählte Konstante c zu einer deutlich anderen Julia-Menge führt.

Ähnlich wie bei der Mandelbrot-Menge wählen wir ein Quadrat aus der komplexen Zahlenebene aus (Eckpunkt (amin,bmin), Kantenlänge k) und geben eine Konstante c = (a,b) aus. Das (im Allgemeinen relativ kleine) Quadrat der komplexen Zahlenebene wird auf einen größeren Bildschirmbereich "gezoomt" (im Beispiel auf 200x200 Pixel). Daraus bestimmen wir die Schrittweite ds:=k/200 für die Iterationen: Wir iterieren für jeden Realteil der komplexen Zahlen im gewählten Quadrat und für jeden Realteil über alle zugehörigen Imaginärteile...

Ist ein Punkt Element der Julia-Menge, wird er (schwarz) eingefärbt.

Strebt ein Punkt der Julia-Menge bei der Iteration gegen Unendlich wird er danach eingefärbt, wie "rasch" er den Kreis mit Radius 2 verlässt - auf diese Weise erscheinen die Punkte in der (näheren) Umgebung der Julia-Menge farbig...

Beispiel:


Code:

import java.awt.*;
import java.awt.event.*;

public class julia extends Frame implements ActionListener {

    TextField aein;
    TextField bein;
    TextField xminein;
    TextField yminein;
    TextField kein;
    Button ok;

    double a;
    double b;
    double xmin;
    double ymin;
    double k;

    public static void main(String arguments[]) {
        julia proggi = new julia();

        WindowListener wl = new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        };
        proggi.addWindowListener(wl);
        proggi.setLocation(100,100);
        proggi.resize(500,300);
        proggi.show();
    }

    julia() {
        super("Juliamenge");
        setLayout(new BorderLayout());
        Panel panel = new Panel();

        panel.setLayout(new GridLayout(6,2,10,20));

        Label l1 = new Label("a");
	panel.add(l1);
        aein = new TextField("-1",8);
	panel.add(aein);
	Label l2 = new Label("b");
	panel.add(l2);
	bein = new TextField("0.28",8);
	panel.add(bein);
	Label l3 = new Label("xmin");
	panel.add(l3);
	xminein = new TextField("-1",8);
	panel.add(xminein);
	Label l4 = new Label("ymin");
	panel.add(l4);
	yminein = new TextField("-1",8);
	panel.add(yminein);
	Label l5 = new Label("k");
	panel.add(l5);
	kein = new TextField("2",8);
	panel.add(kein);
	ok = new Button ("ok");
	panel.add(ok);
	ok.addActionListener(this);

        add("East",panel);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == ok) {
	    werteuebernehmen();
	    repaint();
	}

    }

    public void werteuebernehmen() {
	a = Double.valueOf(aein.getText()).doubleValue();
	b = Double.valueOf(bein.getText()).doubleValue();
        xmin = Double.valueOf(xminein.getText()).doubleValue();
	ymin = Double.valueOf(yminein.getText()).doubleValue();
	k = Double.valueOf(kein.getText()).doubleValue();
    }

    public void paint (Graphics bs) {
	double ds;
	double x;
	double y;
	double x1;
	double y1;
	double xx;
	int s;
	int r;
	int zaehler;

	werteuebernehmen();

	ds = k/200;

	x = xmin;

	for (s=0; s<=200; s++) {
	    y=ymin;
	    for (r=0; r<=200; r++) {
		x1=x;
		y1=y;
		zaehler=0;
		while ((zaehler < 100) && (Math.sqrt(x1*x1+y1*y1)<2)) {
		    zaehler++;
		    xx=x1*x1-y1*y1+a;
		    y1=2*x1*y1+b;
		    x1=xx;
		}
		if (zaehler >= 100) {
		    bs.setColor(Color.yellow);
		    bs.drawLine(s+50,r+50,s+50,r+50);
		}

		if (zaehler < 10) {
		    bs.setColor(Color.red);
		    bs.drawLine(s+50,r+50,s+50,r+50);
		}
		else if (zaehler < 20) {
		    bs.setColor(Color.green);
		    bs.drawLine(s+50,r+50,s+50,r+50);
		}
		else if (zaehler < 30) {
		    bs.setColor(Color.lightGray);
		    bs.drawLine(s+50,r+50,s+50,r+50);
		}
		else if (zaehler < 40) {
		    bs.setColor(Color.blue);
		    bs.drawLine(s+50,r+50,s+50,r+50);
		}
		else if (zaehler < 50) {
		    bs.setColor(Color.yellow);
		    bs.drawLine(s+50,r+50,s+50,r+50);
		}
		else if (zaehler < 60) {
		    bs.setColor(Color.magenta);
		    bs.drawLine(s+50,r+50,s+50,r+50);
		}
		else if (zaehler < 70) {
		    bs.setColor(Color.gray);
		    bs.drawLine(s+50,r+50,s+50,r+50);
		}
		else if (zaehler < 80) {
		    bs.setColor(Color.orange);
		    bs.drawLine(s+50,r+50,s+50,r+50);
		}
		else if (zaehler < 90) {
		    bs.setColor(Color.white);
		    bs.drawLine(s+50,r+50,s+50,r+50);
		}
		else if (zaehler < 100) {
		    bs.setColor(Color.cyan);
		    bs.drawLine(s+50,r+50,s+50,r+50);
		}
		y=y+ds;
	    }
	    x=x+ds;
	}
    }
}

Kommentar:

Lässt man die Farbcodierung (else-Leiter) weg, so erhält man die Juliamenge als schwarze Fläche...


Aufgaben:

  1. Beobachte den "Rand" der Juliamenge. Erkennst du "Apfelmännchen"-Strukturen? Stelle dazu geeignete Ausschnitte der Juliamenge mit dem Parameter c = (-1, 0) dar!
  2. Mit dem Parameter c = (-1, 0) entsteht eine zusammenhängende Juliamenge. Mit dem Parameter c = (0.5, 0.1) erhält man eine nicht zusammenhängende Juliamenge. Untersuche dies! (Bemerkung: Ob bei der Iteration eine zusammenhängende Juliamenge entsteht oder nicht, hängt davon ab, ob der Parameter c ein Element der Mandelbrotmenge ist oder nicht).
  3. Untersuche, wie sich die Juliamenge bei einer geringfüngigen Änderung des Parameters c = (a, b) ändert!

  4. Bemerkung:

    Bei bestimmen Anwendungen (Systemen) ändert sich ein Ergebnis dramatisch, wenn ein oder mehrere Parameter nur geringfüngig verändert werden. Damit ist die Vorhersage, wie sich das System langzeitig entwickeln wird, extrem schwierig oder unmöglich. Man spricht dann von chaotichen Systmene. In der zweiten Hälfte des 20. Jahrhunderts erhielt die Frage, bei welchen Bedingungen sich ein System chaotisch verhält, eine besondere Bedeutung (Wettervorhersage, Berechnung von Planetenbahnen, Schwingungen u.a.m.)


© Alfred Nussbaumer, Weblog "MiniNuss"