用于ln(1 + x)的Maclaurin系列

时间:2018-02-20 10:38:52

标签: c++

我正在尝试使用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;
}

我能做些什么来得到正确的答案?

2 个答案:

答案 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找到实际的收敛半径。公式是

enter image description here