【问题标题】:Recursion for evaluating log(1+x) using taylor series of the same使用相同的泰勒级数评估 log(1+x) 的递归
【发布时间】:2020-12-12 08:20:27
【问题描述】:
#include<iostream>
using namespace std;
double log(double x,int n)
{
    static double p = x ;
    double s;
    if(n==1)
        return x;
    else
    {
        s=log(x,n-1);
        p*=x;
        if(n%2==0)
            return s - (p/n);
        else
            return s + (p/n);  
    }
}
int main()
{
    double r = log(1,15);
    cout << r;
    return 0;
}

我尝试编写上面的函数来评估 log(1+x) 函数,使用它的带有递归的泰勒级数。但它并没有像我预期的那样给出结果。 例如: ln(2) = 0.693 而我的代码给出了 0.725。在上面的代码中,n 表示词条的数量。 另外我是这个平台的新手,所以我可以说上面的问题是完整的还是需要一些额外的信息来进一步解释?

【问题讨论】:

  • 顺便说一句:如果您像在n%2==0 中那样将运算符混合在一个术语中,那么使用括号是一个很好且易于阅读的想法。操作员优先级是一个常见的陷阱。括号有助于避免它。 (n%2)==0 使目的更加明显。
  • 感谢您的建议。在编写其他程序时,我一定会牢记这一点!

标签: c++ recursion logarithm


【解决方案1】:

这段代码没有任何问题:这显然与泰勒级数的收敛速度有关。

如果您在代码中使用n = 200 而不是n = 15,则近似误差将足够低,以至于精确解ln(2) = 0.693147... 的前两位小数将是正确的。

n 参数增加得越多,ln(2) 的近似值就越好。

【讨论】:

  • "你增加的越多 n..." 如果你把它增加得足够高,你会得到一个堆栈溢出:)
  • @BitTickler:检查一下你会在什么时候得到这个网站的同名会很有趣,毕竟这里的所有重复堆栈都是最小的
【解决方案2】:

您的程序确实收敛到正确的数字,只是非常缓慢...

log(1,15) 返回 0.725,如您所见,log(1,50) 是 0.683,log(1,100) 是 0.688,log(1,200) 是 0.691。这已经接近您预期的数字,但还有很长的路要走...

所以您的代码中没有 C++ 或递归错误 - 您只需要找到更好的泰勒级数来计算 log(X)。不要为 log(1+x) 寻找泰勒级数 - 这些通常会假设 x 很小,并且对于小的 x 会快速收敛,而不是 x=1。

【讨论】:

  • 很高兴知道这一点!?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
  • 2020-04-01
  • 2019-04-11
  • 2020-10-27
  • 2020-04-06
  • 2022-06-18
  • 2018-09-13
相关资源
最近更新 更多