Java Code Hilfe?
Ich hab angefangen in der Schule java zu lernen und wir müssen als Hausaufgabe ein Programm schreiben das in einer Schleife 100 Mal eine Rechung durchführt solange bis die Differenz zum vorherigen kleiner als 10 hoch −7 ist. Sobald das der Fall ist sollte der Wert ausgegeben werden. Wenn das in den ganzen 100 Mal nicht passiert soll "Kein Fixwert" ausgegeben werden. Jedenfalls versteh ich die Aufgabe so.
Die genaue Beschreibung lautet: Wiederholen Sie die Iteration (ohne Ausgabe) insgesamt 100 Mal. Falls sich der Wert x in der letzten Iteration um weniger als 10 hoch -7 verändert hat, geben Sie Fixpunkt = x aus sonst "kein Fixwert"
Als Testwerte haben wir:
a = 0.4793758254555842;
b = 2.5676932814206115;
c = 0.46336869058102603;
x2 = 0.03357264174228247;
und das Ergebnis soll hier am Ende sein: Fixwert: 0.8533944351783489
die Rechung die so lange ausgeführt werden soll bis die Differenz zum vorherigen Mal kleiner als 10 hoch -7 ist, ist: x2 = a * Math.sin(b * x2) + c
------------------
Ich arbeite mit x2 weil das Teil 2 der Aufgabe ist und ich bereits in Teil 1 eine x Variable verwende.
------------------
Zu meinem Problem nun. Wie man es sich schon denken kann bekomme ich den Code einfach nicht so zum funktionieren sodas das Ergebniss stimmt. Vielleicht kann da ja mal jemand rüber schauen der schon mehr erfahrung hat. Da ich erst 4 Stunden in der Schule hatte sollte das für einen Erfahrenen Programmierer kein Problem sein mein Problem zu finden. Ich hab nun lang genug herumprobiert und ich schaffe es einfach nicht...
Mein Code ist als Bild angehängt.
Danke für jede Hilfe die kommt :
)
1 Antwort
![](https://images.gutefrage.net/media/default/user/14_nmmslarge.png?v=1551279448000)
Als Screenshot ist das ein bisschen mühsam. Daher nur ein paar Anmerkungen:
- x3 ist anfangs 0 und bleibt auch auf 0 - es gibt nach der Definition nie eine Zuweisung. Am Schluss der Schleife setzt du also x2 immer wieder auf 0. Das ist wohl nicht, was du willst - damit bleibst du nach der 1. Iteration immer am selben Punkt.
- Aus einer Schleife bricht man mittels "break" aus. Bitte nicht den Zähler auf 100 setzen.
- Du suchst offenbar den Betrag der Differenz: Math.abs() tut das.
- Bitte verwende die automatische Formatierung deiner IDE, damit die Einrückungen passen und man das Zeug halbwegs lesen kann.
![](https://images.gutefrage.net/media/default/user/14_nmmslarge.png?v=1551279448000)
Deinen Code zu verstehen war mir mühsamer, als das einfach schnell selbst zu implementieren. Du machst es umständlicher als nötig (und sogar diese Lösung könnte man verkürzen, aber es soll lesbar bleiben):
public static void main(String[] args) {
final double a = 0.4793758254555842;
final double b = 2.5676932814206115;
final double c = 0.46336869058102603;
double x2 = 0.03357264174228247;
for(int i=0; i<100; i++) {
double prev = x2;
x2 = a * Math.sin(b * x2) + c;
if(Math.abs(x2 - prev) < 1e-7) {
System.out.printf("Fixwert: %f", x2);
return;
}
}
System.out.println("kein Fixwert");
}
![](https://images.gutefrage.net/media/user/daCypher/1444744777_nmmslarge.jpg?v=1444744777000)
So, wie ich die Aufgabe interpretiere, soll die Schleife in jedem Fall 100 mal laufen und erst bei der letzten Iteration (oder nach der Schleife) prüfen, ob der Wert sich um weniger als 1e-7 verändert hat. Also nicht gleich den Wert zurückgeben, sobald er einmal weniger als 1e-7 Unterschied zum vorigen Wert hatte.
![](https://images.gutefrage.net/media/default/user/14_nmmslarge.png?v=1551279448000)
Möglich, ich fand das aber etwas fragwürdig - solche Näherungsaufgaben macht man ja üblicherweise nur bis zu einer gewissen Differenz als Abbruchbedingung. Wäre aber auch kein großes Ding, dann zieht man halt den if-Block hinter die Schleife:
public static void main(String[] args) {
final double a = 0.4793758254555842;
final double b = 2.5676932814206115;
final double c = 0.46336869058102603;
double x2 = 0.03357264174228247;
double prev = x2;
for(int i=0; i<100; i++) {
x2 = a * Math.sin(b * x2) + c;
}
if(Math.abs(x2 - prev) < 1e-7) {
System.out.printf("Fixwert: %f%n", x2);
} else {
System.out.println("kein Fixwert");
}
}
![](https://images.gutefrage.net/media/default/user/14_nmmslarge.png?v=1551279448000)
...wobei man natürlich die Aktualisierung von prev nicht vergessen sollte, im Gegensatz zu mir :-)
ja da ist ein Fehler. Ich hab x3 = a * Math.sin(b * x2) + c und nicht x2 = ...
So nimmt x3 dann den Wert an. Während x2 den alten Wert hat. Am Ende wird die Differnz gerechnet. x2 - x3. Ist es kleiner als 10 hoch -7 dann Ausgabe. Ist es nicht dann wird x3 auf x2 übertragen und es wiederholt. So hab ich es mir gedacht.