使用相同的泰勒级数评估 log(1+x) 的递归
Recursion for evaluating log(1+x) using taylor series of the same
#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 = 200
而不是 n = 15
,则近似误差将足够低,精确解 ln(2) = 0.693147...
的前两位小数将是正确的.
增加 n
参数越多,ln(2)
的近似值就越好。
你的程序确实收敛到正确的数字,只是非常慢...
log(1,15)
returns 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。
#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 = 200
而不是 n = 15
,则近似误差将足够低,精确解 ln(2) = 0.693147...
的前两位小数将是正确的.
增加 n
参数越多,ln(2)
的近似值就越好。
你的程序确实收敛到正确的数字,只是非常慢...
log(1,15)
returns 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。