2016-01-06 73 views
-1

有人可以幫助我的歌廳出來的sin(x)量身定製功能的驗證碼來獲得如下:Java的正弦(x)的泰勒級數

  1. 第4的sin(x)裁縫系列。
  2. 要使用的總和,formel
  3. 如何寫一個方法public static double MySinApproximate(double x)計算正弦函數?

這就是我到目前爲止,它必須以這種方式!

import java.lang.Math; 

public class mysin { 
public static void main(String[] args){ 

    double x= Math.PI; 

    System.out.println(MySin(x) + "\t \t" + Math.sin(x) + "\n"); 

} 

public static double MySin(double x){ 

    double sumNeu, sumOld, sum; 
    int i = 1; 
    sum = sumNeu = x;     // This should calculating the first term Value 
    do         //the loop do will calculating the Tailor Series 
    { 
     sumOld = sumNeu; 
     i++; sum = + sum * x * x/i; 
     i++; sum = sum/i; 
     sumNeu = sumOld + sum; 
    } 
    while(sumNeu != sumOld); 

    return sumNeu; 
    } 

} // 11.548739357257745    1.2246467991473532E-16 (as output) 
+2

你的意思是**泰勒**系列? –

+0

是的exactely !!! – Achim

+0

[如何使用Math.cos()&Math.sin()?](http://stackoverflow.com/questions/13951136/how-to-use-math-cos-math-sin) – smac89

回答

1

您的循環不正確計算Taylor series。 (這實際上是一個Maclaurin series,這是a = 0的泰勒級數的特例。)對於正弦函數,需要以交替方式添加和減去這些項。

sin(x)= x - x /3! + x /5! - ...

您的方法只會添加條款。

sin(x)= x + x /3! + x /5! + ...

翻轉的sum符號在每次迭代中,加入指定行:

do // The loop will calculate the Taylor Series 
{ 
    sumOld = sumNeu; 
    i++; sum = + sum * x * x/i; 
    i++; sum = sum/i; 
    sum = -sum; // Add this line! 
    sumNeu = sumOld + sum; 
} 

隨着這一變化,我得到的結果非常接近:

2.3489882528577605E-16  1.2246467991473532E-16 

由於到Java(以及一般的IEEE)中的浮點數學的內在不準確性,這可能與通過編寫自己的正弦方法得到的結果差不多。

我測試的π/2的附加情況:

System.out.println(MySin(x/2) + "\t \t" + Math.sin(x/2) + "\n"); 

再次,這是接近:

1.0000000000000002  1.0 
+0

很多謝謝@regettman(Y) – Achim

0

1.I希望所有再寫這樣的 - 2.I嘗試寫從泰勒和正弦泰勒的第一個4系列和所有在一起,但無論如何不能正常工作 - 3.i得到這個輸出

0.0  0.8414709848078965 

0.8414709848078965  0.9092974268256817 

0.8414709848078965  0.1411200080598672 

0.9092974268256817  -0.7568024953079282 

我4.How可以得到相同的準確性

1.0000000000000002  1.0 

和一系列正弦(X)的?

public class MySin { 
    public static void main(String[] args){ 
     double y = 0; 
     y = 4; 
     for (int i = 1; i<= y; i++){ 
     System.out.println(MySin(i/2) + "\t \t" + Math.sin(i) + "\n"); 
     } 
    } 
    public static double MySin(double x){ 
     double sumNew, sumOld, sum; 
     int i = 1; 
     sum = sumNew = x;     // This should calculating the first term Value 
     do         //the loop do will calculating the Tailor Series 
     { 
      sumOld = sumNew; 
      i++; sum = - sum * x * x/i; // i did change the sign to - 
      i++; sum = sum/i; 
      sum = - sum;    // so i don't need this line anymore 
      sumNew = sumOld + sum; 
     } 
     while(sumNew != sumOld); 
     return sumNew; 
    } 
    public static double MySineProximity (double x) { 
     while (x <= (Math.PI /2)) 
     { 
      x = 0; 
     } 
     return MySin (x); 
    } 
}