Source code for pys5p.error_propagation

#
# This file is part of pyS5p
#
# https://github.com/rmvanhees/pys5p.git
#
# Copyright (c) 2017-2022 SRON - Netherlands Institute for Space Research
#   All Rights Reserved
#
# License:  BSD-3-Clause
"""This module contains routines to divide or add uncertainties."""

__all__ = ['unc_div', 'unc_sum']

import numpy as np


[docs] def unc_div(value_a: np.ndarray, sigma_a: np.ndarray, value_b: np.ndarray, sigma_b: np.ndarray) -> np.ndarray: r"""Absolute error for parameter `a` divided by `b`. .. math:: (a / b) * \sqrt{(\sigma_a / a)^2 + (\sigma_b / b)^2} """ if not value_a.shape == value_b.shape == sigma_a.shape == sigma_b.shape: raise TypeError('dimensions of input arrays are not the same') mask = (np.isfinite(value_a) & np.isfinite(sigma_a) & np.isfinite(value_b) & np.isfinite(sigma_b)) if np.sum(mask) == sigma_a.size: return (value_a / value_b) * np.sqrt((sigma_a / value_a) ** 2 + (sigma_b / value_b) ** 2) res = np.full(sigma_a.shape, np.nan) res[mask] = ((value_a[mask] / value_b[mask]) * np.sqrt((sigma_a[mask] / value_a[mask]) ** 2 + (sigma_b[mask] / value_b[mask]) ** 2)) return res
[docs] def unc_sum(sigma_a: np.ndarray, sigma_b: np.ndarray) -> np.ndarray: r"""Absolute error for the sum of the parameters `a` and `b`. .. math:: \sqrt{\sigma_a^2 + \sigma_b^2} """ if sigma_a.shape != sigma_b.shape: raise TypeError('dimensions of sigma_a and sigma are not the same') mask = np.isfinite(sigma_a) & np.isfinite(sigma_b) if np.sum(mask) == sigma_a.size: return np.sqrt(sigma_a ** 2 + sigma_b ** 2) res = np.full(sigma_a.shape, np.nan) res[mask] = np.sqrt(sigma_a[mask] ** 2 + sigma_b[mask] ** 2) return res