2016-01-06 232 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); 
    } 
}