-
Notifications
You must be signed in to change notification settings - Fork 26
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #249 from brosaplanella/issue-223-GITT
Implement GITT example
- Loading branch information
Showing
8 changed files
with
262 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
import numpy as np | ||
|
||
import pybop | ||
|
||
# Define model | ||
parameter_set = pybop.ParameterSet.pybamm("Xu2019") | ||
model = pybop.lithium_ion.SPM( | ||
parameter_set=parameter_set, options={"working electrode": "positive"} | ||
) | ||
|
||
# Generate data | ||
sigma = 0.005 | ||
t_eval = np.arange(0, 150, 2) | ||
values = model.predict(t_eval=t_eval) | ||
corrupt_values = values["Voltage [V]"].data + np.random.normal(0, sigma, len(t_eval)) | ||
|
||
# Form dataset | ||
dataset = pybop.Dataset( | ||
{ | ||
"Time [s]": t_eval, | ||
"Current function [A]": values["Current [A]"].data, | ||
"Voltage [V]": corrupt_values, | ||
} | ||
) | ||
|
||
# Define parameter set | ||
parameter_set.update( | ||
{ | ||
"Reference OCP [V]": 4.1821, | ||
"Derivative of the OCP wrt stoichiometry [V]": -1.38636, | ||
}, | ||
check_already_exists=False, | ||
) | ||
|
||
# Define the cost to optimise | ||
model = pybop.lithium_ion.WeppnerHuggins(parameter_set=parameter_set) | ||
|
||
parameters = [ | ||
pybop.Parameter( | ||
"Positive electrode diffusivity [m2.s-1]", | ||
prior=pybop.Gaussian(5e-14, 1e-13), | ||
bounds=[1e-16, 1e-11], | ||
true_value=parameter_set["Positive electrode diffusivity [m2.s-1]"], | ||
), | ||
] | ||
|
||
problem = pybop.FittingProblem( | ||
model, | ||
parameters, | ||
dataset, | ||
signal=["Voltage [V]"], | ||
) | ||
|
||
cost = pybop.RootMeanSquaredError(problem) | ||
|
||
# Build the optimisation problem | ||
optim = pybop.Optimisation(cost=cost, optimiser=pybop.PSO, verbose=True) | ||
|
||
# Run the optimisation problem | ||
x, final_cost = optim.run() | ||
print("Estimated parameters:", x) | ||
|
||
# Plot the timeseries output | ||
pybop.quick_plot(problem, parameter_values=x, title="Optimised Comparison") | ||
|
||
# Plot convergence | ||
pybop.plot_convergence(optim) | ||
|
||
# Plot the parameter traces | ||
pybop.plot_parameters(optim) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
# | ||
# Weppner Huggins Model | ||
# | ||
import numpy as np | ||
import pybamm | ||
|
||
|
||
class BaseWeppnerHuggins(pybamm.lithium_ion.BaseModel): | ||
"""WeppnerHuggins Model for GITT. Credit: pybamm-param team. | ||
Parameters | ||
---------- | ||
name : str, optional | ||
The name of the model. | ||
""" | ||
|
||
def __init__(self, name="Weppner & Huggins model"): | ||
super().__init__({}, name) | ||
|
||
pybamm.citations.register(""" | ||
@article{Weppner1977, | ||
title={{Determination of the kinetic parameters | ||
of mixed-conducting electrodes and application to the system Li3Sb}}, | ||
author={Weppner, W and Huggins, R A}, | ||
journal={Journal of The Electrochemical Society}, | ||
volume={124}, | ||
number={10}, | ||
pages={1569}, | ||
year={1977}, | ||
publisher={IOP Publishing} | ||
} | ||
""") | ||
|
||
# `self.param` is a class containing all the relevant parameters and functions for | ||
# this model. These are purely symbolic at this stage, and will be set by the | ||
# `ParameterValues` class when the model is processed. | ||
self.options["working electrode"] = "positive" | ||
self._summary_variables = [] | ||
|
||
t = pybamm.t | ||
###################### | ||
# Parameters | ||
###################### | ||
|
||
d_s = pybamm.Parameter("Positive electrode diffusivity [m2.s-1]") | ||
|
||
c_s_max = pybamm.Parameter( | ||
"Maximum concentration in positive electrode [mol.m-3]" | ||
) | ||
|
||
i_app = self.param.current_density_with_time | ||
|
||
U = pybamm.Parameter("Reference OCP [V]") | ||
|
||
U_prime = pybamm.Parameter("Derivative of the OCP wrt stoichiometry [V]") | ||
|
||
epsilon = pybamm.Parameter("Positive electrode active material volume fraction") | ||
|
||
r_particle = pybamm.Parameter("Positive particle radius [m]") | ||
|
||
a = 3 * (epsilon / r_particle) | ||
|
||
l_w = self.param.p.L | ||
|
||
###################### | ||
# Governing equations | ||
###################### | ||
u_surf = ( | ||
(2 / (np.pi**0.5)) | ||
* (i_app / ((d_s**0.5) * a * self.param.F * l_w)) | ||
* (t**0.5) | ||
) | ||
# Linearised voltage | ||
V = U + (U_prime * u_surf) / c_s_max | ||
###################### | ||
# (Some) variables | ||
###################### | ||
self.variables = { | ||
"Voltage [V]": V, | ||
"Time [s]": t, | ||
} | ||
|
||
@property | ||
def default_geometry(self): | ||
return {} | ||
|
||
@property | ||
def default_parameter_values(self): | ||
parameter_values = pybamm.ParameterValues("Xu2019") | ||
parameter_values.update( | ||
{ | ||
"Reference OCP [V]": 4.1821, | ||
"Derivative of the OCP wrt stoichiometry [V]": -1.38636, | ||
}, | ||
check_already_exists=False, | ||
) | ||
return parameter_values | ||
|
||
@property | ||
def default_submesh_types(self): | ||
return {} | ||
|
||
@property | ||
def default_var_pts(self): | ||
return {} | ||
|
||
@property | ||
def default_spatial_methods(self): | ||
return {} | ||
|
||
@property | ||
def default_solver(self): | ||
return pybamm.DummySolver() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters