Java-Problem mit Iterationen

Neue Frage »

Auf diesen Beitrag antworten »
whileLoop Java-Problem mit Iterationen

Hallo ich soll so ein Java-Programm schreiben:

Führen Sie die Iteration
[latex]x_{n+1} = x^{2}_{n}  - y^{2}_{n} + a[/latex]
[latex]y_{n+1} = 2x_{n}y_{n} + b[/latex]
so lange durch, bis [latex]x^{2}_{n} + y^{2}_{n} > 4[/latex] oder die Anzahl der Iterationen n=1000 wird. a und b sind einzulesen. Am Anfang wird
[latex]x_{0} = y_{0} = 0[/latex] gesetzt. Geben Sie die Anzahl der Iterationen aus.

Okay vom Programm schreiben sollte es eigtl überhaupt kein Problem sein, nur ich versteh die Formel nicht.
Ich werd eine while-Schleife erstellen, die sich solange wiederholt bis entweder [latex]x^{2}_{n} + y^{2}_{n} > 4[/latex] oder n 1000 erreicht.

Und ich denk mir auch, dass sich der x und y Wert nach jedem Schleifendurchgang um 1 erhöhen.

Aber wie soll ich da denn ansetzen, x und y ist ja unbekannt, wie soll ich (oder besser gesagt das Programm) das ausrechnen?
Schließlich hab ich nur die Werte a und b, die ich einlese.

Vielleicht wär einer so freundlich und könnt mir kurz auf die Sprünge helfen, das Problem ist sicher trivial großes Grinsen
 
Auf diesen Beitrag antworten »
eulerscheZahl

Variablen initialisieren: a,b einlesen, x,y,Schleifenzähler zu 0 setzen.
In der Schleife: x_temp und y_temp berechnen (sonst würdest du ja eine Variable überschreiben, von der du noch den alten Wert brauchst). Die Ergebnisse dann dem x und y zuweisen. Schleifenaustrittsbedingungen prüfen, fertig.
Auf diesen Beitrag antworten »
whileLoop

Okay danke erstmal für deine Hilfe, also wenn ich das jetzt richtig verstanden habe, gebe ich x und y vorerst den Wert 0 und speichere sie dann unter einer Hilfsvariable ab. Okay, aber wie setzt sich die Formel zusammen x = x_temp * x_temp - y_temp * y_temp + a ??

LG
Auf diesen Beitrag antworten »
eulerscheZahl

code:
1:
2:
3:
4:
5:
6:
7:
x=0; y=0;
while (...) {
    x_temp = ...
    y_temp = ...
    x = x_temp;
    y = y_temp;
}
 
Auf diesen Beitrag antworten »
whileLoop

Hey danke, mein Code schaut so aus:
code:
1:
2:
3:
4:
5:
6:
7:
8:
      
while (x*x+y*y < 4 || n < 1000) {
        xtemp = x*x-y*y+a;
        ytemp = 2*x*y+b;
        x = xtemp;
        y = ytemp;
        n = n+1;
}


Und am Anfang alles Null gesetzt, double Variablen gegeben, etc. Trotzdem wird der falsche Output geliefert, für a=0.4 b=0.4 sollen 9 Interationen rauskommen.
Auf diesen Beitrag antworten »
eulerscheZahl

code:
1:
while (x*x+y*y <= 4 && n < 1000)

1. muss es <= 4 heißen, da nur bei > 4 gestoppt werden soll.
2. kommt ein UND zwischen die Bedingungen.
Dann kommt auch eine 9 raus.
Auf diesen Beitrag antworten »
whileLoop

ja klar.

Danke eulerscheZahl Daumen hoch Daumen hoch Daumen hoch
Auf diesen Beitrag antworten »
whileLoop

Leider bin ich doch noch nicht ganz fertig, meine Aufgabe hat sich erweitert:

Erhöhen Sie danach den Wert a schrittweise um 0.00001, bis die Anzahl der Iterationen kleiner als 1000 wird. Geben Sie dann a aus. Falls die Iterationen vorher schon unter 1000 waren, bleibt a unverändert.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
      while (x*x+y*y <= 4) { 
      
         while (x*x+y*y <= 4 && n < 1000) {
            xtemp = x*x-y*y+a;
            ytemp = 2*x*y+b;
            x = xtemp;
            y = ytemp;
            n++;
         }
                 
         if (n == 1000) {
            x = 0;
            y = 0;
            a = a+0.00001;
            n = 0;
         }
      }


Die Ausgabe sollte so ausschauen:
code:
1:
2:
3:
4:
5:
6:
a:
0.2
b:
0.2
Iterationen: 1000
Rand: 0.3757


Meine sieht so aus:
code:
1:
2:
3:
4:
5:
6:
a:
0.2
b:
0.2
Iterationen: 445
Rand: 0.3757000000001757


Steck jetzt schon ne ganze Weile, ich hatte auch schon die Ausgabe Iterationen: 1000 - Rand: 0.39323000000019326
Aber das ist ebenfalls nicht richtig.

Hast du eine Idee eulerscheZahl?
Auf diesen Beitrag antworten »
eulerscheZahl

In Zeile 11 muss es heißen if (x*x + y*y <= 4), das ändert aber nichts an der Ausgabe.

Bei a hast du deutlich erkennbare Rundungsprobleme. Die kannst du so ein Stück weit in den Griff kriegen (beachte die Variable f):
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
double a = 0.2; double b = 0.2;
double x = 0; double y = 0;
int n = 0; double f = 0;
while (x*x+y*y <= 4) {
	while (x*x+y*y <= 4 && n < 1000) {
		 double xtemp = x*x-y*y+a;
		 double ytemp = 2*x*y+b;
		x = xtemp;
		y = ytemp;
		n++;
	}              
	if (x*x+y*y <= 4) {
		x = 0;
		y = 0;
		a = 0.2 + (++f * 0.0001);
		n = 0;
	}
}

Der Schleifenzähler ist aber immer noch bei 445 statt bei 1000.
Auf diesen Beitrag antworten »
whileLoop

Danke für deine Hilfe. Ich geb einfach die erste Iteration aus, dann steht da 1000.

Das Problem ist, dass ich es genau so abgeben muss, dass die gleichen Werte rauskommen. Mit der zusätzlichen Variable stimmts leider auch nicht. Kann ich evtl das If und die whiles irgendwie anders "stapeln", damit evtl ein anderes Fileßkomma-Ergebnis rauskommt?

Das ist die Fehlermeldung, wenn ich es online abgebe:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
>> Input <<
a: 0.11378184001643404, b: 0.09161173587992272
>> Expected output <<
Iterationen: 1000
Rand: 0.34828184001665297

>> Your output <<
Iterationen: 1000
Rand: 0.36555184001667024
Auf diesen Beitrag antworten »
whileLoop

Habs jetzt anders geschachtelt und schaue da, es stimmt verwirrt verwirrt

Vielen Dank nochmal für deine Hilfe!!!
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »