【问题标题】:Using Taylor Series to Avoid Loss of Precision使用泰勒级数避免精度损失
【发布时间】:2023-03-24 14:58:01
【问题描述】:

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

功能是

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

【问题讨论】:

  • 你的泰勒公式看起来不错...问题是你在运行算法时没有得到准确的值,还是你正在寻找一种方法来分解它以便你不根本不需要泰勒级数?
  • 第一个。当正确答案看起来应该是 .9825 时,我不断得到类似 0.000000005 的信息。
  • 呸,我完全是个菜鸟。这就是为什么您不要让计算器处于度数模式的原因。
  • 我认为您的意思是“分别”而不是“尊重”
  • 顺便说一句,当 x 接近于零时,sin(x)/ln(1+x) 实际上确实接近于零。 sin(x) -> x as x -> 0 和 ln(x+1) -> 0 as x -> 0 几乎为零,几乎为零也几乎为零

标签: precision numerical-analysis taylor-series significance


【解决方案1】:

可能会出现精度损失,因为当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 ;-) 就像史蒂夫说的那样,这个系列并没有那么快收敛,尽管我目前想不出更好的方法。

编辑:我想我误读了这个问题 - 如果您只想找到函数的零点,那么肯定有比使用泰勒级数更好的方法。

【讨论】:

  • 不,你没看错——我不是在寻找根源,我是在尝试开发一种在编程到计算机中时可以工作的算法。我会尝试刚才提到的为整个函数找到泰勒级数的方法。
  • 其实再看一遍,找到整个函数的序列看起来不是很简单,考虑到 f(0) 不存在。 :\
【解决方案2】:

因为这是家庭作业,所以我只是想在正确的方向上给出一些指示。

解决方案 1

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

解决方案 2

如果您出于某种原因确实需要使用泰勒级数近似,那么只需扩展 sin(x)、ln(x) 和其他任何内容。 (乘以 ln(x) 以删除您的情况下的分母将起作用)。然后你需要使用某种多项式方程求解器。如果您想要合理的准确度,则需要超越我想象的 3 次或 4 次方,这意味着简单的分析解决方案并不容易。但是,您可能想研究像 Durand-Kerner method 这样的东西来解决任何阶的一般多项式。不过,如果您需要使用高阶项,这种方法只会导致复杂化,所以我肯定会推荐解决方案 1。

希望对您有所帮助...

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我没有仔细研究过这个,但你应该知道,一些泰勒级数收敛得非常非常缓慢。

      【讨论】:

        【解决方案5】:

        直接计算 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
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2016-06-04
            • 2016-03-06
            • 2014-04-03
            • 1970-01-01
            • 2021-08-12
            • 2021-08-13
            • 2015-05-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多