c - Maclaurin 级数的函数逼近

标签 c approximation taylor-series

我需要以给定的精度(例如 0.0001)近似 (1-x)^0.25。我正在使用 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;
}

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

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

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

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

在那之后准确度增加了很多(当然是 fox x>0)。冗余错误源于长期的双重不准确。就这样。无论如何,谢谢你们。

最佳答案

尝试绘制函数图

abs((1.0+x)alpha - binomial_formula(alpha,x,tolerance))
即使在接近的 x 范围内,例如 [-0.5;0.5] 你也会得到类似的东西: enter image description here

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

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

关于c - Maclaurin 级数的函数逼近,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5333295/

相关文章:

c++ - 实现最速下降算法,可变步长

c - 协议(protocol)不支持的地址族

c - 用 C 语言的泰勒级数逼近 Sine(x) 并遇到很多问题

c++ - 如何找到套接字的IP地址c++/c

与 qsort 一起使用的转换函数

r - 在 dplyr 中使用 approx

c++ - 提高超越方程解的精度

types - 为什么存储在 Float 数据类型中的数据被视为近似值?

c - 使用泰勒级数逼近 sin(x) 直到项的绝对值低于某个实值

linux - 汇编中的泰勒级数指数函数