问题描述
#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会收敛。