GSL中的级数加速

级数加速

    本章描述的函数利用莱文u变换加速了级数的收敛。这种方法从级数的开始取少量项,并使用系统的近似来计算外推值其误差的估计。u变换适用于收敛级数和发散级数,包括渐近级数。

    这些函数声明在头文件gsl_sum.h中。

33.1 加速函数

下面的函数计算级数的完整莱文u变换及其误差估计。误差估计是通过将舍入误差从每一项传播到最后的外推来计算的。

这些函数用于对每一项精度都很高的解析级数求和,并假定舍入误差来源于有限的精度。取每一项的相对误差为GSL_DBL_EPSILON阶。

外推值中的误差计算是一个O(N2)过程,这在时间和内存上花费都很大。下一节将介绍一种更快但不太可靠的方法,它根据外推值的收敛来估计误差。对于这里描述的方法,必须计算和存储中间值和导数的完整表,直到O(N),这给出了一个可靠的误差估计。

gsl_sum_levin_u_workspace

莱文u变换工作空间。

gsl_sum_levin_u_workspace * gsl_sum_levin_u_alloc(size_t n)

本函数为n项的莱文u变换分配了一个工作空间。工作空间的大小为O(2n2+3n)。

void gsl_sum_levin_u_free(gsl_sum_levin_u_workspace * w)

    本函数释放工作空间w占用的内存空间。

扫描二维码关注公众号,回复: 13279770 查看本文章

int gsl_sum_levin_u_accel(const double * array, size_t array_size,

gsl_sum_levin_u_workspace * w, double * sum_accel,

double * abserr)

    本函数取array_size大小的array中一个级数项,并使用莱文u变换计算该级数的外推极限。w中必须提供额外的工作空间。外推和存储在sum_accel中,绝对误差的估计存储在abserr中。实际的逐项和由w->sum_plain返回。算法计算截断误差(两个连续外推之间的差异)和舍入误差(由单个项传播),为外推选择最佳的项数。通过array传入的级数的所有项都是非零的。

33.2 无误差估计的加速函数

    本节中描述的函数计算级数的莱文u变换,并试图从外推的“截断误差”(最后两个近似之间的差)中估计误差。使用这种方法避免了计算导数中间表的需要,因为误差是由外推值本身的行为估计的。因此,该算法是一个O(N)过程,只需要O(N)项存储。如果级数收敛足够快,那么这个过程是可以接受的。当需要对具有相似收敛性的级数进行大量外推运算时,可以采用这种方法。例如,当对由参数化级数定义的函数进行数值积分时,其中的参数只有轻微的变化。为了验证结果的一致性,首先应使用上述完整算法计算一个可靠的误差估计。

gsl_sum_levin_utrunc_workspace

无误差估计的莱文u变换的工作空间。

gsl_sum_levin_utrunc_workspace * gsl_sum_levin_utrunc_alloc(size_t n)

本函数为n项的莱文 u变换分配了一个工作空间,无误差估计。工作空间的大小为O(3n)。

void gsl_sum_levin_utrunc_free(gsl_sum_levin_utrunc_workspace * w)

本函数释放了工作空间w使用的内存。

int gsl_sum_levin_utrunc_accel(const double * array, size_t array_size,

gsl_sum_levin_utrunc_workspace * w, double * sum_accel,

double * abserr_trunc)

    本函数取大小为array_size的array中一个级数的项,并使用莱文u变换计算级数的外推极限。w中必须提供额外的工作空间。外推和存储在sum_accel中。实际的逐项和在w->sum_plain中返回。当两个连续外推的差值达到最小值或足够小时,算法终止。这两个值之间的差值用于估计错误,并存储在abserr_trunc中。为了提高算法的可靠性,在计算截断误差时,外推值被移动平均代替,以平滑波动。

猜你喜欢

转载自blog.csdn.net/yxmlhc/article/details/120591383