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

时间:2009-02-12 20:33:48

标签: precision numerical-analysis taylor-series significance

我正在尝试使用泰勒系列来开发一种用于求解函数的数字声音算法。我已经有一段时间了,但还没有运气。我不确定我做错了什么。

功能是

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)组件,甚至将所有三个组合起来,但最终似乎没有任何结果正确。任何帮助表示赞赏。

6 个答案:

答案 0 :(得分:3)

精度损失可能会因为x ~ 0ln(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 :(得分:1)

由于这是作业,我只是想尝试指出正确的方向。

解决方案1 ​​

不要使用Talyor级数近似,而是尝试简单地使用root finding algorithm,例如Newton-Raphson方法,线性插值或区间二分(或甚至将它们组合)。它们实现起来非常简单,并且通过适当选择起始值,根可以非常快速地收敛到精确值。

解决方案2

如果你真的需要出于任何原因使用泰勒级数近似,那么只需扩展sin(x),ln(x)和其他任何东西。 (通过ln(x)乘以去除你的情况下的分母将起作用)。那么你需要使用某种多项式方程求解器。如果你想要一个合理的准确度,你需要超越我想象的第三或第四种能力,这意味着一个简单的分析解决方案并不容易。但是,您可能希望查看Durand-Kerner method之类的内容来解决任何顺序的一般多项式。不过,如果你需要使用高阶术语,这种方法只会导致并发症,所以我肯定会推荐解决方案1.

希望有帮助...

答案 2 :(得分:1)

我认为你需要看看ln(x + 1)会发生什么x - > 0,你会发现为什么这个函数在x = 0附近表现不佳。

答案 3 :(得分:0)

我没有密切关注这一点,但你应该知道一些泰勒系列非常非常缓慢地收敛。

答案 4 :(得分: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

答案 5 :(得分:0)

使用的方法是正确的 - 只需确保您的计算器处于弧度模式。