LMMC
Lamina Mathematic core
载入中...
搜索中...
未找到
quadrature.h 文件参考

一元数值积分:梯形、Simpson、Gauss-Legendre、自适应 Simpson。 更多...

#include "lmmc/config.h"
#include "lmmc/status.h"
#include <stddef.h>
quadrature.h 的引用(Include)关系图:
此图展示该文件被哪些文件直接或间接地引用了:

浏览该文件的源代码.

结构体

struct  lmmc_quad_result_t
 自适应积分输出结果。 更多...

类型定义

typedef lmmc_real_t(*) lmmc_quad_func_t(lmmc_real_t x, void *user_data)
 被积函数签名 \(f(x)\) 。

函数

lmmc_status_t lmmc_quad_trapezoid (lmmc_quad_func_t func, void *user_data, lmmc_real_t a, lmmc_real_t b, size_t n, lmmc_real_t *out_result)
 复合梯形公式:将 \([a,b]\) 等分为 n 段。
lmmc_status_t lmmc_quad_simpson (lmmc_quad_func_t func, void *user_data, lmmc_real_t a, lmmc_real_t b, size_t n, lmmc_real_t *out_result)
 复合 Simpson 公式:将 \([a,b]\) 等分为 n 段(要求偶数)。
lmmc_status_t lmmc_quad_gauss_legendre (lmmc_quad_func_t func, void *user_data, lmmc_real_t a, lmmc_real_t b, size_t order, lmmc_real_t *out_result)
 Gauss-Legendre 求积:将 \([a,b]\) 仿射映射到 \([-1,1]\) 后使用正交节点。
lmmc_status_t lmmc_quad_adaptive (lmmc_quad_func_t func, void *user_data, lmmc_real_t a, lmmc_real_t b, lmmc_real_t abs_tol, lmmc_real_t rel_tol, size_t max_depth, lmmc_quad_result_t *out_result)
 自适应 Simpson 积分,使用最大误差堆控制全局误差。
lmmc_status_t lmmc_quad_romberg (lmmc_quad_func_t f, void *ud, lmmc_real_t a, lmmc_real_t b, lmmc_real_t abs_tol, size_t max_iter, lmmc_quad_result_t *out)
 Romberg 积分(Richardson 外推加速梯形法则)。
lmmc_status_t lmmc_quad_tanh_sinh (lmmc_quad_func_t f, void *ud, lmmc_real_t a, lmmc_real_t b, lmmc_real_t abs_tol, size_t max_nodes, lmmc_quad_result_t *out)
 Tanh-Sinh(双指数)积分,适用于端点奇异性。
lmmc_status_t lmmc_quad_gauss_hermite (lmmc_quad_func_t f, void *ud, size_t order, lmmc_real_t *out)
 Gauss-Hermite 求积:权函数 \(\exp(-x^2)\) ,积分域 \((-\infty, +\infty)\) 。
lmmc_status_t lmmc_quad_gauss_laguerre (lmmc_quad_func_t f, void *ud, size_t order, lmmc_real_t *out)
 Gauss-Laguerre 求积:权函数 \(\exp(-x)\) ,积分域 \([0, +\infty)\) 。

详细描述

一元数值积分:梯形、Simpson、Gauss-Legendre、自适应 Simpson。

在文件 quadrature.h 中定义.


结构体说明

◆ lmmc_quad_result_t

struct lmmc_quad_result_t

自适应积分输出结果。

在文件 quadrature.h 第 24 行定义.

lmmc_quad_result_t 的协作图:
成员变量
lmmc_real_t value

积分估计值。

lmmc_real_t error

误差估计。

size_t num_evals

函数求值次数。

类型定义说明

◆ lmmc_quad_func_t

typedef lmmc_real_t(*) lmmc_quad_func_t(lmmc_real_t x, void *user_data)

被积函数签名 \(f(x)\) 。

在文件 quadrature.h 第 19 行定义.

函数说明

◆ lmmc_quad_trapezoid()

lmmc_status_t lmmc_quad_trapezoid ( lmmc_quad_func_t func,
void * user_data,
lmmc_real_t a,
lmmc_real_t b,
size_t n,
lmmc_real_t * out_result )

复合梯形公式:将 \([a,b]\) 等分为 n 段。

采样点在 [-1,1] 的归一化坐标中生成,并通过溢出安全的中心和半长度 映射到 [a,b];不会直接形成可能溢出的 b-a。

参数
[in]func被积函数回调。
[in]user_data传递给 func 的用户上下文。
[in]a积分下限。
[in]b积分上限。
[in]n子区间数(>= 1)。
[out]out_result输出积分近似值。
返回
LMMC_STATUS_OK 成功; LMMC_STATUS_INVALID_ARGUMENT 若端点非有限、顺序无效、 n == 0 或指针为 NULL。
副作用
  • 回调 func 被调用 n+1 次。
  • 不分配堆内存。

在文件 quadrature_fixed.c 第 24 行定义.

引用了 lmmc_quad_center_half_length(), lmmc_quad_trapezoid(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE , 以及 LMMC_STATUS_OK.

被这些函数引用 lmmc_quad_trapezoid().

函数调用图:
这是这个函数的调用关系图:

◆ lmmc_quad_simpson()

lmmc_status_t lmmc_quad_simpson ( lmmc_quad_func_t func,
void * user_data,
lmmc_real_t a,
lmmc_real_t b,
size_t n,
lmmc_real_t * out_result )

复合 Simpson 公式:将 \([a,b]\) 等分为 n 段(要求偶数)。

采样点先在 [-1,1] 的归一化坐标中生成,再通过溢出安全的中心和半长度 映射到 [a,b];不会直接形成可能溢出的 b-a。

参数
[in]func被积函数回调。
[in]user_data传递给 func 的用户上下文。
[in]a积分下限。
[in]b积分上限。
[in]n子区间数(必须为偶数且 >= 2)。
[out]out_result输出积分近似值。
返回
LMMC_STATUS_OK 成功; LMMC_STATUS_INVALID_ARGUMENT 若 n 为奇数、n == 0 或指针为 NULL。
副作用
  • 回调 func 被调用 n+1 次。
  • 不分配堆内存。

在文件 quadrature_fixed.c 第 58 行定义.

引用了 lmmc_quad_center_half_length(), lmmc_quad_simpson(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE , 以及 LMMC_STATUS_OK.

被这些函数引用 lmmc_quad_simpson().

函数调用图:
这是这个函数的调用关系图:

◆ lmmc_quad_gauss_legendre()

lmmc_status_t lmmc_quad_gauss_legendre ( lmmc_quad_func_t func,
void * user_data,
lmmc_real_t a,
lmmc_real_t b,
size_t order,
lmmc_real_t * out_result )

Gauss-Legendre 求积:将 \([a,b]\) 仿射映射到 \([-1,1]\) 后使用正交节点。

中心与半长度按端点符号选择等价公式,不直接形成可能溢出的 a+b 或 b-a。对 2*order-1 次以下的多项式精确积分;节点与权重在编译时 预计算(order <= 20)。

参数
[in]func被积函数回调。
[in]user_data传递给 func 的用户上下文。
[in]a积分下限。
[in]b积分上限。
[in]order正交多项式阶数(节点数),范围 [1, 20]。
[out]out_result输出积分近似值。
返回
LMMC_STATUS_OK 成功; LMMC_STATUS_INVALID_ARGUMENT 若 order 超出范围或指针为 NULL。
副作用
  • 回调 func 被调用恰好 order 次。
  • 不分配堆内存。

在文件 quadrature_gaussian.c 第 272 行定义.

引用了 LMMC_GL_MAX_ORDER, LMMC_GL_MIN_ORDER, lmmc_quad_center_half_length(), lmmc_quad_gauss_legendre(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE , 以及 LMMC_STATUS_OK.

被这些函数引用 lmmc_quad_gauss_legendre().

函数调用图:
这是这个函数的调用关系图:

◆ lmmc_quad_adaptive()

lmmc_status_t lmmc_quad_adaptive ( lmmc_quad_func_t func,
void * user_data,
lmmc_real_t a,
lmmc_real_t b,
lmmc_real_t abs_tol,
lmmc_real_t rel_tol,
size_t max_depth,
lmmc_quad_result_t * out_result )

自适应 Simpson 积分,使用最大误差堆控制全局误差。

每次二分误差最大的可分叶区间,并复用已经求得的回调样本。 所有叶区间(包括达到深度限制的叶)的校正积分和非负误差估计 分别以补偿求和累加。仅在全局条件 \(sum\_error \le \max(abs\_tol, rel\_tol |sum\_value|)\) 满足时返回成功。误差为 Simpson 外推估计,对不光滑或欠采样函数 不保证严格误差界。 中点和区段半长度使用溢出安全公式。无法继续表示内部采样点的叶 不再细分,但仍保留在全局积分和误差中。

参数
[in]func被积函数回调。
[in]user_data传递给 func 的用户上下文。
[in]a积分下限。
[in]b积分上限。
[in]abs_tol绝对容差(>= 0)。
[in]rel_tol相对容差(>= 0)。
[in]max_depth最大二分深度(根为 0);工作区按需增长。
[out]out_result包含积分值、误差估计与求值次数。
返回
LMMC_STATUS_OK 全局误差估计满足容差; LMMC_STATUS_WARNING_MAX_DEPTH 容差未满足且所有叶因深度或 浮点表示限制不能继续细分,输出仍为有效的有限估计; LMMC_STATUS_INVALID_ARGUMENT 指针为 NULL、端点非有限或 不满足 a < b、容差非有限或为负; LMMC_STATUS_ALLOCATION_FAILED 堆分配失败或容量/字节计数溢出; LMMC_STATUS_NUMERICAL_FAILURE 回调或中间量非有限、求值计数 溢出,或初始区间不能表示五个不同的 Simpson 采样点。
注解
  • 使用可增长的堆工作区(LMMC 可恢复分配器),无递归栈。
  • 已有样本不重复调用;通常初始 5 次,每次二分新增 4 次求值。
  • 只有 OK 或 WARNING_MAX_DEPTH 一次性写入完整 out_result; 其余错误完全保留调用前的输出。所有退出路径释放工作区。

在文件 quadrature_adaptive.c 第 318 行定义.

引用了 lmmc_quad_workspace_t::func, lmmc_quad_workspace_t::heap, lmmc_memory_free(), lmmc_quad_adaptive(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK, LMMC_STATUS_WARNING_MAX_DEPTH, lmmc_quad_workspace_t::max_depth , 以及 lmmc_quad_workspace_t::user_data.

被这些函数引用 lmmc_quad_adaptive().

函数调用图:
这是这个函数的调用关系图:

◆ lmmc_quad_romberg()

lmmc_status_t lmmc_quad_romberg ( lmmc_quad_func_t f,
void * ud,
lmmc_real_t a,
lmmc_real_t b,
lmmc_real_t abs_tol,
size_t max_iter,
lmmc_quad_result_t * out )

Romberg 积分(Richardson 外推加速梯形法则)。

通过逐次加密梯形法则并进行 Richardson 外推,快速提升收敛阶。 外推使用增量形式,避免先将有限梯形估计乘以 \(4^j\); 采样点在 [-1,1] 生成后通过溢出安全的中心和半长度映射到 [a,b], 不直接形成可能溢出的 b-a。对光滑被积函数效率极高。

参数
[in]f被积函数回调。
[in]ud用户数据指针,传递给 f 。
[in]a积分下限。
[in]b积分上限。
[in]abs_tol绝对容差,范围 [1e-15, 1e-1]。
[in]max_iter最大迭代次数(Romberg 表行数),范围 [1, 30]。
[out]out积分结果(值、误差估计、求值次数)。
返回
LMMC_STATUS_OK 在容差内收敛; LMMC_STATUS_CONVERGENCE_FAILED 达到最大迭代次数; LMMC_STATUS_NUMERICAL_FAILURE 回调或中间结果为非有限值; LMMC_STATUS_INVALID_ARGUMENT 若参数超出有效范围或指针为 NULL。
副作用
  • 回调 f 被调用次数记录在 out->num_evals 中,最多为 \(2^{max\_iter-1}+1\) 次。
  • 不分配堆内存。

在文件 quadrature_extrapolation.c 第 92 行定义.

引用了 lmmc_quad_romberg_state_t::curr, lmmc_quad_result_t::error, lmmc_quad_romberg_state_t::func, lmmc_quad_romberg(), LMMC_STATUS_CONVERGENCE_FAILED, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK, lmmc_quad_result_t::num_evals, lmmc_quad_romberg_state_t::out, lmmc_quad_romberg_state_t::prev, lmmc_quad_romberg_state_t::user_data , 以及 lmmc_quad_result_t::value.

被这些函数引用 lmmc_quad_romberg().

函数调用图:
这是这个函数的调用关系图:

◆ lmmc_quad_tanh_sinh()

lmmc_status_t lmmc_quad_tanh_sinh ( lmmc_quad_func_t f,
void * ud,
lmmc_real_t a,
lmmc_real_t b,
lmmc_real_t abs_tol,
size_t max_nodes,
lmmc_quad_result_t * out )

Tanh-Sinh(双指数)积分,适用于端点奇异性。

利用 \(\tanh(\frac{\pi}{2}\sinh t)\) 变换将端点奇异性映射为指数衰减。 因浮点舍入落到精确端点的节点不调用 f,其极限权重贡献按零处理; 非端点回调的 NaN 或无穷值仍返回数值失败。 对端点处有代数或对数奇异性的被积函数特别有效。

参数
[in]f被积函数回调。
[in]ud用户数据指针,传递给 f 。
[in]a积分下限。
[in]b积分上限。
[in]abs_tol绝对容差,范围 [1e-15, 1e-1]。
[in]max_nodes实际回调次数的总预算,范围 [1, 1000000]。
[out]out积分结果(值、误差估计、求值次数)。
返回
LMMC_STATUS_OK 在容差内收敛; LMMC_STATUS_CONVERGENCE_FAILED 预算不足以完成求积层,或十层后仍未收敛; LMMC_STATUS_NUMERICAL_FAILURE 回调或中间结果为非有限值; LMMC_STATUS_INVALID_ARGUMENT 若参数超出有效范围或指针为 NULL。
注解
  • 仅对可表示的内部节点调用 f。
  • 实际回调次数记录在 out->num_evals 中,不超过 max_nodes 次。
  • 仅比较并提交完整层的估计。
  • 预算/数值失败保留最后完整层的 value(尚无完整层则为零),error 为正无穷。
  • 完成十层仍不收敛时,保留最后完整层值和最后两个完整层的误差估计。
  • 不分配堆内存。

在文件 quadrature_tanh_sinh.c 第 136 行定义.

引用了 lmmc_quad_tanh_sinh_state_t::a, lmmc_quad_tanh_sinh_state_t::b, lmmc_quad_tanh_sinh_state_t::center, lmmc_quad_result_t::error, lmmc_quad_tanh_sinh_state_t::func, lmmc_quad_tanh_sinh_state_t::half_length, lmmc_quad_center_half_length(), lmmc_quad_tanh_sinh(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, lmmc_quad_tanh_sinh_state_t::max_nodes, lmmc_quad_result_t::num_evals, lmmc_quad_tanh_sinh_state_t::user_data , 以及 lmmc_quad_result_t::value.

被这些函数引用 lmmc_quad_tanh_sinh().

函数调用图:
这是这个函数的调用关系图:

◆ lmmc_quad_gauss_hermite()

lmmc_status_t lmmc_quad_gauss_hermite ( lmmc_quad_func_t f,
void * ud,
size_t order,
lmmc_real_t * out )

Gauss-Hermite 求积:权函数 \(\exp(-x^2)\) ,积分域 \((-\infty, +\infty)\) 。

计算 \(\int_{-\infty}^{+\infty} f(x) \exp(-x^2) dx\) 。

参数
[in]f被积函数(不含权函数部分)。
[in]ud用户数据指针。
[in]order节点数(阶数),范围 [1, 20]。
[out]out积分结果值。
返回
LMMC_STATUS_OK 成功; LMMC_STATUS_NUMERICAL_FAILURE 回调或累加结果为非有限值; LMMC_STATUS_INVALID_ARGUMENT 若 order 超出范围或指针为 NULL。
副作用
  • 回调 f 被调用恰好 order 次。
  • 不分配堆内存。

在文件 quadrature_weighted.c 第 155 行定义.

引用了 lmmc_quad_gauss_hermite().

被这些函数引用 lmmc_quad_gauss_hermite().

函数调用图:
这是这个函数的调用关系图:

◆ lmmc_quad_gauss_laguerre()

lmmc_status_t lmmc_quad_gauss_laguerre ( lmmc_quad_func_t f,
void * ud,
size_t order,
lmmc_real_t * out )

Gauss-Laguerre 求积:权函数 \(\exp(-x)\) ,积分域 \([0, +\infty)\) 。

计算 \(\int_0^{+\infty} f(x) \exp(-x) dx\) 。

参数
[in]f被积函数(不含权函数部分)。
[in]ud用户数据指针。
[in]order节点数(阶数),范围 [1, 20]。
[out]out积分结果值。
返回
LMMC_STATUS_OK 成功; LMMC_STATUS_NUMERICAL_FAILURE 回调或累加结果为非有限值; LMMC_STATUS_INVALID_ARGUMENT 若 order 超出范围或指针为 NULL。
副作用
  • 回调 f 被调用恰好 order 次。
  • 不分配堆内存。

在文件 quadrature_weighted.c 第 174 行定义.

引用了 LMMC_GL_LAG_MAX_ORDER, lmmc_quad_gauss_laguerre(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE , 以及 LMMC_STATUS_OK.

被这些函数引用 lmmc_quad_gauss_laguerre().

函数调用图:
这是这个函数的调用关系图: