当前位置: 首页 > 知识库问答 >
问题:

复合罪近似

傅和璧
2023-03-14

试图写一个程序在Java计算幂级数近似in(x)使用以下公式:

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

我是用while循环来做的,我似乎无法100%正确地得到sin近似值。你知道我哪里出错了吗?

{
        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));


}

这目前给了我以下输出:

Enter positive odd integer
99
Enter x
0.7
sum = 0.598559827320216
sin(0.7) = 0.644217687237691

共有2个答案

龙默
2023-03-14

表达式(计*(计-1))不是计!,远非如此。

变成4时,你就开始出错了。因为4!244 x 3只有12。当然,情况变得更糟:10 x 99010!是惊人的350万。

您的另一个问题是您的if(计数

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

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

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

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

显示这一点的完整程序如下:

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 + ")");
    }
}

以及一个使用您的测试数据运行的示例,展示了它的作用:

Enter positive odd integer: 99
Using 99
Enter x: 0.7
Using 0.7
0.644217687237691 <-- sum
0.644217687237691 <-- sin(0.7)

厍建义
2023-03-14

你没有正确实现这个公式——我看不出幂n在哪里...

我希望你有类似 x = x (n^-1) * (x^(2*n)/fac( (2*n) ) ); 有 n 个步骤

请注意,^运算符不适用于双精度,但这不是复制/粘贴解决方案(从@paxDiablo(https://stackoverflow.com/users/14860/paxdiablo)中看到的,这只是有关如何解决问题的解决方案...

 类似资料:
  • 我有一个XDB时间序列数据库,我正在存储一个名为的度量。此度量有两个相关度量,和。每个度量也有一个标记,带有与其关联的供应商id。 每分钟,我都有一个服务,它会整理我调用

  • 我有一对(封闭的)多边形,每个多边形被定义为一个点序列(顶点)。每个多边形都代表一块土地,由一条小河分开,所以溪流在两个多边形之间形成一个狭窄的缝隙。 我正在寻找一种算法,通过将两个多边形连接成一个连接的多边形来识别和消除间隙。 下图显示了一个示例,其中原始多边形为绿色和红色,生成的多边形显示为黄色。 到目前为止,我已经能够做到以下几点: 对于多边形A中的每条边,找到多边形B中最近的顶点。 找到多

  • 这是我的代码: 但它不起作用并显示此错误:

  • 编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答问题。 一般来说,我是一名新程序员,如果这个问题有一定的基础,请原谅我。 该程序的目标是简单地计算“最佳体重”,并在运行时在第35行的a和b字符串比较中不断抛出异常。我试图删除逻辑运算符,但这似乎仍然不是问题所在。我错在哪里?

  • 我试图通过将此添加到plugins.sbt来使用sbt替罪羊: addSbtPlugin(“com.sksamuel.替罪羊”%%“sbt替罪羊”%”“1.0.4”) 我的scala版本是: 2.11.12 我的sbt版本是: 1.1.0 我得到了这个错误: 我还尝试在build中指定替罪羊版本(scapegoatVersion)。sbt: 替罪羊版本:=“1.3.4” 我正在使用IntelliJ

  • 我试图在Java中使用这个正则表达式 ,以获取SQL中的表,我得到以下错误: 我找不到错误。 提前感谢您的帮助