我正在尝试使用泰勒系列来开发一种用于求解函数的数字声音算法。我已经有一段时间了,但还没有运气。我不确定我做错了什么。
功能是
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)组件,甚至将所有三个组合起来,但最终似乎没有任何结果正确。任何帮助表示赞赏。
答案 0 :(得分:3)
精度损失可能会因为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 :(得分:1)
由于这是作业,我只是想尝试指出正确的方向。
不要使用Talyor级数近似,而是尝试简单地使用root finding algorithm,例如Newton-Raphson方法,线性插值或区间二分(或甚至将它们组合)。它们实现起来非常简单,并且通过适当选择起始值,根可以非常快速地收敛到精确值。
如果你真的需要出于任何原因使用泰勒级数近似,那么只需扩展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)
使用的方法是正确的 - 只需确保您的计算器处于弧度模式。