使用泰勒级数来避免精度损失

我正在尝试使用泰勒系列来开发一个用于求解函数的数字声音算法。我已经有一段时间了,但还没有运气。我不确定我做错了什么。 功能是
f(x)=1 + x - sin(x)/ln(1+x)   x~0
另外:为什么在这个功能中甚至会出现精度损失?当x接近零时,sin(x)/ ln(1 + x)甚至不接近与x相同的数字。我没有看到甚至丢失的重要性。 为了解决这个问题,我相信我需要使用泰勒展开sin(x)和ln(1 + x),这是
x - x^3/3! + x^5/5! - x^7/7! + ...
x - x^2/2 + x^3/3 - x^4/4 + ...
分别。我试图使用类似的分母来组合x和sin(x)/ ln(1 + x)组件,甚至将所有三个组合起来,但最终似乎没有任何结果正确。任何帮助表示赞赏。     
已邀请:
精度的损失可能会因为
x ~ 0
ln(1+x)
也接近于0,所以你最后除以一个非常小的数字。电脑不是很擅长;-) 如果你将泰勒系列直接用于
ln(1+x)
,那将会是一种痛苦,因为你最终会被无限的一系列术语分开。对于这样的情况,我通常更喜欢从定义中为整个函数计算整个函数的泰勒级数:
f(x) = f(0) + f'(0) x + f''(0) x/2 + f'''(0) x/6 + ...
从中得到
f(x) = 2 + 3x/2 - x^2/4 - x^3/24 - x^4/240 - 23x^5/1440 + 31x^6/2880 ...
(我欺骗并将其插入Mathematica ;-)就像史蒂夫所说,这个系列并没有快速收敛,尽管我现在想不出更好的方法。 编辑:我想我误解了这个问题 - 如果你要做的就是找到函数的零,那么肯定比使用泰勒系列更好的方法。     
由于这是家庭作业,我只是想尝试指出正确的方向。 解决方案1 不要使用Talyor级数近似,而是尝试简单地使用根寻找算法,例如Newton-Raphson方法,线性插值或区间二分法(或甚至将它们组合)。它们实现起来非常简单,并且通过适当选择起始值,根可以非常快速地收敛到精确值。 解决方案2 如果你真的需要出于任何原因使用泰勒级数近似,那么只需展开sin(x),ln(x)和其他任何东西。 (通过ln(x)乘以去除你的情况下的分母将起作用)。那么你需要使用某种多项式方程求解器。如果你想要一个合理的准确度,你需要超越我想象的第三或第四种能力,这意味着一个简单的分析解决方案并不容易。但是,您可能希望查看类似于Durand-Kerner方法的内容,以解决任何顺序的一般多项式。不过,如果你需要使用高阶术语,这种方法只会导致并发症,所以我肯定会推荐解决方案1。 希望有帮助......     
我认为你需要看看ln(x + 1)发生了什么x - > 0,你会发现为什么这个函数在x = 0附近表现不佳。     
我没有密切关注这一点,但你应该知道,一些泰勒系列会非常非常慢地收敛。     
只需直接计算f的泰勒级数。 Maxima给了我(关于x = 0的前4个术语):
(%i1) f(x):=1 + x - sin(x)/log(1+x);
                                           - sin(x)
(%o1)                     f(x) := 1 + x + ----------
                                          log(1 + x)


(%i2) taylor(f(x),x,0,4);
                                2    3    4
                           x   x    x    x
(%o2)/T/                   - + -- + -- + --- + . . .
                           2   4    24   240
    
使用的方法是正确的 - 只需确保您的计算器处于弧度模式。     

要回复问题请先登录注册