Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Maclaurin级数的函数逼近_C_Approximation_Taylor Series - Fatal编程技术网

Maclaurin级数的函数逼近

Maclaurin级数的函数逼近,c,approximation,taylor-series,C,Approximation,Taylor Series,我需要大约(1-x)^0.25,具有给定的精度(例如0.0001)。我正在使用(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 i

我需要大约(1-x)^0.25,具有给定的精度(例如0.0001)。我正在使用(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:当我并没有检查当前表达式的值,而是在计算1000个或更多表达式时,这个方法很有效。函数的域为,s()可以很好地计算x in的近似值。论点越大,计算的误差就越大。从0.6开始,它超过了精度

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;
}
我不确定这个问题是否清楚,因为我不太懂英语数学语言。问题是while条件有什么问题,以及函数s()不能正确逼近的原因

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

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

if(当然是x0)。冗余错误源于长双精度。这就是全部。无论如何感谢你们。

尝试绘制函数abs图((1.0+x)α-二项式_公式(α,x,公差)),即使在接近x的范围内,例如[-0.5;0.5],您也会得到如下结果: abs((1.0+x)alpha - binomial_formula(alpha,x,tolerance))

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


顺便说一句,谢谢你提出了一个非常有趣的问题

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

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

我假设您假设当
tmp
小于所需公差时,
w
中的误差也小于该公差

然而,事实并非如此。每次迭代的误差是剩余项的无限和。它是你扔掉的无穷多个项的总和。其中第一个,即终止点处的
tmp
值可能小于您的公差,但它们的总和可能大于您的公差

当(-x)为负数时,您正好可以侥幸逃脱,因为
tmp
的交替符号对您有利。当(-x)为正时,当
x
接近于零时,你可以不受惩罚


然而,我不相信有一个简单的方法来制定一个简单的通用停止标准。你必须能够对你要放弃的条款设定一些界限。这现在变成了一个数学问题,而不是一个编程问题。

如果你想在区间上获得一致的精度,你应该使用用雷米兹算法确定的多项式,而不是泰勒算法@Pascal最好将其实现为
sqrt(sqrt(1.0-x))
,但这是一个家庭作业练习。关键不在于算法的效率,而在于学生实现算法的能力。你是否打开了编译器警告?您有C99编译器(其中描述了
fabsl
)还是C89编译器(没有
fabsl
)?@pmg,我使用GCC4.5,在C89和C99模式下编译。没有任何变化。@Pascal:Chebyshev多项式更容易计算。+1。作为一种启发式方法,第一个被忽略项的大小通常给出截断误差的粗略指示。但是在这里,还有另一个(数字)问题,即总和是交替的。@Alexandre只有当
(-x)
为负时,它才是交替的,这种情况下,错误的停止标准表现得更好。当
tmp
没有交替符号时,表示截断误差更麻烦,但可能更容易计算数学界限。对,但对交替序列求和的问题在数值上是困难的。@Alexandre对,但在这里要求的公差水平上,对于这个问题,我认为你没有触及这些问题。总而言之,这似乎是一项奇怪的任务。我想我会选择一个更容易处理的终止标准!