Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Theoretische Informatik » Java-Problem mit Iterationen » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Java-Problem mit Iterationen
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
whileLoop
unregistriert
Java-Problem mit Iterationen Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
28.10.2015 23:36
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.

__________________
Syntax Highlighting fürs Board (Link)
29.10.2015 06:01 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
whileLoop
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
29.10.2015 08:35
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

code:
1:
2:
3:
4:
5:
6:
7:
x=0; y=0;
while (...) {
    x_temp = ...
    y_temp = ...
    x = x_temp;
    y = y_temp;
}


__________________
Syntax Highlighting fürs Board (Link)
29.10.2015 08:39 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
whileLoop
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.
29.10.2015 10:11
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.

__________________
Syntax Highlighting fürs Board (Link)
29.10.2015 15:02 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
whileLoop
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

ja klar.

Danke eulerscheZahl Daumen hoch Daumen hoch Daumen hoch
29.10.2015 20:56
whileLoop
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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?
30.10.2015 00:09
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.

__________________
Syntax Highlighting fürs Board (Link)
30.10.2015 07:08 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
whileLoop
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
30.10.2015 19:00
whileLoop
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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

Vielen Dank nochmal für deine Hilfe!!!
30.10.2015 19:28
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Theoretische Informatik » Java-Problem mit Iterationen