使用同一泰勒级数评估log1 + x的递归

问题描述

#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;
}

我尝试编写上面的函数,使用带递归的taylor系列来评估log(1 + x)函数。但是它没有得到我所期望的结果。 例如: ln(2)= 0.693 ,而我的代码给出了 0.725 。在上面的代码中, n 表示项数。 我也是这个平台的新手,所以我可以说以上问题已经完成,还是需要一些其他信息来做进一步的解释?

解决方法

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

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

增加n参数越多,得到的ln(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会收敛。