Skip to content
Snippets Groups Projects
Select Git revision
  • 638d5a3d288b8f87f902fd4f5bf6a3646ccd9929
  • master default protected
2 results

Initial_Condition.py

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    Initial_Condition.py 18.92 KiB
    # -*- coding: utf-8 -*-
    """
    @author: Laura C. Kühle
    
    """
    import numpy as np
    
    
    class InitialCondition(object):
        """Class for initial condition function.
    
        Attributes
        ----------
        interval_len : float
            Length of the interval between left and right boundary.
    
        Methods
        -------
        get_name()
            Returns string of class name.
        is_smooth()
            Returns flag whether function is smooth.
        induce_adjustment(value)
            Adjusts x-value of function.
        randomize(config)
            Sets all non-determined instance variables to random value.
        calculate(x)
            Evaluates function at given x-value.
    
        """
        def __init__(self, left_bound, right_bound, config):
            """Initializes InitialCondition.
    
            Parameters
            ----------
            left_bound : float
                Left boundary of interval.
            right_bound : float
                Right boundary of interval.
            config : dict
                Additional parameters for initial condition.
    
            """
            self._left_bound = left_bound
            self._right_bound = right_bound
    
            self._reset(config)
    
        def _reset(self, config):
            """Resets instance variables.
    
            Parameters
            ----------
            config : dict
                Additional parameters for initial condition.
    
            """
            self._interval_len = self._right_bound-self._left_bound
    
        def get_name(self):
            """Returns string of class name."""
            return self.__class__.__name__
    
        def is_smooth(self):
            """Returns flag that function is smooth."""
            return True
    
        def induce_adjustment(self, value):
            """Adjusts x-value of function.
    
            Parameters
            ----------
            value : float
                Value of adjustment on x-axis in right direction.
    
            """
            pass
    
        def randomize(self, config):
            """Sets all non-determined instance variables to random value.
    
            Parameters
            ----------
            config : dict
                Fixed parameters for initial condition.
    
            """
            pass
    
        def calculate(self, x):
            """Evaluates function at given x-value.
    
            Projects x-value into interval of the periodic function and evaluates
            the function.
    
            Parameters
            ----------
            x : float
                Evaluation point of function.
    
            Returns
            -------
            float
                Value of function evaluates at x-value.
    
            """
            while x < self._left_bound:
                x += self._interval_len
            while x > self._right_bound:
                x -= self._interval_len
            return self._get_point(x)
    
        def _get_point(self, x):
            """Evaluates function at given x-value.
    
            Parameters
            ----------
            x : float
                Evaluation point of function.
    
            Returns
            -------
            float
                Value of function evaluates at x-value.
    
            """
            pass
    
    
    class Sine(InitialCondition):
        """Class for the sine wave.
    
        Attributes
        ----------
        factor : float
            Factor by which is the evaluation point is multiplied before applying
            sine.
    
        Methods
        -------
        randomize(config)
            Sets all non-determined instance variables to random value.
    
        """
        def _reset(self, config):
            """Resets instance variables.
    
            Parameters
            ----------
            config : dict
                Additional parameters for initial condition.
    
            """
            super()._reset(config)
    
            # Unpack necessary configurations
            self._factor = config.pop('factor', 2)
    
        def randomize(self, config):
            """Sets all non-determined instance variables to random value.
    
            Parameters
            ----------
            config : dict
                Fixed parameters for initial condition.
    
            """
            factor = config.pop('factor', np.random.uniform(low=-100, high=100))
            config = {'factor': factor}
            self._reset(config)
    
        def _get_point(self, x):
            """Evaluates function at given x-value.
    
            Parameters
            ----------
            x : float
                Evaluation point of function.
    
            Returns
            -------
            float
                Value of function evaluates at x-value.
    
            """
            return np.sin(self._factor * np.pi * x)
    
    
    class Box(InitialCondition):
        """Class for a continuous function with two jumps (forming a box).
    
        Methods
        -------
        is_smooth()
            Returns flag whether function is smooth.
    
        """
        def is_smooth(self):
            """Returns flag that function is not smooth."""
            return False
    
        def _get_point(self, x):
            """Evaluates function at given x-value.
    
            Parameters
            ----------
            x : float
                Evaluation point of function.
    
            Returns
            -------
            float
                Value of function evaluates at x-value.
    
            """
            if x < -1:
                x += 2
            if x > 1:
                x -= 2
            if (x >= -0.5) & (x <= 0.5):
                return 1
            else:
                return 0
    
    
    class FourPeakWave(InitialCondition):
        """Class for a function with four peaks.
    
        The function is defined piece-by-piece and consists of a Gaussian function,
        a box function, a symmetric absolute function, and an elliptic function.
    
        Attributes
        ----------
        alpha : float
            Factor used for the elliptic function.
        delta : float
            Value used to adjust z for the Gaussian function.
        beta : float
            Factor used for the Gaussian function.
        a : float
            Value for x-value adjustment for elliptic function.
        z : float
            Value for x-value adjustment for Gaussian function.
    
        Methods
        -------
        is_smooth()
            Returns flag whether function is smooth.
    
        """
        def _reset(self, config):
            """Resets instance variables.
    
            Parameters
            ----------
            config : dict
                Additional parameters for initial condition.
    
            """
            super()._reset(config)
    
            # Set additional necessary parameter
            self._alpha = 10
            self._delta = 0.005
            self._beta = np.log(2) / (36 * self._delta**2)
            self._a = 0.5
            self._z = -0.7
    
        def is_smooth(self):
            """Returns flag that function is not smooth."""
            return False
    
        def _get_point(self, x):
            """Evaluates function at given x-value.
    
            Parameters
            ----------
            x : float
                Evaluation point of function.
    
            Returns
            -------
            float
                Value of function evaluates at x-value.
    
            """
            if (x >= -0.8) & (x <= -0.6):
                return 1/6 * (self._gaussian_function(x, self._z-self._delta)
                              + self._gaussian_function(x, self._z+self._delta)
                              + 4 * self._gaussian_function(x, self._z))
            if (x >= -0.4) & (x <= -0.2):
                return 1
            if (x >= 0) & (x <= 0.2):
                return 1 - abs(10 * (x-0.1))
            if (x >= 0.4) & (x <= 0.6):
                return 1/6 * (self._elliptic_function(x, self._a-self._delta)
                              + self._elliptic_function(x, self._a+self._delta)
                              + 4 * self._elliptic_function(x, self._a))
            return 0
    
        def _gaussian_function(self, x, z):
            """Evaluates Gaussian function.
    
            Parameters
            ----------
            x : float
                Evaluation point of function.
            z : float
                Value for x-value adjustment.
    
            Returns
            -------
            float
                Value of function evaluates at x-value.
    
            """
            return np.exp(-self._beta * (x-z)**2)
    
        def _elliptic_function(self, x, a):
            """Evaluates elliptic function.
    
            Parameters
            ----------
            x : float
                Evaluation point of function.
            a : float
                Value for x-value adjustment.
    
            Returns
            -------
            float
                Value of function evaluates at x-value.
    
            """
            return np.sqrt(max(1 - self._alpha**2 * (x-a)**2, 0))
    
    
    class Linear(InitialCondition):
        """Class for the linear function.
    
        Attributes
        ----------
        factor : float
            Factor by which is the evaluation point is multiplied.
    
        Methods
        -------
        randomize(config)
            Sets all non-determined instance variables to random value.
    
        """
        def _reset(self, config):
            """Resets instance variables.
    
            Parameters
            ----------
            config : dict
                Additional parameters for initial condition.
    
            """
            super()._reset(config)
    
            # Unpack necessary configurations
            self._factor = config.pop('factor', 1)
    
        def randomize(self, config):
            """Sets all non-determined instance variables to random value.
    
            Parameters
            ----------
            config : dict
                Fixed parameters for initial condition.
    
            """
            factor = config.pop('factor', np.random.uniform(low=-100, high=100))
            config = {'factor': factor}
            self._reset(config)
    
        def _get_point(self, x):
            """Evaluates function at given x-value.
    
            Parameters
            ----------
            x : float
                Evaluation point of function.
    
            Returns
            -------
            float
                Value of function evaluates at x-value.
    
            """
            return self._factor * x
    
    
    class LinearAbsolut(InitialCondition):
        """Class for the absolute values of the linear function.
    
        Attributes
        ----------
        factor : float
            Factor by which is the evaluation point is multiplied.
    
        Methods
        -------
        is_smooth()
            Returns flag whether function is smooth.
        randomize(config)
            Sets all non-determined instance variables to random value.
    
        """
        def _reset(self, config):
            """Resets instance variables.
    
            Parameters
            ----------
            config : dict
                Additional parameters for initial condition.
    
            """
            super()._reset(config)
    
            # Unpack necessary configurations
            self._factor = config.pop('factor', 1)
    
        def is_smooth(self):
            """Returns flag that function is not smooth."""
            return False
    
        def randomize(self, config):
            """Sets all non-determined instance variables to random value.
    
            Parameters
            ----------
            config : dict
                Fixed parameters for initial condition.
    
            """
            factor = config.pop('factor', np.random.uniform(low=-100, high=100))
            config = {'factor': factor}
            self._reset(config)
    
        def _get_point(self, x):
            """Evaluates function at given x-value.
    
            Parameters
            ----------
            x : float
                Evaluation point of function.
    
            Returns
            -------
            float
                Value of function evaluates at x-value.
    
            """
            return self._factor * abs(x)
    
    
    class DiscontinuousConstant(InitialCondition):
        """Class for the otherwise continuous function with one jump.
    
        Attributes
        ----------
        x0 : float
            X-value where jump is induced.
        left_factor : float
            Factor by which is the evaluation point is multiplied before the jump.
        right_factor : float
            Factor by which is the evaluation point is multiplied after the jump.
    
        Methods
        -------
        is_smooth()
            Returns flag whether function is smooth.
    
        """
        def _reset(self, config):
            """Resets instance variables.
    
            Parameters
            ----------
            config : dict
                Additional parameters for initial condition.
    
            """
            super()._reset(config)
    
            # Unpack necessary configurations
            self._x0 = config.pop('x0', 0)
            self._left_factor = config.pop('left_factor', 1)
            self._right_factor = config.pop('right_factor', 0.5)
    
        def is_smooth(self):
            """Returns flag that function is not smooth."""
            return False
    
        def _get_point(self, x):
            """Evaluates function at given x-value.
    
            Parameters
            ----------
            x : float
                Evaluation point of function.
    
            Returns
            -------
            float
                Value of function evaluates at x-value.
    
            """
            return self._left_factor * (x <= self._x0) \
                + self._right_factor * (x > self._x0)
    
    
    class Polynomial(InitialCondition):
        """Class for the polynomial function.
    
        Attributes
        ----------
        factor : float
            Factor by which is the evaluation point is multiplied.
        exponential : int
            Degree of the polynomial.
    
        Methods
        -------
        randomize(config)
            Sets all non-determined instance variables to random value.
    
        """
        def _reset(self, config):
            """Resets instance variables.
    
            Parameters
            ----------
            config : dict
                Additional parameters for initial condition.
    
            """
            super()._reset(config)
    
            # Unpack necessary configurations
            self._factor = config.pop('factor', 1)
            self._exponential = config.pop('exponential', 2)
    
        def randomize(self, config):
            """Sets all non-determined instance variables to random value.
    
            Parameters
            ----------
            config : dict
                Fixed parameters for initial condition.
    
            """
            factor = config.pop('factor', np.random.uniform(low=-100, high=100))
            exponential = config.pop('exponential', np.random.randint(2, high=6))
            config = {'factor': factor, 'exponential': exponential}
            self._reset(config)
    
        def _get_point(self, x):
            """Evaluates function at given x-value.
    
            Parameters
            ----------
            x : float
                Evaluation point of function.
    
            Returns
            -------
            float
                Value of function evaluates at x-value.
    
            """
            return self._factor * (x ** self._exponential)
    
    
    class Continuous(InitialCondition):
        """Class for the continuous function.
    
        Attributes
        ----------
        factor : float
            Factor by which is the evaluation point is multiplied.
    
        Methods
        -------
        randomize(config)
            Sets all non-determined instance variables to random value.
    
        """
        def _reset(self, config):
            """Resets instance variables.
    
            Parameters
            ----------
            config : dict
                Additional parameters for initial condition.
    
            """
            super()._reset(config)
    
            # Unpack necessary configurations
            self._factor = config.pop('factor', 1)
    
        def randomize(self, config):
            """Sets all non-determined instance variables to random value.
    
            Parameters
            ----------
            config : dict
                Fixed parameters for initial condition.
    
            """
            factor = config.pop('factor', np.random.uniform(low=-100, high=100))
            config = {'factor': factor}
            self._reset(config)
    
        def _get_point(self, x):
            """Evaluates function at given x-value.
    
            Parameters
            ----------
            x : float
                Evaluation point of function.
    
            Returns
            -------
            float
                Value of function evaluates at x-value.
    
            """
            return self._factor
    
    
    class HeavisideOneSided(InitialCondition):
        """Class for the one-sided heaviside function.
    
        Attributes
        ----------
        factor : float
            Factor by which is the evaluation point is multiplied.
    
        Methods
        -------
        is_smooth()
            Returns flag whether function is smooth.
        randomize(config)
            Sets all non-determined instance variables to random value.
    
        """
        def _reset(self, config):
            """Resets instance variables.
    
            Parameters
            ----------
            config : dict
                Additional parameters for initial condition.
    
            """
            super()._reset(config)
    
            # Unpack necessary configurations
            self._factor = config.pop('factor', -1)
    
        def is_smooth(self):
            """Returns flag that function is not smooth."""
            return False
    
        def randomize(self, config):
            """Sets all non-determined instance variables to random value.
    
            Parameters
            ----------
            config : dict
                Fixed parameters for initial condition.
    
            """
            factor = config.pop('factor', np.random.choice([-1, 1]))
            config = {'factor': factor}
            self._reset(config)
    
        def _get_point(self, x):
            """Evaluates function at given x-value.
    
            Parameters
            ----------
            x : float
                Evaluation point of function.
    
            Returns
            -------
            float
                Value of function evaluates at x-value.
    
            """
            return self._factor - 2 * self._factor * np.heaviside(x, 0)
    
    
    class HeavisideTwoSided(InitialCondition):
        """Class for the two-sided heaviside function.
    
        Attributes
        ----------
        left_factor : float
            Factor by which is the evaluation point is multiplied before the jump.
        right_factor : float
            Factor by which is the evaluation point is multiplied after the jump.
        adjustment : float
            Extent of adjustment of evaluation point in x-direction.
    
        Methods
        -------
        is_smooth()
            Returns flag whether function is smooth.
        induce_adjustment(value)
            Adjusts x-value of function.
        randomize(config)
            Sets all non-determined instance variables to random value.
    
        """
        def _reset(self, config):
            """Resets instance variables.
    
            Parameters
            ----------
            config : dict
                Additional parameters for initial condition.
    
            """
            super()._reset(config)
    
            # Unpack necessary configurations
            self._left_factor = config.pop('left_factor', 1)
            self._right_factor = config.pop('right_factor', 2)
            self._adjustment = config.pop('adjustment', 0)
    
        def is_smooth(self):
            """Returns flag that function is not smooth."""
            return False
    
        def induce_adjustment(self, value):
            """Adjusts x-value of function.
    
            Parameters
            ----------
            value : float
                Value of adjustment on x-axis in right direction.
    
            """
            self._adjustment = value
    
        def randomize(self, config):
            """Sets all non-determined instance variables to random value.
    
            Parameters
            ----------
            config : dict
                Fixed parameters for initial condition.
    
            """
            left_factor = config.pop('left_factor', np.random.choice([-1, 1]))
            right_factor = config.pop('right_factor', np.random.choice([-1, 1]))
            adjustment = config.pop('adjustment',
                                    np.random.uniform(low=-1, high=1))
            config = {'left_factor': left_factor, 'right_factor': right_factor,
                      'adjustment': adjustment}
            self._reset(config)
    
        def _get_point(self, x):
            """Evaluates function at given x-value.
    
            Parameters
            ----------
            x : float
                Evaluation point of function.
    
            Returns
            -------
            float
                Value of function evaluates at x-value.
    
            """
            return self._left_factor \
                - self._left_factor * np.heaviside(x - self._adjustment, 0)\
                - self._right_factor * np.heaviside(x + self._adjustment, 0)