Source code for gemseo_umdo.use_cases.beam_model.uncertain_space

# Copyright 2021 IRT Saint Exupéry, https://www.irt-saintexupery.com
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License version 3 as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
"""The uncertain space for the beam use case."""
from __future__ import annotations

from gemseo.algos.parameter_space import ParameterSpace

from gemseo_umdo.use_cases.beam_model.core.variables import E
from gemseo_umdo.use_cases.beam_model.core.variables import F
from gemseo_umdo.use_cases.beam_model.core.variables import sigma_all


[docs]class BeamUncertainSpace(ParameterSpace): r"""The advanced uncertain space for the beam use case. $F$, $E$ and $\sigma_{\text{all}}$ are random variables with nominal values -200000, 73500 and 300 and deviation values 10%, 5% and 5%. Their probability distribution are centered in these values denoted $\mu_F$, $\mu_E$ and $\mu_{\sigma_{\text{all}}}$. Precisely, a uniform distribution is defined by the minimum $\mu (1 - \delta)$ and the maximum $\mu (1 + \delta)$ and a Gaussian distribution is defined by the mean $\mu$ and the standard deviation $|\mu|\delta/3$, where $\delta$ is an aforementioned deviation value. """ __DEFAULT_DELTA = { F.name: 10.0, E.name: 5.0, sigma_all.name: 5.0, } def __init__(self, uniform: bool = True, **deltas: float) -> None: r""" Args: uniform: If ``True``, use uniform distributions; otherwise, use Gaussian ones. **deltas: The percentage variations $\delta$ around the nominal values of the random variables. """ # noqa: D205 D212 D415 super().__init__() for variable in [F, E, sigma_all]: nominal = variable.value name = variable.name delta = deltas.pop(name, self.__DEFAULT_DELTA[name]) / 100 if uniform: minimum, maximum = sorted( [nominal * (1 - delta), nominal * (1 + delta)] ) self.add_random_variable( name, "OTUniformDistribution", minimum=minimum, maximum=maximum, ) else: self.add_random_variable( name, "OTNormalDistribution", mu=nominal, sigma=abs(nominal) * delta / 3, )