Source code for pybop.models._exponential_decay
import pybamm
from pybop.models.base_model import BaseModel
[docs]
class ExponentialDecayModel(BaseModel):
"""
Exponential decay model defined by the equation:
dy/dt = -k * y, y(0) = y0
Note: The output variables are named "y_{i}" for each state.
For example, the first state is "y_0", the second is "y_1", etc.
Attributes:
n_states (int): Number of states in the system (default is 1).
pybamm_model (pybamm.BaseModel): PyBaMM model representation.
default_parameter_values (pybamm.ParameterValues): Default parameter values
for the model, with "k" (decay rate) and "y0" (initial condition).
Parameters:
name (str): Name of the model (default: "Experimental Decay Model").
parameter_set (pybamm.ParameterValues): Parameter values for the model.
n_states (int): Number of states in the system. Must be >= 1.
"""
def __init__(
self,
name: str = "Experimental Decay Model",
parameter_set: pybamm.ParameterValues = None,
n_states: int = 1,
solver=None,
):
if n_states < 1:
raise ValueError("The number of states (n_states) must be at least 1.")
super().__init__(name=name, parameter_set=parameter_set)
[docs]
self.n_states = n_states
if solver is None:
self._solver = pybamm.CasadiSolver
self._solver.mode = "fast with events"
self._solver.max_step_decrease_count = 1
else:
self._solver = solver
# Initialise the PyBaMM model, variables, parameters
[docs]
self.pybamm_model = pybamm.BaseModel()
ys = [pybamm.Variable(f"y_{i}") for i in range(n_states)]
k = pybamm.Parameter("k")
y0 = pybamm.Parameter("y0")
# Set up the right-hand side and initial conditions
self.pybamm_model.rhs = {y: -k * y for y in ys}
self.pybamm_model.initial_conditions = {y: y0 for y in ys}
# Define model outputs and set default values
self.pybamm_model.variables = {f"y_{en}": i for en, i in enumerate(ys)} | {
"Time [s]": pybamm.t
}
[docs]
self.default_parameter_values = parameter_set or pybamm.ParameterValues(
{"k": 0.1, "y0": 1}
)
# Store model attributes to be used by the solver
[docs]
self._unprocessed_model = self.pybamm_model
[docs]
self._parameter_set = self.default_parameter_values
[docs]
self._unprocessed_parameter_set = self._parameter_set
# Geometry and solver setup
[docs]
self._geometry = self.pybamm_model.default_geometry
[docs]
self._submesh_types = self.pybamm_model.default_submesh_types
[docs]
self._var_pts = self.pybamm_model.default_var_pts
[docs]
self._spatial_methods = self.pybamm_model.default_spatial_methods
[docs]
self._solver = pybamm.IDAKLUSolver(rtol=1e-6)
# Additional attributes for solver and discretisation
[docs]
self._model_with_set_params = None
[docs]
self._built_model = None
[docs]
self._built_initial_soc = None
[docs]
self.geometric_parameters = {}