29 lmmc_real_t derivative = ((2.0 * h1 + h2) * slope1 - h1 * slope2) / (h1 + h2);
30 if (derivative * slope1 <= 0.0) {
33 if (slope1 * slope2 <= 0.0 && fabs(derivative) > 3.0 * fabs(slope1)) {
45 p->
d[0] = p->
d[1] = delta[0];
48 for (i = 1; i < n - 1; ++i) {
49 if (delta[i - 1] * delta[i] <= 0.0) {
56 p->
d[i] = (w1 + w2) / (w1 / delta[i - 1] + w2 / delta[i]);
59 p->
d[0] = interp_pchip_endpoint(xs[1] - xs[0], xs[2] - xs[1], delta[0], delta[1]);
60 p->
d[n - 1] = interp_pchip_endpoint(xs[n - 1] - xs[n - 2],
61 xs[n - 2] - xs[n - 3], delta[n - 2], delta[n - 3]);
84 p->
n = n; p->
xs = NULL; p->
ys = NULL; p->
d = NULL;
90 if (!p->
xs || !p->
ys || !p->
d || !delta) {
98 for (i = 0; i < n - 1; i++) {
99 delta[i] = (ys[i + 1] - ys[i]) / (xs[i + 1] - xs[i]);
102 interp_pchip_derivatives(p, delta);
120 if (!p || !out_y || !isfinite(x)) {
123 if (x < p->xs[0] || x > p->
xs[p->
n - 1]) {
126 if (x == p->
xs[p->
n - 1]) {
127 *out_y = p->
ys[p->
n - 1];
132 h = p->
xs[seg + 1] - p->
xs[seg];
133 t = (x - p->
xs[seg]) / h;
137 result = a * a * (1.0 + 2.0 * t) * p->
ys[seg]
138 + b * b * (3.0 - 2.0 * t) * p->
ys[seg + 1]
139 + t * a * a * h * p->
d[seg]
140 - b * b * a * h * p->
d[seg + 1];
141 if (!isfinite(result)) {
168 size_t i, n = a->
n, nm1 = n - 1;
172 for (i = 0; i < nm1; i++) {
173 m[i + 2] = (ys[i + 1] - ys[i]) / (xs[i + 1] - xs[i]);
181 m[1] = 2.0 * m[2] - m[3];
182 m[0] = 2.0 * m[1] - m[2];
183 m[nm1 + 2] = 2.0 * m[nm1 + 1] - m[nm1];
184 m[nm1 + 3] = 2.0 * m[nm1 + 2] - m[nm1 + 1];
191 for (i = 0; i < n; i++) {
194 if (w1 + w2 < 1e-30) {
196 a->
d[i] = 0.5 * (m[i + 1] + m[i + 2]);
198 a->
d[i] = (w1 * m[i + 1] + w2 * m[i + 2]) / (w1 + w2);
218 if (!lmmc_safe_add_size(n, 3, &slope_count)) {
227 a->
n = n; a->
xs = NULL; a->
ys = NULL; a->
d = NULL;
233 if (!a->
xs || !a->
ys || !a->
d || !m) {
241 interp_akima_derivatives(a, m);
259 if (!a || !out_y || !isfinite(x)) {
262 if (x < a->xs[0] || x > a->
xs[a->
n - 1]) {
265 if (x == a->
xs[a->
n - 1]) {
266 *out_y = a->
ys[a->
n - 1];
271 h = a->
xs[seg + 1] - a->
xs[seg];
272 t = (x - a->
xs[seg]) / h;
275 result = omt * omt * (1.0 + 2.0 * t) * a->
ys[seg]
276 + t * t * (3.0 - 2.0 * t) * a->
ys[seg + 1]
277 + t * omt * omt * h * a->
d[seg]
278 - t * t * omt * h * a->
d[seg + 1];
279 if (!isfinite(result)) {
double lmmc_real_t
Public and internal LMMC real type.
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 局部三次插值.
void lmmc_interp_akima_destroy(lmmc_interp_akima_t *a)
销毁 Akima 插值上下文,释放内部分配的所有内存.
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 插值上求值.
lmmc_status_t lmmc_interp_akima_eval(const lmmc_interp_akima_t *a, lmmc_real_t x, lmmc_real_t *out_y)
在 Akima 插值上求值.
size_t interp_find_interval(const lmmc_real_t *xs, size_t n, lmmc_real_t query_x)
int interp_check_finite_values(const lmmc_real_t *values, size_t n)
int interp_check_samples(const lmmc_real_t *xs, const lmmc_real_t *ys, size_t n, size_t minimum)
void * lmmc_memory_alloc_array(size_t count, size_t element_size)
void * lmmc_memory_alloc(size_t size)
void lmmc_memory_free(void *pointer)
Private recoverable allocator for persistent LMMC ownership.
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_NUMERICAL_FAILURE
@ LMMC_STATUS_ALLOCATION_FAILED
@ LMMC_STATUS_INVALID_ARGUMENT
@ LMMC_STATUS_OUT_OF_RANGE