首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复数正弦逼近

复数正弦逼近
EN

Stack Overflow用户
提问于 2014-09-18 13:49:05
回答 2查看 209关注 0票数 0

尝试用Java编写一个程序,使用以下等式计算sin (x)的幂级数近似:

x - x^3/3! + x^5/5!... x^n/n!

我正在使用while循环执行此操作,但似乎无法获得sin近似值的100%正确。你知道我哪里错了吗?

代码语言:javascript
复制
{
        double x = 0.0, sum = 1.0, y;
        int n = 1, count = 1;

        Scanner kb = new Scanner(System.in);

        System.out.println("Enter positive odd integer");
        n = kb.nextInt();
        System.out.println(n);

        System.out.println("Enter x");
        x = kb.nextDouble();
        y = x;
        System.out.println(x);

        while (true)
        {
            if (n == 1)
                {sum = x;

                }



            count = count + 2;
            sum = x + (x * -(x * x) / (count * (count - 1)));
            x = sum;

            if (count >= n)
                count = count + 2;
                sum = x + (x * -(x * x) / (count * (count - 1)));
                x = sum;
                break;






        }
        System.out.println("sum = " +sum);
        System.out.printf("sin("+y+") = " +Math.sin(y));


}

这目前给我提供了以下输出:

代码语言:javascript
复制
Enter positive odd integer
99
Enter x
0.7
sum = 0.598559827320216
sin(0.7) = 0.644217687237691
EN

回答 2

Stack Overflow用户

发布于 2014-09-18 13:53:33

你没有正确地实现公式-我看不出幂n在哪里…

我希望你有像x = x + (n^-1) * (x^(2*n)/fac( (2*n) ) );这样的东西,有n个步骤

注意^运算符不适用于双精度,但这不是一个复制/粘贴解决方案(如@paxDiablo(https://stackoverflow.com/users/14860/paxdiablo)所示),它只是一个关于如何解决您的问题的解决方案……

票数 2
EN

Stack Overflow用户

发布于 2014-09-18 14:01:46

表达式(count * (count - 1))不是count!,绝对不是。

count变成4的时候,你就开始得到错误了。因为4!24,而4 x 3只是12。当然,更糟糕的是:10 x 990,但10!是350万。

您遇到的另一个问题是,您的if (count >= n)条件可能不符合您的预期。除了对于某些语句来说,它几乎肯定是错误的条件(如果count仍然小于n,但break在给定条件下是有意义的),您的缩进让我相信您认为将为该if语句执行整个代码块:

代码语言:javascript
复制
if (count >= n)
    count = count + 2;
    sum = x + (x * -(x * x) / (count * (count - 1)));
    x = sum;
    break;

然而,缩进不能控制这一点,大括号可以。没有大括号,只有第一个缩进的语句受if的约束,所有其他语句在每次迭代中都会发生。

但是,尽管如此,您的代码逻辑似乎非常...呃,被折磨了。大多数无穷级数计算的伟大之处在于,你真的只需要担心和和当前项。当你可以像这样有一个循环时,不断地交换所有这些变量似乎是非常复杂的:

代码语言:javascript
复制
double mult = 1.0;
while (count <= n) {
    term = Math.pow(x,count) / facto (count);
    sum += mult * term;
    count += 2;
    mult = -mult;
}

下面是一个完整的程序,展示了这一点:

代码语言:javascript
复制
import java.util.Scanner;

public class Test {
    public static double facto (int inum) {
        double num = inum;
        while (--inum > 1)
            num *= inum;
        return num;
    }

    public static void main(String[] args) {
        double term = 0.0, sum = 0.0, x;
        int n, count = 1;

        Scanner kb = new Scanner(System.in);

        System.out.print("Enter positive odd integer: ");
        n = kb.nextInt();
        if ((n < 1) || (n % 2) == 0) {
            System.out.println("Apparently, someone can't read too well :-)");
            n = (n < 1) ? 1 : n + 1;
        }
        System.out.println("Using " + n);

        System.out.print("Enter x: ");
        x = kb.nextDouble();
        System.out.println("Using " + x);

        double mult = 1.0;
        while (count <= n) {
            term = Math.pow(x,count) / facto (count);
            sum += mult * term;
            count += 2;
            mult = -mult;
        }

        System.out.println("" + sum + " <-- sum");
        System.out.printf("" + Math.sin(x) + " <-- sin(" + x + ")");
    }
}

以及使用您的测试数据的示例运行,展示了它的实际效果:

代码语言:javascript
复制
Enter positive odd integer: 99
Using 99
Enter x: 0.7
Using 0.7
0.644217687237691 <-- sum
0.644217687237691 <-- sin(0.7)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25905063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档