2017-06-28 18 views
-1

Ich bin derzeit in einer Java-Klasse an meiner Universität und wir wurden gebeten, eine Taylor-Serie-Gleichung zu programmieren, um eine Sinus-Funktion zu berechnen. Ich habe codiert, was für mich Sinn macht, und ich habe versucht, jeden Codeabschnitt zu debuggen, den ich mir vorstellen kann, um sicherzustellen, dass alle Teile so funktionieren, wie ich denke, aber das Programm funktioniert immer noch nicht richtig. Also, ich hoffe, dass sich jemand das anschaut und sieht, was ich falsch mache.Taylor Series einer Sinus

das ist die Gleichung: Taylor Series Equation

public class Sine { 

public static int factorial(int a) { 
    int num = a; 
    if (a == 1) return 1; 
    for (int i = 1; i < num; i++){ 
    a = a * i; 
    } return a; 
} 
public static double numerator(double x, int power) { 
    double ret = Math.pow(x, power); 
    return ret; 
    } 
public static void main(String[] args) { 
    int power = 1; 
    int iter = 0; 
    double x = Math.PI/4; 

    int sign = 1; 
    while (iter != 10) { 
     iter++; 
     System.out.println("Iteration " + iter + ": " + x); 
     x += sign * numerator(x, power)/factorial(power); 
     power += 2; 
     sign *= -1; 
    } 
    System.out.println("\nTaylor Series, Final: " + x); 
System.out.println("Value of Sine: " + Math.sin(Math.PI/4)); 
} 
} 

ich nur sehr verwirrt bin, was los ist und warum funktioniert es nicht.

+1

Versuchen Sie, den Wert von 'faktorial (int)' für steigende Werte von 'a' zu drucken. Du könntest eine Überraschung bekommen. –

+2

(Übrigens ist 'factorial (0)' falsch). –

+0

Was meinst du mit "funktioniert nicht richtig"? Könntest du etwas genauer sein? – Chris

Antwort

0

Was Sie falsch machen (danke @AndyTurner) ist der Versuch, große Factorials in einem int zu speichern, der natürlich nur Zahlen bis zu etwa 2 Milliarden speichern kann.

Um zu vermeiden, mit großen Zahlen und ihren begrenzten Genauigkeiten umgehen zu müssen, könnten Sie das folgende Prinzip anwenden, das für die Taylor-Serie für Sinus gilt.

Begriff in x n = (Term in x n-2) * - x * x/n/(n-1).

Zum Beispiel haben, wenn Sie bereits x /5 berechnet !, dann ist die beste Art und Weise -x /7 zu berechnen! Multiplizieren Sie die Zahl, die Sie bereits berechnet haben mit -x /6/7.

Wenn Sie Ihre Bedingungen auf diese Weise berechnen, dann addieren Sie sie, vermeiden Sie alle Probleme, die mit dem Umgang mit großen Zahlen kommen .

+0

Vielen Dank für die Hilfe, aber ich muss falsch verstehen, was Sie in Code haben. "x^n" (dh der Zähler?) sollte durch x^n-2 * - x * x/n/(n-1) ersetzt werden? Ich bin sehr verwirrt, ich entschuldige mich. –

+0

Kann ich den Satz, den ich gerade hinzugefügt habe, verstehen? –