我试图在 c ++ 中使用 Maclaurin 系列计算 ln(1 + x)的值:x-x ^ 2 / 2 + x ^ 3 / 3-...+(-1)^(n + 1)* x ^ 2n / 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;
}
我能做些什么来得到正确的答案?
这不是您的程序中的错误,您正在使用 Maclaurin 级数超出其有效性范围。此泰勒级数的收敛半径为 1,因此对于 | x | & lt;1,您将从中得到 ln(1 x)。请参阅 Wikipedia 的this section中的图像,很明显,近似值以添加更多术语无济于事的方式失败。
幂级数总是收敛在一个磁盘上(在复平面中),该磁盘在到达任何奇点之前就停止了,并且只有在函数为entire时才是无限的。对于 x =-1,函数 ln(1 x)发散到负无穷大,因此半径可以(最多)为 1。可以使用更严格的方法来确定它。您可以阅读更多here。
这里的问题是泰勒级数不会收敛于任何大于 2 的数,换句话说,ln (1 + x) 的泰勒级数不会收敛于 x & gt;1。你可以用ratio test找到实际的收敛半径。公式为
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(40条)