我正在尝试使用Maclaurin系列在c ++中计算ln(1 + x)的值:xx ^ 2/2 + x ^ 3/3 -... +( - 1)^(n + 1 )* X ^2π/ 2N。但是如果我插入一个大于2的数字,程序将返回错误nan。
我的代码在这里:
double ln(double x){
double oldx=x,prec,t=x,i=1,eps=0.0001;
int semn=-1;
do{ prec=x;
t=t*oldx;
i++;
x=prec+(t/i)*semn;
semn=-semn;
}while(fabs(x-prec)>=eps);
return x;
}
我能做些什么来得到正确的答案?
答案 0 :(得分:5)
这不是您的计划中的错误,您在其有效范围之外使用Maclaurin系列。这个泰勒级数的收敛半径是1,因此你可以得到ln(1 + x)的| x | < 1.查看维基百科的this section中的图像,清楚地表明近似失败的方式是添加更多的术语无济于事。
电源系列始终会聚合在磁盘(复杂平面)中,该磁盘在到达任何奇点之前停止,并且仅在函数为entire时才是无限的。函数ln(1 + x)在x = -1时偏离负无穷大,因此半径可以(最多)为1。可以使用更严格的方法确定它。您可以阅读更多相关信息here。
答案 1 :(得分:0)
这里的问题是泰勒级数不会收敛于大于2的任何数,换句话说,ln(1 + x)的泰勒级数不会收敛于x> 1。 1.您可以使用ratio test找到实际的收敛半径。公式是