|
LMMC
Lamina Mathematic core
|
一维插值算法:线性,三次样条,Lagrange 多项式,PCHIP,Akima,二维插值. 更多...
枚举 | |
| enum | lmmc_spline_bc_t { LMMC_SPLINE_NATURAL = 0 , LMMC_SPLINE_CLAMPED , LMMC_SPLINE_NOT_A_KNOT , LMMC_SPLINE_PERIODIC } |
| 样条边界条件类型. 更多... | |
一维插值算法:线性,三次样条,Lagrange 多项式,PCHIP,Akima,二维插值.
参与插值的节点和值必须有限;分段插值坐标须严格升序,Lagrange 节点须互异。
在文件 interp.h 中定义.
| enum lmmc_spline_bc_t |
| 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 . |
引用了 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_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 | 返回的样条句柄. |
在文件 interp_spline.c 第 187 行定义.
引用了 lmmc_interp_cspline_create(), lmmc_interp_cspline_create_ex() , 以及 LMMC_SPLINE_NATURAL.
被这些函数引用 lmmc_interp_cspline_create().
| 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 | 返回的样条句柄. |
在文件 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_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().
| 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_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 方法计算.
| [in] | xs | 严格升序节点 x 数组. |
| [in] | ys | 对应 y 值数组. |
| [in] | n | 节点数,至少 2 . |
| [out] | out | 返回的 PCHIP 句柄. |
< 各段斜率。
在文件 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_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().
| 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_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 个节点.
| [in] | xs | 严格升序节点 x 数组. |
| [in] | ys | 对应 y 值数组. |
| [in] | n | 节点数,至少 5(Akima 需要至少 5 个点). |
| [out] | out | 返回的 Akima 句柄. |
< 扩展斜率 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_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().
| 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_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_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().
| 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_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] | xs | x 方向严格升序节点数组,长度 nx >= 2. |
| [in] | nx | x 方向节点数. |
| [in] | ys | y 方向严格升序节点数组,长度 ny >= 2. |
| [in] | ny | y 方向节点数. |
| [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_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 插值的张量积; 支持任意严格升序的非均匀网格,每轴三次以内多项式可精确再现 (浮点舍入误差除外)。边界使用最前/最后四个不同节点。 查询恰好落在节点时直接采用该节点的基函数值。
| [in] | xs | x 方向严格升序节点数组,长度 nx >= 4. |
| [in] | nx | x 方向节点数. |
| [in] | ys | y 方向严格升序节点数组,长度 ny >= 4. |
| [in] | ny | y 方向节点数. |
| [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().