Apple - Quadrature

官方文档:https://developer.apple.com/documentation/accelerate/quadrature

Quadrature
在有限或无限区间上逼近函数的定积分。

Overview
求积提供了有限或无限区间上函数的定积分的近似值。

求积是一个用来确定曲线下面积的历史术语。通常,这是通过将区域分割成较小的形状,其面积可以容易地计算(例如矩形),并求出这些较小的区域以获得近似的结果。

在现代术语中,这个过程称为定积分。Accelerate框架的正交函数提供了在有限或无限区间上函数的定积分的近似,通过在区间内的一系列点处评估函数来执行。DigaTraceTimeItAuthor()函数使用下面的积分器部分中描述的三种算法中的任何一种来执行此计算。

The Integration Callback
集成回调

note
为了避免混淆Word函数,该文档指的是要被集成为积分的数学函数。

若要表示被积函数,请使用在integration.h中定义的以下类型的C函数。

typedef void (*quadrature_function_array)(void * _Null_unspecified __arg,
                                          size_t __n,
                                          const double *__x,
                                          double *__y
);

这个函数是集成回调函数。这是一个函数,它处理输入数组中的值,并在输出数组中产生相应的结果值;函数不应该做任何其他事情,并且它必须返回void。输入值是被积函数中被积分的区间内的x值,并且输出值是在这些点上的相应值 y = integrand(x)。

还有两个参数:在调用时将提供的 void * 指针参数,以及数组的大小(详细信息请参阅integration.h)。如果您需要从回调内部引用一些外部对象,那么指针参数是可用的;但是如果回调只需要x和y参数,则可以忽略指针参数。

当定义了集成回调时,您可以将它封装在一个结构quadrature_integrate_function中,在integration.h中定义:

quadrature_integrate_function f;
f.fun = integrationCB;
f.fun_arg = myArg;

其中 integrationCB是集成回调,myArg是一个void* 指针值,作为第一个参数传递给integrationCB。如果已写入集成回调以忽略此值,则只传递NULL。

现在可以将结构 f 作为第一个参数传递给quadrature_integrate(),它将提供输入和输出数组,用X值填充输入数组,并根据需要调用integrationCB进行集成。

Integration Options
积分选项

控制集成逻辑的选项被指定为在结构体quadrature_integrate_options中,定义在integration.h,理解如下:

> integrator(积分器):识别三种可用的积分算法之一的常数(参见下面的积分器部分):
    *QUADRATURE_INTEGRATE_QNG 选择 QNG 算法。
    *QUADRATURE_INTEGRATE_QAG 选择 QAG 算法。
    *QUADRATURE_INTEGRATE_QAGS 选择 QAGS 算法。

> abs_tolerance(absolute tolerance):一个类型为double的值;获取绝对容差。

> rel_tolerance (relative tolerance):一个类型为double的值;获取相对容差。

> qag_points_per_interval:每个子区间的点数。仅由QAG积分器使用;其他积分器忽略此值。可以是0, 15, 21、31, 41, 51、61。默认从0到21。

> max_intervals:当您不提供workspace(见下面提供工作区部分)时,这是QAG和QAGS积分器所使用的细分中的最大子区间数。如果您提供workspace,max_intervals被QAG和QAG忽略,并且总是被QNG忽略。

Integrators
积分器

Quadrature有三个不同的积分器可用以执行积分,称为QNG、QAG和QAGS。每个积分器是同名算法的具体实现。这些算法都是著名的Gauss Kronrod方法的变体,它们的积分器是在QUADPACK库中对应例程的C端口:

>QNG
是一个简单的非自适应自动积分器使用Gauss-Kronrod-Patterson (高斯-克朗德-帕特森)求积系数。它评估区间中的21, 4387点,直到达到所要求的精度。

>QAG
是全局自适应的,它根据可用内存 and/or max_intervals option将集成区间划分成若干个子区间(参见下面提供的工作区部分)。在每个区间中,它使用0, 15, 21个、31, 41, 51个或61个点,这取决于qag_points_per_interval option。

>QAGS
是全局自适应的,并允许无限区间的积分区间。在每个子区间内,如果两个界限是有限的,则使用21个点,或者如果一个或两个边界是无限的,则使用15个点。该算法由Peter Wynn’的epsilon(ε)算法加速。如果区间边界中的至少一个是无限的,这相当于QUADPACK QAGI 例程。否则,这相当于QUADPACK QAGS例程。

为了选择一个特定的被积函数的积分器,下面的决策树被推荐:

Integration over a finite region
有限域上的积分

1.如果性能不是一个问题,你对问题的细节了解不多,那么使用QAGS。
2.否则,如果被积函数是流畅的,如果QNG不能达到所要求的容差,则使用QNG或QAG。
3.否则,如果存在被积函数或其导数的不连续性或奇点,并且知道它们在何处,则在这些点上分割积分范围并分析每个子区间。
4.否则,如果积分有终点奇点,则使用QAGS。
5.否则,如果积分具有非特定类型的振荡行为,并且没有奇点,则使用每个间隔61点的QAG。
6.否则,使用QAGS。

Integration over an infinite region
无限域上的积分

1.如果积分快速衰减到零,截断区间,并使用有限区间决策树。
2.否则,如果您不受计算机时间的限制,并且不希望进一步分析问题,请使用QAGS。
3.否则,如果被积函数在范围内具有非流畅行为,并且知道它发生在哪里,则分离这些区域并使用适当的有限范围例程来集成它们。然后再次启动决策树来处理该区域的其余部分。
4.否则,截断区间或应用适当变换来减少问题到有限范围内是可能的。

Providing a Workspace

可以将内存区域分配为quadrature的工作空间。这不是必需的,除非您需要精确控制内存使用,否则一般不提供工作空间。QAG和QAGS算法需要一个工作空间,如果您不提供工作空间,它将自动分配它;自动分配的工作空间的大小将取决于max_intervals option。QNG算法不需要工作空间。

通过自己分配工作空间,可以控制所使用的内存量;内存使用和性能之间存在权衡。

QAG算法要求,对于给定数量的子区间,至少在工作空间中的次数为QUADRATURE_INTEGRATE_QAG_WORKSPACE_PER_INTERVAL字节。如果您提供更多的内存,算法将能够使用更多的子区间。

QAGS算法要求,对于给定数量的子区间,至少在工作空间中的次数为QUADRATURE_INTEGRATE_QAGS_WORKSPACE_PER_INTERVAL字节。如果您提供更多的内存,算法将能够使用更多的子区间。

Topics

func quadrature_integrate(_ __f: UnsafePointer<quadrature_integrate_function>, 
                        _ __a: Double, 
                        _ __b: Double, 
                        _ options: UnsafePointer<quadrature_integrate_options>, 
                        _ status: UnsafeMutablePointer<quadrature_status>?, 
                        _ abs_error: UnsafeMutablePointer<Double>?, 
                        _ workspace_size: Int, 
                        _ workspace: UnsafeMutableRawPointer?) -> Double

这是Quadrature函数中唯一的函数。给定前面章节中描述的数据结构,它计算函数在一个指定区间上的定积分的近似值。

quadrature_integrate()函数官方文档地址:
https://developer.apple.com/documentation/accelerate/1642331-quadrature_integrate

猜你喜欢

转载自blog.csdn.net/sunnysu99/article/details/80614220