GSL中的数值积分

数值积分

本章描述了对一维函数进行数值积分(求积)的程序。常用函数有自适应和非自适应集成的例程,具体情况有专门的例程。这些包括在无限和半无限范围内的积分,奇异积分,包括对数奇点,柯西主值的计算和振荡积分。本库重新实现了在QUADPACK中使用的算法,数值积分包由Piessens、de donker - kapenga、Ueberhuber和Kahaner编写。在Netlib上可以找到Fortran版的QUADPACK代码。包括具有高精度系数的非自适应、定阶Gauss-Legendre积分例程,以及IQPACK中各种加权函数的定阶求积规则。

本章中描述的函数声明在头文件gsl_integration.h中。

17.1 介绍

    每种算法都会计算出以下形式的定积分的近似值:

其中,wx是一个权重函数(对于一般的被积函数wx=1)。用户提供了绝对误差和相对误差界限(epsabs,epsrel),它规定了以下精度要求:

 其中,RESULT是该算法获得的数值近似值。该算法尝试以以下不等式成立的方式估算绝对误差ABSERR = | RESULT - I |。

     简言之,例程返回第一近似值,其绝对误差小于epsabs或相对误差小于epsrel。

请注意,这是一个“或”约束,而不是与约束。要计算指定的绝对误差,请将epsrel设置为零。要计算指定的相对误差,请将epsabs设置为零。如果误差范围太严格,例程将无法收敛,但始终会返回到该阶段为止获得的最佳近似值。

   QUADPACK中的算法使用基于以下字母的命名约定:

Q - 积分函数

N - 非自适应积分器

A - 自适应积分器

G - 一般被积函数(用户定义)

W - 被积函数的权重函数

S - 更易积分的奇异点

P - 可提供特殊难点

I - 无穷大的积分范围

O - 周期变动的权重函数,cossin

F - 傅里叶积分

C - 柯西主值

算法建立在求积规则对、高阶规则对和低阶规则对的基础上。高阶规则用于计算小范围内积分的最佳近似值。高阶规则和低阶规则的结果之差给出了近似误差的估计。

17.1.1 不带权重函数的被积函数

一般函数(没有权重函数)的算法是基于高斯-克朗罗德规则。

高斯-克朗罗德规则以m阶的经典高斯求积规则开始。该规则在每个横坐标之间添加额外的点,从而得到更高阶的2m+1阶克朗罗德规则。克朗罗德规则是有效的,因为它重用了来自高斯规则的现有函数计算。

用高阶克朗罗德规则作为积分的最佳逼近,用两规则之差作为逼近误差的估计。

17.1.2 带权重函数的被积函数

对于具有权重函数的被积函数,该算法使用了克伦肖-柯蒂斯求积规则。

克伦肖-柯蒂斯规则从被积函数的n阶切比雪夫多项式近似开始。这个多项式可以精确地积分,从而逼近原函数的积分。切比雪夫展开式可以扩展到更高阶,以改进近似并提供误差的估计。

17.1.3 具有奇异权函数的被积函数

被积函数中奇异点(或其他行为)的存在会导致切比雪夫近似的缓慢收敛。在QUADPACK中使用的改进的克伦肖-柯蒂斯规则分离出几个常见的导致缓慢收敛的权函数。

利用切比雪夫多项式对这些权重函数进行分析积分,从而预先计算修正的切比雪夫矩。把矩和切比雪夫近似结合起来就得到了想要的积分。对函数的奇异部分使用解析积分可以精确地对消,并极大地改善了积分的整体收敛性。

17.2 QNG非自适应高斯-克朗罗德积分

QNG算法是一种非自适应的方法,它使用固定的高斯-克朗罗德-帕特森横坐标来对被积函数进行采样,最大采样点为87个。为平滑函数的快速积分提供了支持。

int gsl_integration_qng(constgsl_function* f, double a, double b, double epsabs,

double epsrel, double * result, double * abserr, size_t * neval)

本函数依次应用高斯-克朗罗德10个、21个、43个和87个点的积分规则,,直到在所需的绝对和相对误差限制(epsabs和epsrel)内取得,f 在(a,b)范围内的积分估计值。本函数返回最终的近似值result,绝对误差的估计数abserr和使用的函数计算次数neval。高斯-克朗罗德规则的设计方式是,每个规则使用其前一个规则的所有结果,以最小化函数计算的总数。

17.3 QAG 自适应积分

    QAG算法是一个简单的自适应积分过程。将积分区域划分为子区间,每次迭代对估计误差最大的子区间进行二等分。当子区间集中于被积函数的局部困难时,这就迅速地减少了整体误差。这些子区间由以下结构来管理,

gsl_integration_workspace

    本工作区处理子区间范围、结果和错误估计的内存。

gsl_integration_workspace * gsl_integration_workspace_alloc(size_t n)

    本函数分配了一个工作空间,可以容纳n个双精度区间,以及它们的积分结果和误差估计。当所有必要的重新初始化由集成函数自动执行时,一个工作空间可以被多次使用。

void gsl_integration_workspace_free(gsl_integration_workspace * w)

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

int gsl_integration_qag(const gsl_function * f, double a, double b, double epsabs,

double epsrel, size_t limit, int key, gsl_integration_workspace * workspace,

double * result, double * abserr)

本函数根据所要求的相对和绝对误差限制, epsabs和epsrel,采用自适应积分规则计算,f在(a,b)上的积分的估计值。该函数返回最终的近似值,result,和绝对误差的估计数,abserr。积分规则由key值决定,key值应该从以下符号名称中选择,

•GSL_INTEG_GAUSS15(key = 1)

• GSL_INTEG_GAUSS21(key = 2)

• GSL_INTEG_GAUSS31(key = 3)

• GSL_INTEG_GAUSS41(key = 4)

• GSL_INTEG_GAUSS51(key = 5)

• GSL_INTEG_GAUSS61(key = 6)

    对应于15个、21个、31个、41个、51个和61个点的高斯-克朗罗德规则。高阶规则为光滑函数提供了更好的准确性,而低阶规则在函数包含局部困难(如不连续)时节省了时间。

    在每个迭代中,自适应积分策略以最大的误差估计将区间一分为二。子区间及其结果存储在workspace提供的内存中。子区间的最大数量由limit给出,它可能不超过工作区的分配大小。

猜你喜欢

转载自blog.csdn.net/yxmlhc/article/details/120521356
今日推荐