Source code for dsf.utils.interpolators

"""Interpolation scripts for Delta Sigma calculations."""

from __future__ import annotations

import numpy as np

from .types import FloatArray
from .validators import (
    as_1d_float_array,
    validate_interpolation_within_bounds,
    validate_positive_1d_array,
    validate_positive_strictly_increasing_1d_array,
    validate_strictly_increasing,
)

__all__ = [
    "interpolate_linear",
    "interpolate_loglog",
]


[docs] def interpolate_linear( x: FloatArray, xp: FloatArray, fp: FloatArray, *, x_name: str = "x", xp_name: str = "xp", fp_name: str = "fp", ) -> FloatArray: """Interpolate a 1D function linearly between tabulated points. Args: x: requested interpolation points of the independent variable. xp: tabulated points of the independent variable. fp: tabulated points of the dependent variable. x_name: Name of the independent variable for error messages. xp_name: Name of the independent variable grid for error messages. fp_name: Name of the dependent variable grid for error messages. Returns: Interpolated values of the dependent variable at the requested points. """ xp_arr = validate_strictly_increasing(xp, xp_name) x_arr = validate_interpolation_within_bounds(x, xp, x_name) fp_arr = as_1d_float_array(fp, fp_name) return np.interp(x_arr, xp_arr, fp_arr)
[docs] def interpolate_loglog( x: FloatArray, xp: FloatArray, fp: FloatArray, *, x_name: str = "x", xp_name: str = "xp", fp_name: str = "fp", ) -> FloatArray: """Interpolate a 1D function on a log-log scale between tabulated points. Args: x: requested interpolation points of the independent variable. xp: tabulated points of the independent variable. fp: tabulated points of the dependent variable. x_name: Name of the independent variable for error messages. xp_name: Name of the independent variable grid for error messages. fp_name: Name of the dependent variable grid for error messages. Returns: Interpolated values of the dependent variable at the requested points. """ xp_arr = validate_positive_strictly_increasing_1d_array(xp, xp_name) x_arr = validate_interpolation_within_bounds(x, xp, x_name) fp_arr = validate_positive_1d_array(fp, fp_name) log_x = np.log(x_arr) log_xp = np.log(xp_arr) log_fp = np.log(fp_arr) log_interp = np.interp(log_x, log_xp, log_fp) return np.exp(log_interp)