Aufgabe 24 finde ich etwas schwierig und zwar vom Verständnis der Formel her. Ich habe jetzt einzelne Methoden angefertigt für die Fakultät und die Formel, das Problem ist jetzt aber die Berechnung des n bzw. der Teil mit dem <epsilon.
Das n nähert sich ja nur an eine Zahl an, oder ? ich weiß nicht wie ich den Teil in einem Programmcode ausdrücken soll? mit einer For-Schleife und dann runterzählen lassen? das funktioniert aber irgendwie nicht
Die Schleife führst du solange durch, bis
| a_n - a_(n-1) | < ε gilt.
n ist dabei wie bei einer for-Schleife die Zählvariable, die man natürlich hochzählt. Man hat aber hier keine Abbruchbedingung für n (wie man sie bei einer typischen for-Schleife hat). D.h. du kannst aus didaktischen Gründen auch eine while-Schleife verwenden.
Ich habs zwar geschafft die Abbruchbedingung einzubauen, allerdings bekomme ich immer einen
"java.lang.StackOverflowError" in der fac- Funktion.
Kann mir jemand sagen, wo der Fehler liegt?
public static int fac(int n){
int ergebnis=1;
for (int i = 1; i <= n; i++) {
ergebnis=ergebnis*i;
}
return ergebnis;
}
public static int fac(int n) {
if(n==0)
return 1;
else
return n*fac(n-1);
}
mit deiner krieg ich zwar keinen Fehler, aber er rechnet ewig und spuckt nix aus.
Liegt der Fehler vlt iwo anders im Code?
Den hab ich übrigens an meinen ersten Post angehängt.
p
ublic static void main (String []args){
System.out.println(fac(5));
}
sowas mach ich ja auch in meiner Aufgabe!
Deswegen denk ich ja das das Problem iwo anders in meinem Code liegt.
Aber ich find da keinen Fehler..... :(
public class reihe {
public static void main(String[] args){
System.out.println("Sinus(s) oder Cosinus(c)?");
char wahl = Input.in.readCharacter();
System.out.println("Geben sie x ein!");
double x = Input.in.readDouble();
double epsilon = 0.01;
switch (wahl)
{
case 's': System.out.println("Die Abschätzung für sin("+x+") ist" + sinus(x,epsilon));break;
case 'c': System.out.println("Die Abschätzung für cos("+x+") ist" + cosinus(x,epsilon));break;
default: System.out.println("Ungültige Eingabe!");break;
}
}
public static double sinus(double x, double epsilon){
int k = 0;
boolean check = false;
double summe = 0;
double letztesumme =0;
while(check == false)
{ summe += Math.pow(k,-1)*Math.pow(x, (2*k)+1)/fac((2*k)+1);
if(Math.abs(summe-letztesumme)<epsilon){ check= true;}
// System.out.println(summe);
letztesumme = summe;
k++;
}
return summe;
}
public static double cosinus(double x,double epsilon){
return epsilon;
}
public static int fac(int n) {
if(n==0)
return 1;
else
return n*fac(n-1);
}
}
Wolltest du Math.pow(-1, k) schreiben?
Deine Exception wird aufgerufen, weil deine Sinus/Cosinus-Reihe nicht konvergiert, s.d. deine Fakultätsfunktion immer größere Zahlen übergeben bekam. Normalerweise bricht die Reihe schon bei k = 20 ab.
Da du aber Fehler in deiner Reihe hast, wird sie divergieren.