我很难从我的maclaurin系列获得sin x的准确输出

时间:2015-05-11 17:23:56

标签: java math trigonometry

     // a java program that displays the maclaurinseries math function
     // sin x = x - x^3/3! + x^5/5! - x^7/7!
     // sin x = (-1)^n * x^(2n+1) / (2n+1)!

    import java.util.Scanner;

    public class maclaurinseries
    {
    public static void main(String args[])
    {
        double x;
        double counter=1;
        double factorial =1;
        double result=0;

        Scanner input=new Scanner(System.in);

        System.out.println("enter a number");
        x=input.nextDouble();

        while(x>=counter) {

            factorial=2*factorial*counter+1;
            result=result+(Math.pow(-1,counter)) * (Math.pow(x,2*counter+1))/(factorial);
            counter++;

        }

        System.out.println("Maclaurin series is" +result);

    }

    }

当我为x:

输入数字3.14时,这是我的代码的输出
  

输入一个数字   3.14   Maclaurin系列是-24.935440878754584

正如你所看到的,当我用x = 3.14代入函数sin x时,我的输出应为0,而不是-24.935330878754583。我做错了什么?

1 个答案:

答案 0 :(得分:3)

首先,您不希望迭代次数由您输入的值控制。您需要合理数量的迭代才能合理准确。

while (counter <= 10) {

其次,你的因子计算搞砸了。你想要(2n + 1)!每个循环,你仍然希望第一个循环有1!。将计算更改为包含因子2n和因子(2n + 1),并在result加法后移动因子计算,以将其设置为下一个循环。您还希望第一个术语为正数,因此在符号确定中使用counter + 1作为指数。

    result = result + (Math.pow(-1, counter + 1)) *
        (Math.pow(x, 2 * counter - 1)) / (factorial);
    factorial = factorial * (2 * counter) * (2 * counter + 1);
    counter++;
}

(修改:将Math.pow(x, 2 * counter + 1)更改为Math.pow(x, 2 * counter - 1),因为counter已从1开始。)

示例输出:

enter a number
3.14
Maclaurin series is 0.001592652393160744

更多:

enter a number
3.14159
Maclaurin series is 2.6530608840492444E-6

更多:

enter a number
1.57079
Maclaurin series is 0.9999999999799855