【问题标题】:Taylor series - calculating sin(x) until 6 digits precision泰勒级数 - 计算 sin(x) 直到 6 位精度
【发布时间】:2016-06-04 06:51:51
【问题描述】:

我必须用泰勒级数计算 sin(x),直到输出有 6 个小数位。论据是一个角度。我没有实现检查小数位,我只是打印下一个值(以检查它是否工作),但在 10-20 次迭代后它显示无穷大/NaN。

我的想法有什么问题?

public static void sin(double x){
    double sin = 0;
    int n=1;
    while(1<2){

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

        try {
            Thread.sleep(50);
        } catch (InterruptedException ex) {

        }

        // CHECKING THE PRECISION HERE LATER
        System.out.println(sin);
    }
}

方程式:

【问题讨论】:

  • 你为什么要这样做?代码应该是数字近似值吗?然后你可能会检查你的小数,如你所说。
  • 这就是问题所在。任务:实现一个 sin(x) 方法,该方法用 6 位精度的泰勒级数计算 sin(x)。
  • 代码有效吗?发布每次迭代的结果、输入值和输出。前 9 次迭代后的值是否错误?也许 10 次迭代太多了,不要在一行中写公式,你不能调试它们,为每个术语使用一个变量:比如 double divisor = factorial(2 * n +1);此外,一些数学概念在计算机程序中效果不佳。所以你可能已经了解了如何解决这个数字。
  • 你的问题在哪里?我在您发布的值中没有看到 NaN,后来又删除了。,只需进行收敛检查,经过 10 次迭代后,您就可以在示例中准备好,当然 FredK 的答案是专业的。但首先尝试让您的解决方案发挥作用。正如您在 FredK 的回答中看到的那样,您的幼稚解决方案在数值上不太适合。有自己的课程“数值数学”处理这些事情。
  • 提普。 diff = newSin - oldSin; while( Math.abs(diff) > 1E-7) { 做你的代码 }

标签: java trigonometry taylor-series


【解决方案1】:

不要使用阶乘和幂来计算每一项!你会迅速溢出。 只需意识到下一项是 -term * x * x / ((n+1)*(n+2)) ,其中每一项 n 增加 2:

double tolerance = 0.0000007; // or whatever limit you want
double sin = 0.;
int n = 1;
double term = x;
while ( Math.abs(term) > tolerance ) {
  sin += term;
  term *= -( (x/(n+1)) * (x/(n+2)) );
  n+= 2;
}

【讨论】:

  • sin(Math.PI) 在某处给出 3.14 O.o :D Bug
  • 应该是 Math.abs(term) > 容差
  • @Qbix 如果您将他的解决方案复制到您的作业中,请考虑更改容差水平,您可能无法回答为什么他使用 7 作为最后一位数字。这将是我向您提出的第一个问题。
【解决方案2】:

要补充@Xoce(和@FredK)提供的答案,请记住您正在计算麦克劳林级数(泰勒关于x = 0 的特殊情况)。虽然对于大约在零的 pi/2 范围内的值,这将很快收敛,但您可能无法在 x 的值的阶乘爆炸之前得到数字的收敛。

我的建议是使用关于sin(x) 的最接近值的实际泰勒级数,其确切值是已知的(即pi/2 的最接近倍数,而不仅仅是零。一定要进行收敛检查!

【讨论】:

    【解决方案3】:

    问题:

    NAN 错误通常是一个非常大的数字,如果您将 2 个数字相除但除数非常小或为零,就会发生这种情况。

    解决方案

    发生这种情况是因为您的阶乘数溢出,稍后您又被零除 如果您的阶乘被当作 int 参数,则将其更改为 ,例如 BIgInterger 对象。

    【讨论】:

    • 是的,没错,在 10-20 次迭代后它变得很大,但 0-10 的输出有点随机,这就是为什么我要问出了什么问题:(
    • 使用 BIgInteger 不是解决方案。可能作者应该按照他所说的实施“检查小数”。
    猜你喜欢
    • 1970-01-01
    • 2018-06-23
    • 2020-03-01
    • 2021-03-19
    • 2021-08-13
    • 2016-04-26
    • 2014-03-27
    • 2022-06-10
    • 2015-05-15
    相关资源
    最近更新 更多