Source code for jaxoplanet.experimental.limb_dark_poly_coeffs
__all__ = ["calc_poly_coeffs"]
import jax.numpy as jnp
from jaxtyping import Array
[docs]
def calc_poly_coeffs(
mu: Array,
intensity_profile: Array,
poly_degree: int = 10,
) -> Array:
"""Calculate the polynomial coefficients for a limb-darkening intensity profile.
As `jaxoplanet` uses an arbitrary polynomial limb-darkening law
(see `Agol et al. (2020) <https://arxiv.org/pdf/1908.03222>`), this function may
be useful for users wanting to use non-polynomial limb-darkening laws
within the `jaxoplanet` framework.
Given a limb-darkening profile, this function will fit the profile with
a polynomial of a user-specified order/degree and return the least-squares
polynomial coefficients.
These coefficients can then be passed as the `u` parameter when using the
`light_curve` objects.
The intensity profile should be relatively densely evaluated as otherwise
the polynomial approximation may be non-monotonic.
Args:
mu (Array): An array of values between 0 and 1 indicating the locations where
the limb-darkening intensity profile was evaluated. `mu` is the cosine
of the angle between the line of sight and the emergent intensity and
is `1` at the center of the star and `0` at the limb.
intensity_profile (Array): A stellar limb-darkening intensity profile.
We assume the profile is normalized so that it's value is `1` at the center
of the star.
poly_degree (int): The degree/order of the polynomial. Setting this to `1` would
fit with a straight line, `2` would fit with a quadratic, and so on.
We set the default to a relatively high value of 10.
Returns:
An array containing the polynomial coefficients that can be passed to
the `light_curve` objects. The size of this array will be equal to the
`poly_degree` value, and the ordering of the coefficients corresponds to the
lowest order to the highest order of the polynomial.
"""
assert len(mu) == len(intensity_profile)
sort = jnp.argsort(mu)
mu = mu[sort]
intensity_profile = intensity_profile[sort]
# The first column of ones is removed
X = jnp.vander(
1 - mu,
N=poly_degree + 1,
increasing=True,
)[:, 1:]
coeffs, _, _, _ = jnp.linalg.lstsq(
X,
intensity_profile - 1.0,
)
# We multiply by -1 to make the coeffs in the expected form
return -1 * coeffs