【问题标题】:Taylor Series of a Sine正弦的泰勒级数
【发布时间】:2017-12-02 11:25:06
【问题描述】:

我目前在我的大学上 Java 课程,我们被要求编写一个泰勒级数方程来计算一个正弦函数。我编写了对我有意义的代码,并尝试调试我能想到的每一段代码,以确保所有部分都按照我认为的方式运行,但程序仍然无法正常运行。所以,我希望有人可能会看到这个并发现我做错了什么。

这是等式:Taylor Series Equation

public class Sine {

public static int factorial(int a) {
    int num = a;
    if (a == 1) return 1;
    for (int i = 1; i < num; i++){
    a = a * i;
    }   return a;
}
public static double numerator(double x, int power) {
    double ret = Math.pow(x, power);
    return ret;
    }
public static void main(String[] args) {
    int power = 1;
    int iter = 0;
    double x = Math.PI/4;

    int sign = 1;
    while (iter != 10) {
        iter++;
        System.out.println("Iteration " + iter + ": " + x);
        x += sign * numerator(x, power)/factorial(power);
        power += 2;
        sign *= -1;
    }
    System.out.println("\nTaylor Series, Final: " + x);
System.out.println("Value of Sine: " + Math.sin(Math.PI/4));
}
}

我只是很困惑发生了什么以及为什么它不起作用。

【问题讨论】:

  • 尝试打印factorial(int) 的值以增加a 的值。你可能会得到一个惊喜。
  • (顺便说一句,factorial(0) 错了)。
  • 你是什么意思'工作不正常'?能具体一点吗?
  • 看起来你要上升到factorial(21),这对于int来说太大了。

标签: java taylor-series


【解决方案1】:

您做错了什么(感谢@AndyTurner)试图将大型阶乘存储在int 中,这当然最多只能存储大约 20 亿个数字。

为避免处理大数及其有限的精度,您可以使用以下原理,该原理适用于正弦的泰勒级数。

x 中的项n = (xn-2 中的项)* - x * x / n / (n-1)

例如,如果您已经计算了 x5 / 5!,那么最好的方法是计算 -x7 / 7!就是将你已经计算的数字乘以 -x2 / 6 / 7。

如果您以这种方式计算您的项,然后将它们相加,您就可以避免处理大数时出现的所有问题。

【讨论】:

  • 非常感谢您的帮助,但我一定误解了您在代码中的内容。 “x^n”(意思是分子?)应该替换为 x^n-2 * - x * x/n/(n-1)?我很困惑,我很抱歉。
  • 我刚才加的那句话对你理解有帮助吗?
猜你喜欢
  • 2021-02-19
  • 1970-01-01
  • 2017-04-10
  • 2015-06-20
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 2021-07-10
  • 2022-07-10
相关资源
最近更新 更多