2016-03-25 7 views
0

Hier ist mein Code:Sine der Nummer mit Taylor Series java

import java.util.Scanner; 
public class TaylorSeries{ 

public static int factorial(int num){ 
    if(num == 0) return 1; 
    return num * factorial(num -1); 
} 

public static void main(String args[]){ 
    Scanner scanner=new Scanner(System.in); 

    System.out.println("Enter the number:"); 

    int num = scanner.nextInt(); 
    boolean op_checker = true; 

    int denom = 0; 
    double numrad = num * (2 * Math.PI/360); 
    double sum = 0; 

    for(int counter = 0; counter < 4; counter++){ 
     denom = counter * 2 + 1; 
     if(op_checker) 
       sum += Math.pow(numrad,(double)denom)/factorial(denom); 
     else sum -= Math.pow(numrad,(double)denom)/factorial(denom); 

     op_checker = op_checker ? false : true; 
     System.out.println(sum); 
    } 

    System.out.printf("%.4f",sum); 
} 

} 

Das Problem ist, dass die Werte, die ich bekommen sind falsch, wenn die Zahl sehr nahe 90 und darüber hinaus ist. Kann mir jemand helfen zu verstehen, was vor sich geht?

Antwort

0

Diese

 sum += sum + Math.pow(... 
else sum -= sum + Math.pow(... 

sollte

sein
 sum += Math.pow(... 
else sum -= Math.pow(... 
+0

Alles klar, danke. Ich habe die Frage aktualisiert. Ich würde deine Antwort darauf schätzen. – Ayo

0
sum += sum + Math.pow(numrad,(double)denom)/factorial(denom); 

sum = sum + Math.pow(numrad,(double)denom)/factorial(denom); 
or 
sum += Math.pow(numrad,(double)denom)/factorial(denom); 

Beachten Sie, dass Ihr Ansatz eher unwirksam sein sollte, ist. Um den nächsten Serienbegriff zu erhalten, multiplizieren Sie den letzten mit (x*x)/((2*i)(2*i+1))

Serie Konvergenz ist langsam für große Argument Werte - das ist, warum Sie große Fehler sehen können. Sie müssen mehr Begriffe erhalten (umfangreiche Weise) oder Argument auf kleine Reichweite reduzieren (empfohlen).

Ein weiterer möglicher Fehler Grund - Ihre factorial Funktion wird nicht für große denom wegen Integer-Überlauf funktionieren. Sie können double als Ergebnis verwenden oder einen robusteren Algorithmus anwenden, den ich oben beschrieben habe.

+0

Oh! Ja Danke. Ich weiß nicht, warum ich diesen Fehler immer mache. Vielen Dank. – Ayo

+0

Alles klar, danke. Ich habe die Frage aktualisiert. Kannst du mir helfen, eine Antwort darauf zu geben? – Ayo

+0

Ok! Vielen Dank für die schnelle Antwort. – Ayo

0
package algorithms; 

public class TaylorSeries { 

public static double factorial(double num){ 
    if(num == 0) return 1; 
    return num * factorial(num -1); 
} 

public static void main(String args[]){ 
    int[] radians = {0, 23, 45, 75, 90, 100, 120, 150, 180, 275, 360}; 
    for (int num : radians) { 
     double denom = 0; 
     double numrad = num * (2 * Math.PI/360); 
     double sum = 0; 


     int sign = 1; 
     for(int counter = 0; counter < 9; counter++){ 
      denom = counter * 2 + 1; 
      double value = Math.pow(numrad, denom); 
      sum += sign * Math.pow(numrad,denom)/factorial(denom); 
      sign *= -1; 
     } 

     System.out.print(" Angle is: " + num + " = "); 
     System.out.printf("%.4f",sum); 
     System.out.println(); 
     } 
    } 

} 

EDIT:

Ausgang:

Angle is: 0 = 0.0000 
Angle is: 23 = 0.3907 
Angle is: 45 = 0.7071 
Angle is: 75 = 0.9659 
Angle is: 90 = 1.0000 
Angle is: 100 = 0.9848 
Angle is: 120 = 0.8660 
Angle is: 150 = 0.5000 
Angle is: 180 = 0.0000 
Angle is: 275 = -0.9961 
Angle is: 360 = 0.0110 
+0

Hoppla! Meine schlechte ... Danke. – Ayo

+0

Aber ich habe die Frage aktualisiert. Kannst du mir helfen, das zu beantworten? – Ayo

+0

Der Zähler wurde auf 9 geändert und es nähert sich. hat den Beitrag bearbeitet. – Suparna