【问题标题】:Sin taylor series recursive approximationSin taylor 级数递归逼近
【发布时间】:2019-08-18 15:03:22
【问题描述】:

我需要一些关于我计算 sin Taylor 级数的递归方法的见解,该方法不能正常工作。该方法调用另外两个递归方法,即递归 pow 方法和递归阶乘方法。我将我的发现与迭代罪法进行了比较,给了我正确的解决方案。我的递归罪法中缺少什么?

sin(x)= x - x^3/3 的近似值! + x^5/5! -x^7/7!+ ...

public class SinApprox
    {
        public static void main (String [] args)
        {
            Out.println(sinx(1, 1, 2, 1, 1, 0, 1));
            Out.print(sinIT(2));
        }

    static double sinIT(double x)
    {
        double sin = 0;
        double a = x;
        double b = 1;
        double term = a/b;
        double vz = 1;
        double i = 1;

    while(term > 0.000001)
    {
        i = i +2;
        sin = sin + (term*vz);
        a= rekursivPow(x,i);
        b = rekursivN(i);
        term = a/b;
        vz = -1 * vz;
    }
    return sin;
}

static double rekursivN(double n)
{
    if(n==1)
    {
        return 1;
    }
    return n * rekursivN(n-1);
}

static double rekursivPow(double x , double y)
{
    if(y  == 1)
    {
        return x ;
    }
    return x * rekursivPow(x , y  - 1);
}

static double sinx(double i ,double n, double x, double y, double vz, double sum, double pow)
{


    double term = pow / n;

    if(term > 0.000001)
    {
        sum = sum + (term * vz);
        vz = -1 * vz;
        i = i +2;
        n = rekursivN(i);
        y = y +2;
        pow = rekursivPow(x ,y);

        return sinx(i, n, x , y , vz, sum, pow);
    }
    return sum;


   }
}

【问题讨论】:

  • 您是否在家庭作业练习中使用递归来实现这一点?因为如果您必须真正“真正地”实现它,那么使用递归调用执行此操作的理由几乎为零。
  • 是的,这是作业,我需要将 pow 和阶乘递归方法用于我的递归 sin 方法。

标签: java recursion trigonometry taylor-series


【解决方案1】:

第一步是以一种使递归关系清晰的方式写出函数(你不能为不清晰的东西编写代码)所以,不要从这个开始:

sin(x)= x - x^3/3! + x^5/5! -x^7/7!+ ...

但是,相反,问“我怎样才能使所有这些带有 x 的术语看起来都一样”:

sin(x)= x^1/1! - x^3/3! + x^5/5! + ...

良好的开端,但如果我们正在递归,我们真正要寻找的是计算其中一项,然后使用更新的参数调用自身以计算下一项的东西。理想情况下,我们想要这样的东西:

doThing(args) {
  return simpleComputation() + doThings(updatedargs);
}

然后递归完成其余的工作。所以我们首先要确保我们只需要处理+,而不是+- 的混合:

sin(x)= (-1)^0 * x^1/1! + (-1)^1 * x^3/3! + (-1)^2 * x^5/5! + ...

现在你有了一些可以实际表达为递归关系的东西,因为:

sin(x,n) {
  return (-1)^n * x^(2n+1) / (2n+1)! + sin(x, n+1);
}

使用“快捷方式”功能:

sin(x) {
  return sin(x,0); 
}

这就是提示停止的地方,您应该能够自己实现其余的。只要你记得停止递归,因为泰勒级数是无限的,而计算机程序和资源不是。

【讨论】:

  • 但这不是 (-1)^0 * x^1/1!应该是正面的? -1^0 是 -1。
  • 肯定不是。 -1 ^ 0 绝对是+1(有几个解释,都可以在网上轻松找到)
  • 我错了,对不起
  • 谢谢你成功了 =) 但我还有另一个问题。我的 recursivePow 方法仅适用于正数。您是否有任何提示我如何使用实数来实现它,例如:-0.12^2?
猜你喜欢
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 2021-08-12
相关资源
最近更新 更多