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

一维插值算法:线性,三次样条,Lagrange 多项式,PCHIP,Akima,二维插值. 更多...

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

浏览该文件的源代码.

枚举

enum  lmmc_spline_bc_t {
  LMMC_SPLINE_NATURAL = 0 ,
  LMMC_SPLINE_CLAMPED ,
  LMMC_SPLINE_NOT_A_KNOT ,
  LMMC_SPLINE_PERIODIC
}
 样条边界条件类型. 更多...

函数

lmmc_status_t lmmc_interp_linear (const lmmc_real_t *xs, const lmmc_real_t *ys, size_t n, lmmc_real_t query_x, lmmc_real_t *out_y)
 在节点 (xs[i], ys[i]) 间做分段线性插值.
lmmc_status_t lmmc_interp_cspline_create (const lmmc_real_t *xs, const lmmc_real_t *ys, size_t n, lmmc_interp_cspline_t **out_spline)
 由节点构造自然三次样条.
lmmc_status_t lmmc_interp_cspline_create_ex (const lmmc_real_t *xs, const lmmc_real_t *ys, size_t n, lmmc_spline_bc_t bc, lmmc_real_t deriv_left, lmmc_real_t deriv_right, lmmc_interp_cspline_t **out_spline)
 由节点构造带指定边界条件的三次样条.
lmmc_status_t lmmc_interp_cspline_eval (const lmmc_interp_cspline_t *spline, lmmc_real_t query_x, lmmc_real_t *out_y)
 在样条上求值.
void lmmc_interp_cspline_destroy (lmmc_interp_cspline_t *spline)
 销毁三次样条上下文,释放内部分配的所有内存.
lmmc_status_t lmmc_interp_pchip_create (const lmmc_real_t *xs, const lmmc_real_t *ys, size_t n, lmmc_interp_pchip_t **out)
 由节点构造 PCHIP 单调三次插值.
lmmc_status_t lmmc_interp_pchip_eval (const lmmc_interp_pchip_t *p, lmmc_real_t x, lmmc_real_t *out_y)
 在 PCHIP 插值上求值.
void lmmc_interp_pchip_destroy (lmmc_interp_pchip_t *p)
 销毁 PCHIP 插值上下文,释放内部分配的所有内存.
lmmc_status_t lmmc_interp_akima_create (const lmmc_real_t *xs, const lmmc_real_t *ys, size_t n, lmmc_interp_akima_t **out)
 由节点构造 Akima 局部三次插值.
lmmc_status_t lmmc_interp_akima_eval (const lmmc_interp_akima_t *a, lmmc_real_t x, lmmc_real_t *out_y)
 在 Akima 插值上求值.
void lmmc_interp_akima_destroy (lmmc_interp_akima_t *a)
 销毁 Akima 插值上下文,释放内部分配的所有内存.
lmmc_status_t lmmc_interp_lagrange_create (const lmmc_real_t *xs, const lmmc_real_t *ys, size_t n, lmmc_interp_lagrange_t **out_lagrange)
 由节点构造 Lagrange 插值多项式(基于重心权重).
lmmc_status_t lmmc_interp_lagrange_eval (const lmmc_interp_lagrange_t *lagrange, lmmc_real_t query_x, lmmc_real_t *out_y)
 在 Lagrange 插值多项式上求值.
void lmmc_interp_lagrange_destroy (lmmc_interp_lagrange_t *lagrange)
 销毁 Lagrange 插值上下文.
lmmc_status_t lmmc_interp_bilinear (const lmmc_real_t *xs, size_t nx, const lmmc_real_t *ys, size_t ny, const lmmc_real_t *zs, lmmc_real_t qx, lmmc_real_t qy, lmmc_real_t *out_z)
 双线性插值(矩形网格).
lmmc_status_t lmmc_interp_bicubic (const lmmc_real_t *xs, size_t nx, const lmmc_real_t *ys, size_t ny, const lmmc_real_t *zs, lmmc_real_t qx, lmmc_real_t qy, lmmc_real_t *out_z)
 双三次插值(矩形网格).

详细描述

一维插值算法:线性,三次样条,Lagrange 多项式,PCHIP,Akima,二维插值.

参与插值的节点和值必须有限;分段插值坐标须严格升序,Lagrange 节点须互异。

在文件 interp.h 中定义.

枚举类型说明

◆ lmmc_spline_bc_t

样条边界条件类型.

枚举值
LMMC_SPLINE_NATURAL 0 

自然边界:二阶导数为零.

LMMC_SPLINE_CLAMPED  

固定边界:指定端点一阶导数.

LMMC_SPLINE_NOT_A_KNOT  

Not-a-knot:第三阶导数在第二和倒数第二节点连续.

LMMC_SPLINE_PERIODIC  

周期边界:首尾值和导数匹配.

在文件 interp.h 第 46 行定义.

函数说明

◆ lmmc_interp_linear()

lmmc_status_t lmmc_interp_linear ( const lmmc_real_t * xs,
const lmmc_real_t * ys,
size_t n,
lmmc_real_t query_x,
lmmc_real_t * out_y )

在节点 (xs[i], ys[i]) 间做分段线性插值.

内部对横坐标归一化,并按符号选择溢出安全的仿射组合;因此有限端点 跨越完整浮点范围时仍可计算有限的区间内插值。

参数
[in]xs严格升序的节点 x 数组.
[in]ys对应的 y 值数组.
[in]n节点数,至少 2 .
[in]query_x查询点.
[out]out_y输出插值结果.超出 [xs[0], xs[n-1]] 范围返回 LMMC_STATUS_OUT_OF_RANGE .
返回
非有限输入或非严格升序节点返回 ::LMMC_STATUS_INVALID_ARGUMENT; 算术溢出返回 ::LMMC_STATUS_NUMERICAL_FAILURE。

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

引用了 interp_check_samples(), interp_find_interval(), interp_interval_fraction(), lmmc_interp_linear(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK , 以及 LMMC_STATUS_OUT_OF_RANGE.

被这些函数引用 lmmc_interp_linear().

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

◆ lmmc_interp_cspline_create()

lmmc_status_t lmmc_interp_cspline_create ( const lmmc_real_t * xs,
const lmmc_real_t * ys,
size_t n,
lmmc_interp_cspline_t ** out_spline )

由节点构造自然三次样条.

参数
[in]xs严格升序节点 x 数组.
[in]ys对应 y 值数组.
[in]n节点数,至少 3 .
[out]out_spline返回的样条句柄.
返回
LMMC_STATUS_OK 成功; LMMC_STATUS_INVALID_ARGUMENT 若输入非有限、n < 3、节点非严格 升序或指针为 NULL; LMMC_STATUS_NUMERICAL_FAILURE 若系数计算产生非有限值; LMMC_STATUS_ALLOCATION_FAILED 若内存分配失败.
副作用
  • 分配堆内存存储样条系数,调用方必须调用 lmmc_interp_cspline_destroy 释放.
  • 内部复制节点数据,调用后可安全释放 xs/ys.

在文件 interp_spline.c 第 187 行定义.

引用了 lmmc_interp_cspline_create(), lmmc_interp_cspline_create_ex() , 以及 LMMC_SPLINE_NATURAL.

被这些函数引用 lmmc_interp_cspline_create().

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

◆ lmmc_interp_cspline_create_ex()

lmmc_status_t lmmc_interp_cspline_create_ex ( const lmmc_real_t * xs,
const lmmc_real_t * ys,
size_t n,
lmmc_spline_bc_t bc,
lmmc_real_t deriv_left,
lmmc_real_t deriv_right,
lmmc_interp_cspline_t ** out_spline )

由节点构造带指定边界条件的三次样条.

支持自然,固定(clamped),not-a-knot 和周期四种边界条件. 对于 LMMC_SPLINE_CLAMPED,需通过 deriv_left/deriv_right 指定端点导数; 其他边界条件下这两个参数被忽略.

参数
[in]xs严格升序节点 x 数组.
[in]ys对应 y 值数组.
[in]n节点数,至少 3 .
[in]bc边界条件类型.
[in]deriv_left左端点一阶导数(仅 LMMC_SPLINE_CLAMPED 时使用).
[in]deriv_right右端点一阶导数(仅 LMMC_SPLINE_CLAMPED 时使用).
[out]out_spline返回的样条句柄.
返回
LMMC_STATUS_OK 成功; LMMC_STATUS_INVALID_ARGUMENT 若输入非有限、边界条件枚举无效、 n < 3、xs 非严格升序、PERIODIC 模式下首尾 y 值不匹配或指针为 NULL; LMMC_STATUS_NUMERICAL_FAILURE 若系数计算产生非有限值; LMMC_STATUS_ALLOCATION_FAILED 若内存分配失败.
注解
对于 LMMC_SPLINE_PERIODIC,要求 |ys[0] - ys[n-1]| <= 1e-12,否则返回 LMMC_STATUS_INVALID_ARGUMENT.
副作用
  • 分配堆内存存储样条系数,调用方必须调用 lmmc_interp_cspline_destroy 释放.
  • 内部复制节点数据,调用后可安全释放 xs/ys.

在文件 interp_spline.c 第 141 行定义.

引用了 lmmc_interp_cspline_t::coeffs, interp_spline_workspace_t::h, interp_check_finite_values(), interp_check_samples(), interp_spline_not_a_knot(), interp_spline_periodic(), interp_spline_standard(), lmmc_interp_cspline_create_ex(), lmmc_interp_cspline_destroy(), lmmc_memory_free(), LMMC_SPLINE_NOT_A_KNOT, LMMC_SPLINE_PERIODIC, LMMC_STATUS_ALLOCATION_FAILED, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK , 以及 interp_spline_workspace_t::moments.

被这些函数引用 lmmc_interp_cspline_create() , 以及 lmmc_interp_cspline_create_ex().

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

◆ lmmc_interp_cspline_eval()

lmmc_status_t lmmc_interp_cspline_eval ( const lmmc_interp_cspline_t * spline,
lmmc_real_t query_x,
lmmc_real_t * out_y )

在样条上求值.

在文件 interp_spline.c 第 25 行定义.

引用了 lmmc_interp_cspline_t::coeffs, interp_find_interval(), lmmc_interp_cspline_eval(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK, LMMC_STATUS_OUT_OF_RANGE, lmmc_interp_cspline_t::n, lmmc_interp_cspline_t::xs , 以及 lmmc_interp_cspline_t::ys.

被这些函数引用 lmmc_interp_cspline_eval().

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

◆ lmmc_interp_cspline_destroy()

void lmmc_interp_cspline_destroy ( lmmc_interp_cspline_t * spline)

销毁三次样条上下文,释放内部分配的所有内存.

在文件 interp_spline.c 第 14 行定义.

引用了 lmmc_interp_cspline_t::coeffs, lmmc_interp_cspline_destroy(), lmmc_memory_free(), lmmc_interp_cspline_t::xs , 以及 lmmc_interp_cspline_t::ys.

被这些函数引用 lmmc_interp_cspline_create_ex() , 以及 lmmc_interp_cspline_destroy().

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

◆ lmmc_interp_pchip_create()

lmmc_status_t lmmc_interp_pchip_create ( const lmmc_real_t * xs,
const lmmc_real_t * ys,
size_t n,
lmmc_interp_pchip_t ** out )

由节点构造 PCHIP 单调三次插值.

PCHIP(Piecewise Cubic Hermite Interpolating Polynomial)在单调数据上 保持插值单调性.节点导数由 Fritsch-Carlson 方法计算.

参见
F. N. Fritsch and R. E. Carlson, "Monotone Piecewise Cubic Interpolation," SIAM J. Numer. Anal. 17(2), 1980.
参数
[in]xs严格升序节点 x 数组.
[in]ys对应 y 值数组.
[in]n节点数,至少 2 .
[out]out返回的 PCHIP 句柄.
返回
LMMC_STATUS_OK 成功; LMMC_STATUS_INVALID_ARGUMENT 若输入非有限、n < 2、xs 非严格升序或指针为 NULL; LMMC_STATUS_NUMERICAL_FAILURE 若系数计算产生非有限值; LMMC_STATUS_ALLOCATION_FAILED 若内存分配失败.
副作用
  • 分配堆内存存储插值系数,调用方必须调用 lmmc_interp_pchip_destroy 释放.
  • 内部复制节点数据,调用后可安全释放 xs/ys.

< 各段斜率。

在文件 interp_shape.c 第 64 行定义.

引用了 lmmc_interp_pchip_t::d, interp_check_finite_values(), interp_check_samples(), lmmc_interp_pchip_create(), lmmc_interp_pchip_destroy(), lmmc_memory_alloc(), lmmc_memory_alloc_array(), lmmc_memory_free(), LMMC_STATUS_ALLOCATION_FAILED, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK, lmmc_interp_pchip_t::n, lmmc_interp_pchip_t::xs , 以及 lmmc_interp_pchip_t::ys.

被这些函数引用 lmmc_interp_pchip_create().

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

◆ lmmc_interp_pchip_eval()

lmmc_status_t lmmc_interp_pchip_eval ( const lmmc_interp_pchip_t * p,
lmmc_real_t x,
lmmc_real_t * out_y )

在 PCHIP 插值上求值.

在文件 interp_shape.c 第 115 行定义.

引用了 lmmc_interp_pchip_t::d, interp_find_interval(), lmmc_interp_pchip_eval(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK, LMMC_STATUS_OUT_OF_RANGE, lmmc_interp_pchip_t::n, lmmc_interp_pchip_t::xs , 以及 lmmc_interp_pchip_t::ys.

被这些函数引用 lmmc_interp_pchip_eval().

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

◆ lmmc_interp_pchip_destroy()

void lmmc_interp_pchip_destroy ( lmmc_interp_pchip_t * p)

销毁 PCHIP 插值上下文,释放内部分配的所有内存.

在文件 interp_shape.c 第 15 行定义.

引用了 lmmc_interp_pchip_t::d, lmmc_interp_pchip_destroy(), lmmc_memory_free(), lmmc_interp_pchip_t::xs , 以及 lmmc_interp_pchip_t::ys.

被这些函数引用 lmmc_interp_pchip_create() , 以及 lmmc_interp_pchip_destroy().

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

◆ lmmc_interp_akima_create()

lmmc_status_t lmmc_interp_akima_create ( const lmmc_real_t * xs,
const lmmc_real_t * ys,
size_t n,
lmmc_interp_akima_t ** out )

由节点构造 Akima 局部三次插值.

Akima 插值使用局部加权平均计算节点导数,使离群点的影响保持局部. 边界导数计算需要至少 5 个节点.

参见
Hiroshi Akima, "A New Method of Interpolation and Smooth Curve Fitting Based on Local Procedures," J. ACM 17(4), 1970.
参数
[in]xs严格升序节点 x 数组.
[in]ys对应 y 值数组.
[in]n节点数,至少 5(Akima 需要至少 5 个点).
[out]out返回的 Akima 句柄.
返回
LMMC_STATUS_OK 成功; LMMC_STATUS_INVALID_ARGUMENT 若输入非有限、n < 5、xs 非严格升序或指针为 NULL; LMMC_STATUS_NUMERICAL_FAILURE 若系数计算产生非有限值; LMMC_STATUS_ALLOCATION_FAILED 若内存分配失败.
副作用
  • 分配堆内存存储插值系数,调用方必须调用 lmmc_interp_akima_destroy 释放.
  • 内部复制节点数据,调用后可安全释放 xs/ys.

< 扩展斜率 m[-2]..m[n] 存于索引 0..n+2。

在文件 interp_shape.c 第 203 行定义.

引用了 lmmc_interp_akima_t::d, interp_check_finite_values(), interp_check_samples(), lmmc_interp_akima_create(), lmmc_interp_akima_destroy(), lmmc_memory_alloc(), lmmc_memory_alloc_array(), lmmc_memory_free(), LMMC_STATUS_ALLOCATION_FAILED, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK, lmmc_interp_akima_t::n, lmmc_interp_akima_t::xs , 以及 lmmc_interp_akima_t::ys.

被这些函数引用 lmmc_interp_akima_create().

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

◆ lmmc_interp_akima_eval()

lmmc_status_t lmmc_interp_akima_eval ( const lmmc_interp_akima_t * a,
lmmc_real_t x,
lmmc_real_t * out_y )

在 Akima 插值上求值.

在文件 interp_shape.c 第 254 行定义.

引用了 lmmc_interp_akima_t::d, interp_find_interval(), lmmc_interp_akima_eval(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK, LMMC_STATUS_OUT_OF_RANGE, lmmc_interp_akima_t::n, lmmc_interp_akima_t::xs , 以及 lmmc_interp_akima_t::ys.

被这些函数引用 lmmc_interp_akima_eval().

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

◆ lmmc_interp_akima_destroy()

void lmmc_interp_akima_destroy ( lmmc_interp_akima_t * a)

销毁 Akima 插值上下文,释放内部分配的所有内存.

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

引用了 lmmc_interp_akima_t::d, lmmc_interp_akima_destroy(), lmmc_memory_free(), lmmc_interp_akima_t::xs , 以及 lmmc_interp_akima_t::ys.

被这些函数引用 lmmc_interp_akima_create() , 以及 lmmc_interp_akima_destroy().

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

◆ lmmc_interp_lagrange_create()

lmmc_status_t lmmc_interp_lagrange_create ( const lmmc_real_t * xs,
const lmmc_real_t * ys,
size_t n,
lmmc_interp_lagrange_t ** out_lagrange )

由节点构造 Lagrange 插值多项式(基于重心权重).

输入节点和值必须有限,xs 节点须互异但可采用任意顺序。求值点必须有限。

在文件 interp_lagrange.c 第 15 行定义.

引用了 interp_barycentric_weights(), interp_check_finite_values(), lmmc_interp_lagrange_create(), lmmc_interp_lagrange_destroy(), lmmc_memory_alloc(), lmmc_memory_free(), LMMC_STATUS_ALLOCATION_FAILED, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_interp_lagrange_t::n, lmmc_interp_lagrange_t::weights, lmmc_interp_lagrange_t::xs , 以及 lmmc_interp_lagrange_t::ys.

被这些函数引用 lmmc_interp_lagrange_create().

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

◆ lmmc_interp_lagrange_eval()

lmmc_status_t lmmc_interp_lagrange_eval ( const lmmc_interp_lagrange_t * lagrange,
lmmc_real_t query_x,
lmmc_real_t * out_y )

在 Lagrange 插值多项式上求值.

在文件 interp_lagrange.c 第 64 行定义.

引用了 lmmc_interp_lagrange_eval(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE, LMMC_STATUS_OK, lmmc_interp_lagrange_t::n, lmmc_interp_lagrange_t::weights, lmmc_interp_lagrange_t::xs , 以及 lmmc_interp_lagrange_t::ys.

被这些函数引用 lmmc_interp_lagrange_eval().

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

◆ lmmc_interp_lagrange_destroy()

void lmmc_interp_lagrange_destroy ( lmmc_interp_lagrange_t * lagrange)

销毁 Lagrange 插值上下文.

在文件 interp_lagrange.c 第 113 行定义.

引用了 lmmc_interp_lagrange_destroy(), lmmc_memory_free(), lmmc_interp_lagrange_t::weights, lmmc_interp_lagrange_t::xs , 以及 lmmc_interp_lagrange_t::ys.

被这些函数引用 lmmc_interp_lagrange_create() , 以及 lmmc_interp_lagrange_destroy().

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

◆ lmmc_interp_bilinear()

lmmc_status_t lmmc_interp_bilinear ( const lmmc_real_t * xs,
size_t nx,
const lmmc_real_t * ys,
size_t ny,
const lmmc_real_t * zs,
lmmc_real_t qx,
lmmc_real_t qy,
lmmc_real_t * out_z )

双线性插值(矩形网格).

参数
[in]xsx 方向严格升序节点数组,长度 nx >= 2.
[in]nxx 方向节点数.
[in]ysy 方向严格升序节点数组,长度 ny >= 2.
[in]nyy 方向节点数.
[in]zs网格值数组,行优先存储 (nx * ny),zs[i*ny + j] = f(xs[i], ys[j]).
[in]qx查询点 x 坐标.
[in]qy查询点 y 坐标.
[out]out_z输出插值结果.

在文件 interp_grid.c 第 5 行定义.

引用了 interp_check_grid(), interp_find_interval(), interp_interval_fraction(), lmmc_interp_bilinear(), LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NUMERICAL_FAILURE , 以及 LMMC_STATUS_OK.

被这些函数引用 lmmc_interp_bilinear().

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

◆ lmmc_interp_bicubic()

lmmc_status_t lmmc_interp_bicubic ( const lmmc_real_t * xs,
size_t nx,
const lmmc_real_t * ys,
size_t ny,
const lmmc_real_t * zs,
lmmc_real_t qx,
lmmc_real_t qy,
lmmc_real_t * out_z )

双三次插值(矩形网格).

使用每轴相邻四个实际坐标节点的局部重心 Lagrange 插值的张量积; 支持任意严格升序的非均匀网格,每轴三次以内多项式可精确再现 (浮点舍入误差除外)。边界使用最前/最后四个不同节点。 查询恰好落在节点时直接采用该节点的基函数值。

返回
非有限查询、非有限/非严格升序坐标或选中 4×4 网格值非有限时 返回 ::LMMC_STATUS_INVALID_ARGUMENT;查询超出网格返回 ::LMMC_STATUS_OUT_OF_RANGE;权重分母为零或中间算术非有限 返回 ::LMMC_STATUS_NUMERICAL_FAILURE。
注解
不分配堆内存;仅成功且结果有限时写入 out_z。
参数
[in]xsx 方向严格升序节点数组,长度 nx >= 4.
[in]nxx 方向节点数.
[in]ysy 方向严格升序节点数组,长度 ny >= 4.
[in]nyy 方向节点数.
[in]zs网格值数组,行优先存储 (nx * ny),zs[i*ny + j] = f(xs[i], ys[j]).
[in]qx查询点 x 坐标.
[in]qy查询点 y 坐标.
[out]out_z输出插值结果.

在文件 interp_grid.c 第 133 行定义.

引用了 interp_check_grid(), lmmc_interp_bicubic(), LMMC_STATUS_INVALID_ARGUMENT , 以及 LMMC_STATUS_OK.

被这些函数引用 lmmc_interp_bicubic().

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