【问题标题】:Function approximation with Maclaurin seriesMaclaurin 级数的函数逼近
【发布时间】:2016-03-23 17:45:06
【问题描述】:

我需要大约 (1-x)^0.25 并具有给定的精度(例如 0.0001)。我将expansion found on Wikipedia 用于 (1+x)^0.25。当当前表达式小于准确度时,我需要停止近似。

long double s(long double x, long double d) {
    long double w = 1;
    long double n = 1; // nth expression in series
    long double tmp = 1;

    // sum while last expression is greater than accuracy
    while (fabsl(tmp) >= d) {
        tmp *= (1.25 / n - 1) * (-x); // the next expression
        w += tmp; // is added to approximation
        n++; 
    } 

    return w;
}

不要介意long double n。 :P 当我不检查当前表达式的值但计算 1000 个或更多表达式时,这很有效。该函数的域是 并且 s() 可以很好地计算 中 x 的近似值。参数越大,计算的误差越大。从 0.6 开始,它超过了准确度。

我不确定问题是否足够清楚,因为我不太了解英语数学语言。问题是 while 条件有什么问题,以及为什么函数 s() 不能正确近似。

编辑: 问题基本解决了。当 x>0 时,我必须从 1 中减去连续表达式的绝对值。

if (x<0)
   w += tmp;
else
   w -= fabsl(tmp);

在那之后准确度提高了很多(当然是狐狸 x>0)。冗余误差源于长期的双重误差。就这样。还是谢谢你们。

【问题讨论】:

  • 如果你想在区间上获得统一的精度,你应该使用使用 Remez 算法而不是 Taylor 确定的多项式。 en.wikipedia.org/wiki/Approximation_theory
  • @Pascal 这最好实现为sqrt(sqrt(1.0-x)),但这是一个家庭作业。重点不是算法的效率,而是学生实现算法的能力。
  • 您是否打开了编译器警告?您是否有 C99 编译器(其中描述了 fabsl)或 C89 编译器(没有 fabsl)?
  • @pmg,我使用的是 GCC 4.5,在 c89 和 c99 模式下编译。没有任何变化。
  • @Pascal:切比雪夫多项式更容易计算。

标签: c approximation taylor-series


【解决方案1】:

尝试绘制函数图

abs((1.0+x)alpha - binomial_formula(alpha,x,tolerance))
即使在近距离 x 范围内,例如 [-0.5;0.5] 你也会得到类似:

这意味着您的二项式展开实现是不稳定的。随着 x 离零越来越远 - 系列必须包含越来越多的给定精度的项。但是在当前的扩展实现中这样做会导致Catastrophic cancellation 发生(一些浮点错误累积机制)。尝试阅读我给出的关于如何设计数值稳定算法的链接。

顺便说一句,感谢您提出真正有趣的问题!

【讨论】:

    【解决方案2】:

    您的问题是,虽然您的算法的迭代部分很好,但终止不是您认为的那样。

    当计算无限和时,您使用的泰勒级数展开是精确的。但是,您无法评估该无限和并且正在截断。

    我想您假设当tmp 变得小于您所需的容差时,w 中的错误也小于该容差。

    然而,事实并非如此。每次迭代的误差是剩余项的无限和。它是您要丢弃的无数项的总和。其中第一个,即终止点 tmp 的值,可能小于您的容忍度,但它们的总和可能大于您的容忍度。

    当 (-x) 为负时,您碰巧侥幸逃脱,因为 tmp 的交替符号对您有利。当 (-x) 为正时,当x 接近于零时,你就可以逃脱。

    但是,我不相信有一种简单的方法可以提出一个简单的通用停止标准。您必须能够对要丢弃的条款进行一些限制。这现在变成了一个数学问题,而不是一个编程问题。

    【讨论】:

    • +1。作为一种启发式方法,第一个被忽略项的大小通常给出截断误差的粗略指示。但在这里,总和是交替存在的事实存在另一个(数字)问题。
    • @Alexandre 只有当(-x) 为负数时才会交替出现,并且错误的停止标准表现更好。当tmp 没有交替符号时,截断错误更麻烦,但可能更容易计算数学界限。
    • 是的,但是对一个替代级数求和的问题在数值上很困难。
    • @Alexandre 是的,但是在此处所需的容忍度范围内,对于这个问题,我认为您没有遇到这些问题。总而言之,这似乎是一个奇怪的任务。我想我会选择一个更容易处理的终止标准!
    猜你喜欢
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 2019-07-11
    • 1970-01-01
    相关资源
    最近更新 更多