Maclaurin级数的函数逼近
我需要大约(1-x)^0.25,具有给定的精度(例如0.0001)。我正在使用(1+x)^0.25。当当前表达式小于精度时,我需要停止近似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
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对,但在这里要求的公差水平上,对于这个问题,我认为你没有触及这些问题。总而言之,这似乎是一项奇怪的任务。我想我会选择一个更容易处理的终止标准!