Source code for pbparam.optimisers.scipy_differential_evolution

#
# SciPy Differential Evolution optimiser
#
import pbparam
import numpy as np
from scipy.optimize import differential_evolution
import pybamm


[docs] class ScipyDifferentialEvolution(pbparam.BaseOptimiser): """ Scipy Differential Evolution Optimiser class. Wraps the Scipy's differential evolution optimizer for use in an optimization problem. Inherits from the BaseOptimizer class and overrides the _run_optimizer method to use the differential_evolution function from Scipy's optimize module. Please refer to (https://docs.scipy.org/doc/scipy/reference/generated/ scipy.optimize.differential_evolution.html) for more details. Scipy Differential Evolution is a non-gradient based method that is robust but slower to converge than 'Nelder-Mead' method. Parameters ---------- extra_options : dict, optional Dict of arguments that will be passed to the differential_evolution function. """ def __init__(self, extra_options=None): super().__init__() self.extra_options = extra_options or {} self.name = "SciPy Differential Evolution optimiser" self.single_variable = False self.global_optimiser = True def _run_optimiser(self, optimisation_problem, x0, bounds): """ Runs the optimization process. Parameters ---------- optimisation_problem : :class:`pbparam.OptimisationProblem` The optimization problem to solve. x0 : array_like Initial guess for the optimization problem. bounds : array_like Bounds for the optimization problem. Returns ------- result : :class:`pbparam.pbparam.OptimisationResult` The results of the optimization process. """ timer = pybamm.Timer() raw_result = differential_evolution( optimisation_problem.objective_function, bounds, x0=x0, **self.extra_options, ) solve_time = timer.time() if optimisation_problem.scalings is None: scaled_result = raw_result.x else: scaled_result = np.multiply(raw_result.x, optimisation_problem.scalings) result = pbparam.OptimisationResult( scaled_result, raw_result.success, raw_result.message, raw_result.fun, raw_result, optimisation_problem, self.name ) result.solve_time = solve_time return result