Artículos técnicos

Perspectivas de MathWorks

Ejecución de PyBaMM desde MATLAB: Ampliación de las capacidades de simulación de baterías


Autores:

  • Sebastián Arias Alfaro, MathWorks
  • Chris Lim, MathWorks
  • Xiangchun Zhang, MathWorks

10 minutos de lectura

Resumen

  • El modelado de baterías es cada vez más esencial para el diseño, el control y la verificación virtual en todos los sectores industriales.
  • MATLAB, Simulink y Simscape proporcionan un entorno integrado para simulaciones dinámicas de baterías y sistemas.
  • PyBaMM añade modelos electroquímicos avanzados y conjuntos de parámetros que se pueden ejecutar en MATLAB, Simulink o Simscape.

Introducción

El modelado de baterías es una actividad crucial para el diseño de sistemas de gestión de baterías en muchas industrias. Los modelos de batería están embebidos en el software de control de la batería como parte de un algoritmo de estimación del estado de carga en tiempo real. Se utilizan para prototipado rápido y el desarrollo de la estrategia de control de la batería, para explorar las sensibilidades del diseño en las actividades de investigación y desarrollo, y para realizar el diseño y la verificación virtuales durante el ciclo de diseño de un producto de batería. Todas estas tareas se pueden realizar utilizando MATLAB®, Simulink® y Simscape™, que proporcionan un entorno potente para las pruebas virtuales de baterías, con el software de control integrado con el resto del sistema.

Gráfico que muestra seis aspectos del modelado de baterías: diseño, vida útil, seguridad, control, caracterización y análisis térmico.

Figura 1. Aplicaciones de modelado de baterías.

PyBaMM es una herramienta de código abierto líder que proporciona una librería de modelos de baterías con varios niveles de complejidad, según sus necesidades. Estos modelos electroquímicos de baterías, detallados y de alta resolución, con efectos de degradación incorporados, pueden ejecutarse directamente desde un script de MATLAB o integrarse en Simulink. Además, puede importar conjuntos de parámetros de PyBaMM directamente a los bloques de Simscape Battery™, que admiten la generación de código, la creación automatizada de modelos de sistemas de baterías y el modelado de sistemas electrotérmicos, así como flujos de trabajo de modelado totalmente acausales.

Este artículo explica cómo ejecutar PyBaMM directamente desde MATLAB, importar modelos de baterías de PyBaMM a Simulink e importar los parámetros de los modelos de baterías de PyBaMM a los bloques de Simscape Battery. Los archivos que acompañan al contenido están disponible para descargar.

Diagrama que muestra tres métodos de integración entre PyBaMM y MATLAB: ejecutar PyBaMM directamente desde MATLAB, cosimulación e importar conjuntos de parámetros de PyBaMM a bloques de Simscape.

Figura 2. Flujos de trabajo de integración de PyBaMM con MATLAB.

Instalación de PyBaMM

Para ejecutar PyBaMM dentro de MATLAB, primero debe configurar un entorno Python que sea accesible dentro de MATLAB. (Consulte las versiones compatibles de Python para cada versión de MATLAB.) Para este ejemplo, estamos utilizando MATLAB R2025a y Python 3.11.

Para instalar PyBaMM dentro de su entorno Python, siga las instrucciones en el sitio web de PyBaMM.

Una vez que tenga un entorno Python compatible con PyBaMM instalado, podrá ejecutar una simulación de PyBaMM desde MATLAB. Si tiene varias instalaciones de Python en su máquina (o está utilizando entornos virtuales), indique a MATLAB el ejecutable de Python que desea que utilice:

% pe = pyenv("Version", "<path_to_Python.exe>");

Para obtener la ruta a su ejecutable de Python dentro del entorno de Python, ejecute los siguientes comandos desde la línea de comandos de Python:

>>> import sys
>>> print(sys.executable)

Para comprobar si PyBaMM está instalado en el entorno Python que utiliza MATLAB, ejecute el siguiente comando en la línea de comandos de MATLAB:

tf = check_pybamm_install()

  tf = logical
     1

Una vez que haya verificado que MATLAB está utilizando un entorno Python con PyBaMM instalado, estará listo para ejecutar una simulación de PyBaMM desde dentro de MATLAB.

Ejecución de PyBaMM dentro de MATLAB

Ejecutar un experimento de PyBaMM en MATLAB es similar a cómo se ejecutaría en Python. Estamos usando un ejemplo de la documentación de PyBaMM.

Primero, importe el módulo PyBaMM y configure el modelo y el objeto de simulación. A continuación, ejecute una simulación (en este caso, durante 1 hora con intervalos de 90 segundos) para obtener la solución:

pybamm = py.importlib.import_module('pybamm');
model = pybamm.lithium_ion.SPMe();
simulation = pybamm.Simulation(model);
solution = simulation.solve(0:90:3600);

A continuación, extraiga las variables que interesen del objeto de solución. Rellene el diccionario de datos de la solución con las variables (en este caso, tiempo y voltaje) antes de convertirlas a tipos de datos double que se puedan utilizar en MATLAB:

variables = py.list({'Time [s]', 'Voltage [V]'});
solution.update(variables);
t = double(solution.data.get('Time [s]'));
v = double(solution.data.get('Voltage [V]'));

Las variables x e y ahora son arrays de MATLAB que se pueden representar utilizando la sintaxis normal de MATLAB:

figure; hold on;
plot(t, v, "-");
plot(t, v, ".", "MarkerSize", 5);
grid on; xlabel("Time (s)"); ylabel("Voltage (V)");
Gráfico de líneas que muestra cómo el voltaje de la batería disminuye gradualmente con el tiempo, con una caída pronunciada cerca del final del ciclo.

Figura 3. Voltaje en los terminales de batería del modelo PyBaMM SPMe simulado en MATLAB.

Ejecución de PyBaMM dentro de Simulink

Desde MATLAB R2025a, el código de Python se puede ejecutar en Simulink utilizando el bloque Python Code. Este bloque permite a los usuarios escribir código Python nativo y ejecutarlo dentro de un modelo de Simulink.

El bloque Python Code ofrece a los usuarios la opción de escribir código Python que se ejecuta en la inicialización del modelo, en cada paso del modelo y en la finalización de una simulación. Los usuarios también pueden definir los puertos y parámetros para su código Python, lo que permite que el bloque interactúe con otros bloques dentro de Simulink y que se parametrice el bloque como se haría con otros bloques en el área de diseño de Simulink.

En este ejemplo, tomamos una carga de corriente y generamos la respuesta de voltaje de la simulación PyBaMM, al tiempo que damos al usuario la posibilidad de definir el estado de carga inicial para el modelo de celda.

Puertos y parámetros

Los puertos y parámetros se muestran en la Figura 4; los parámetros se definen de la siguiente manera:

  • current_in es una entrada y define la carga de corriente de la celda. En PyBaMM, una entrada de corriente positiva se utiliza para indicar la descarga.
  • voltage_out es una salida que contendrá la respuesta de voltaje de la celda.
  • StepSize es un parámetro que determinará el paso de tiempo fijo que el solucionador PyBaMM utiliza para avanzar en la simulación.
  • InitialStateOfCharge es un parámetro que se utilizará para establecer el estado de carga inicial al comienzo de la simulación.
  • simulation es una variable persistente, lo que permite que este parámetro permanezca en la memoria a lo largo de las diferentes etapas de la simulación.
Cuadro de diálogo que muestra la sección de puertos y parámetros de la máscara del bloque Python Code.

Figura 4. Sección de puertos y parámetros del cuadro de diálogo de la máscara del bloque Python Code.

Cuatro de estos puertos y parámetros están definidos como tipos de datos "double". Se convertirán automáticamente a tipos de datos flotantes de Python. El parámetro simulation se define como un PythonObject porque es una clase PyBaMM.

Pestaña Initialize

La pestaña "Initialize" contiene el código que se ejecuta una sola vez al inicio de una simulación de Simulink. Utilizamos esto para definir el modelo PyBaMM y para establecer las condiciones iniciales.

Cuadro de diálogo que muestra la sección de inicialización de la máscara del bloque Python Code.

Figura 5. Pestaña Initialize code del cuadro de diálogo de máscara del bloque Python Code.

Aquí importamos el modelo PyBaMM y definimos el modelo de celda que se utilizará (en este caso, un modelo SPMe). Creamos el objeto de simulación PyBaMM y lo almacenamos en la variable simulation (definida como un parámetro persistente). Luego establecemos la función de corriente como una entrada y establecemos el objeto simulation para tener nuestro estado de carga inicial definido por el usuario.

Pestaña Output

La pestaña "Output" define el código que se ejecuta en cada paso del solucionador de Simulink.

Cuadro de diálogo que muestra la sección de salida de la máscara del bloque Python Code.

Figura 6. Pestaña Output code del cuadro de diálogo de máscara del bloque Python Code.

En este ejemplo, actualizamos la entrada de corriente con el último valor del puerto current_in y avanzamos la simulación por el valor definido en el parámetro StepSize. Luego recuperamos el valor de voltaje en terminales del diccionario de resultados generado por el objeto de solución PyBaMM y devolvemos el último valor de la serie temporal a través del puerto voltage_out.

Parametrización de bloques de código Python

En la sección “Puertos y parámetros” anterior, definimos dos parámetros para el bloque Python Code. Estos aparecen a continuación en los parámetros del cuadro de diálogo del bloque (véase más abajo).

Diálogo de parámetros del bloque Python Code con campos para StepSize (0.1), InitialStateOfCharge (0.5) y tiempo de muestreo (0.1).

Figura 7. Máscara de bloque Python Code después de editar el cuadro de diálogo del bloque.

PyBaMM utiliza sus propios solucionadores para la simulación. Por lo tanto, es importante mantenerse sincronizado con el tiempo de paso del solucionador de Simulink. En este caso, estamos utilizando un solucionador de paso fijo con un paso de tiempo de 0,1 segundos (por lo tanto, hemos definido el parámetro StepSize como 0.1).

El bloque Python Code también tiene su propio parámetro Sample time. En este caso, también debe establecerse en 0,1.

Ejecución de la simulación

Una vez que haya parametrizado la simulación PyBaMM, puede proceder a ejecutarla como lo haría normalmente.

Ejemplo de la disposición del bloque Python Code en el área de diseño de Simulink.

Figura 8. Bloque de código Python en el área de diseño de Simulink.

En nuestro ejemplo, aplicamos una carga de 10 A a la celda a los 5 segundos de la simulación, partiendo de un estado de carga del 50%. Un valor de entrada de corriente positivo provocará la descarga de la batería. Esto da como resultado la respuesta de voltaje que se muestra en la Figura 9.

Dos gráficas que muestran la caída de voltaje después de 5 segundos, mientras que la carga de corriente aumenta y permanece constante hasta los 10 segundos.

Figura 9. Series temporales de corriente de entrada y tensión de salida en los terminales obtenidas mediante simulación.

Esta es la configuración más sencilla necesaria para ejecutar una simulación PyBaMM en Simulink.

Importación de conjuntos de parámetros de PyBaMM en bloques de Simscape

PyBaMM proporciona varios conjuntos de parámetros predefinidos para las químicas de baterías comunes, que se obtienen de la literatura académica. Dentro de PyBaMM, estos conjuntos se definen como objetos de clase de tipo ParameterSets. Para utilizar uno de estos conjuntos de parámetros en un bloque de MATLAB Simscape, primero debe crearse un bloque de modelo electroquímico de Simscape "equivalente". En este ejemplo, se importa un conjunto de parámetros para utilizarlo con el bloque de Simscape Battery Single Particle (TSPMe). Este bloque está disponible en Simscape Battery.

Además, se requiere un script o una clase de objeto de MATLAB que pueda:

  • Almacenar los parámetros de TSPMe.
  • Realizar la conversión de parámetros de la convención estándar PyBaMM a Simscape.
  • Parametrizar automáticamente el bloque de Simscape.

Como parte de este artículo, proporcionamos un objeto personalizado TSPMeParameterSet, que sirve como contenedor de parámetros para el bloque TSPMe y puede importar los siguientes conjuntos de parámetros PyBaMM en el bloque de Simscape Battery Single Particle: ["Chen2020","Marquis2019","OKane2022 ","Ai2020 "]. Esta clase se puede extender para usar otros conjuntos de parámetros o para parametrizar cualquier otro tipo de modelo (por ejemplo, un modelo de circuito equivalente o un modelo P2D). Para importar un conjunto de parámetros, primero defina el nombre del conjunto de parámetros requerido en MATLAB:

ParameterSetName = "OKane2022";

Para instanciar el objeto contenedor de parámetros e importar el conjunto de parámetros de PyBaMM, ejecute los siguientes comandos desde la ventana de comandos:

SimscapeParameterSet = TSPMeParameterSet(ParameterSet = ParameterSetName);

Importing geometry parameters...Done.
Importing min/max stoichiometries...Done.
Importing OCP vectors...Done.
Importing electrode parameters...Done.
Importing electrolyte parameters...Done.
Importing electrolyte diffusion and electrolyte coefficients...Done.
Importing charge transfer rates...Done.
Importing thermal mass...Done.
Importing initial electrolyte concentration...Done.

El objeto contenedor de parámetros ahora contiene el conjunto de parámetros especificado desde PyBaMM. Para parametrizar automáticamente un bloque de Simscape Battery Single Particle, ejecute los siguientes comandos en la ventana de comandos de MATLAB:

modelname = "PyBaMM_Simscape_Example";
batteryBlockPath = strcat(modelname,"/","Battery");
open_system(modelname);
parameterizeTSPMe(SimscapeParameterSet, batteryBlockPath);

El fragmento de código anterior debería haber parametrizado el bloque de batería en el modelo de ejemplo de Simscape.

Diagrama de un modelo de batería con bloques de carga, planta y mediciones.

Figura 10. Bloque Parameterized Battery Single Particle.

Validación de la salida de Simscape TSPMe

A continuación, puede validar la parametrización del bloque Battery Single Particle ejecutando una simulación con PyBaMM y Simscape, y comparando los voltajes de salida en los terminales de la batería. En primer lugar, defina la carga de corriente y las condiciones límite:

BatteryCurrent = 2.5; % A
AmbientTemperature = 298.15; % K

Simulación de PyBaMM

Para ejecutar una simulación PyBaMM con estas condiciones, primero debe crear y actualizar un conjunto de parámetros PyBaMM. Para lograr esto, ejecute el siguiente código en la línea de comandos de MATLAB: 

PyBaMMParameterSet = pybamm.ParameterValues(ParameterSetName);
PyBaMMParameterSet.update(py.dict(dictionary("Ambient temperature [K]", AmbientTemperature)));
PyBaMMParameterSet.update(py.dict(dictionary("Current function [A]", BatteryCurrent)));

Este conjunto de parámetros de PyBaMM también incluye parámetros relacionados con la transferencia de calor ambiental, por lo que puede utilizarlos para ambas simulaciones. Para extraer estos parámetros y utilizarlos en la simulación de Simscape, ejecute el siguiente código en la línea de comandos de MATLAB:

CoolingSurfaceArea = PyBaMMParameterSet.get('Cell cooling surface area [m2]');
HeatTransferCoefficient = PyBaMMParameterSet.get('Total heat transfer coefficient [W.m-2.K-1]');

Para ejecutar la simulación PyBaMM, ejecute el siguiente código:

model = pybamm.lithium_ion.SPMe();
simulation = pybamm.Simulation(model,parameter_values=PyBaMMParameterSet);
solution = simulation.solve(0:10:3600*2);

Simulación en Simscape

Para ejecutar la misma simulación en Simscape, ejecute el siguiente código:

set_param(modelname,"StopTime","3600*2")
set_param(modelname,"SimscapeLogType","all")
out = sim(modelname);

Como antes, extraiga las variables que interesen del objeto de solución PyBaMM. Rellene el diccionario de datos de la solución con sus variables (en este caso, tiempo y voltaje) antes de convertirlas a tipos de datos double que pueda utilizar en MATLAB:

variables = py.list({'Time [s]', 'Voltage [V]'});
solution.update(variables);
time = double(solution.data.get('Time [s]'));
voltage = double(solution.data.get('Voltage [V]'));

El objeto de salida de simulación out de Simscape contiene el voltaje de la batería y todas las demás variables que registra el bloque TSPMe. Para crear una gráfica comparativa entre PyBaMM y Simscape, ejecute el siguiente comando:

figure;
plot(time, voltage, "o");
hold on
plot(out.simlog.Battery.batteryVoltage.series.time,out.simlog.Battery.batteryVoltage.series.values,"r");
grid on
xlabel("Time (s)")
ylabel("Voltage (V)")
legend(["PyBaMM","Simscape"])
Gráfico que compara dos curvas de voltaje a lo largo del tiempo, mostrando una estrecha alineación con una caída pronunciada cerca del final de la descarga.

Figura 11. Comparación del voltaje en terminales entre Battery Single Particle y PyBaMM SPMe.

Tenga en cuenta que el error de validación varía en función de la tasa C aplicada y las condiciones de temperatura. El bloque TSPMe predeterminado de Simscape no contiene la dependencia del parámetro de concentración para la difusividad y la conductividad del electrolito, que se puede considerar en el modelo PyBaMM. Por lo tanto, cabe esperar una mayor discrepancia entre los valores de voltaje en terminales a tasas C más elevadas.

Ampliación de la escala de celdas de batería a sistema completo

Para ampliar nuestro modelo de Simscape desde una celda hasta un sistema, utilice la función Simscape Battery Pack Builder. Primero, cree un objeto de celda de batería y vincúlelo al bloque de modelo Battery Single Particle:

battCell = batteryCell();
battCell.CellModelOptions.CellModelBlockPath = "batt_lib/Cells/Electrochemical/Battery Single Particle";
battCell.CellModelOptions.BlockParameters.StoichiometryBreakpointsSpecification = "absolute";

Después de definir el objeto de celda de batería, amplíe el modelo de celda al nivel de módulo ejecutando el siguiente comando de MATLAB:

battPSet = batteryParallelAssembly(battCell,4, "Rows",4);
battModule = batteryModule(battPSet,4, ...
    "ModelResolution", "Detailed",...
    "AmbientThermalPath","CellBasedThermalResistance");

Puede aumentar la resolución del modelo configurando la propiedad ModelResolution en "Detailed". Para generar automáticamente el modelo de su batería, ejecute el siguiente comando:

buildBattery(battModule, "MaskParameters", "VariableNamesByType");

El fragmento de código anterior debería haber generado una librería de baterías con el bloque del modelo de su módulo de batería, como se muestra en la Figura 12.

Imagen de un modelo de módulo de batería en el área de diseño de Simulink generado con la función buildBattery.

Figura 12. Modelo de módulo de batería creado con el bloque Battery Single Particle.

Los parámetros necesarios para ejecutar este nuevo bloque de modelo se almacenan en el script recién generado: Batteries_param.m. Para vincular los parámetros del módulo al conjunto de parámetros de PyBaMM, ejecute el siguiente comando:

Module1 = SimscapeParameterSet.getModuleElectrochemicalParameters(SimscapeParameterSet);

Utilizando este nuevo bloque de modelo de batería, ahora puede crear y ejecutar una simulación de descarga constante de la batería en el entorno Simulink. Además, puede utilizar BatterySimulationChart para visualizar dinámicamente las variables clave de la batería a lo largo de su simulación. Para crear y ejecutar la simulación, ejecute el siguiente comando:

run("CreateAndRunBatterySimscapeModel.mlx")

Resumen

En este artículo, presentamos tres flujos de trabajo diferentes para integrar la capacidad de modelado de baterías de PyBaMM en MATLAB, Simulink y Simscape. Cada flujo de trabajo tiene sus propias ventajas y se adapta mejor a actividades específicas. Por ejemplo, integrar PyBaMM con Simulink es un buen método para realizar prototipado rápido y desarrollar un sistema de gestión de baterías. Importar conjuntos de parámetros de PyBaMM a Simscape es un buen método para crear modelos físicos acausales que se pueden ampliar de manera eficiente e incluir en una simulación eléctrica y térmica más amplia. La ampliación de modelos de celdas a modelos de sistema se puede realizar de manera eficiente utilizando la funcionalidad Simscape Battery Pack Builder. Esta integración ayuda a mejorar las capacidades nativas de MATLAB y puede aportar valor añadido a los diferentes flujos de trabajo de diseño y desarrollo de baterías que se utilizan en la industria.

Trabajo futuro

Los métodos presentados en este artículo son sencillos y se basan en funcionalidades ya existentes. Estos métodos pueden perfeccionarse y ampliarse para incluir más modelos electroquímicos PyBaMM, admitir otros conjuntos de parámetros y añadir modelos complejos a nivel de sistema, entre otras mejoras.

En adelante, partiremos de los flujos de trabajo presentados aquí para demostrar cómo esta integración puede respaldar las actividades prácticas de diseño y verificación de baterías. Nuestro objetivo es también explorar otros métodos para establecer la conectividad entre PyBaMM y MATLAB, y presentarlos en el contexto de los beneficios que aportan a la aplicación de baterías prevista.

Vemos oportunidades para mostrar: 

  • Diseño y verificación del paquete con sistemas a nivel de módulo y paquete para la predicción de la energía útil y la capacidad de potencia en condiciones térmicas realistas
  • Mejora de la predicción del envejecimiento del sistema de baterías y de la garantía mediante la librería de modelos de degradación de baterías de PyBaMM
  • Uso simplificado del conjunto de parámetros de PyBaMM para una mayor variedad de bloques de Simscape
  • Cómo los modelos basados en PyBaMM pueden ayudar al desarrollo de controladores en Simulink

Agradecimientos

Un agradecimiento especial al profesor Daniel Auger de la Universidad de Cranfield por su colaboración, sus ideas para futuras líneas de trabajo y las diversas conversaciones que mantuvimos sobre métodos de conectividad entre MATLAB y PyBaMM con aplicaciones a sistemas de baterías.

Referencias

  • Sulzer, V., Marquis, S. G., Timms, R., Robinson, M., & Chapman, S. J. (2021). Modelado matemático de baterías con Python (PyBaMM). Journal of Open Research Software, 9(1).

Publicado en 2026


Productos utilizados: Simscape, Simscape Battery

Perfiles profesionales

Sebastián Arias Alfaro

Sebastián Arias Alfaro forma parte del equipo de desarrollo de Simscape Battery en MathWorks, donde crea modelos, algoritmos y flujos de trabajo para ayudar a los clientes que trabajan en los sectores de electrificación y almacenamiento de energía. Sebastián cuenta con más de 9 años de experiencia en modelado de baterías, estimación de parámetros y desarrollo de algoritmos. Tiene una maestría en diseño de procesos químicos para energía de la Universidad de Manchester y un título en ingeniería química de la Universidad de Costa Rica.

Chris Lim

Chris Lim es ingeniero del grupo de Servicios de Consultoría de MathWorks. Trabaja principalmente con clientes empresariales de las industrias aeroespacial y de defensa en diversos temas, como desarrollo de software, modelado a gran escala y modelado y simulación de sistemas físicos. Chris tiene un doctorado (DPhil) del Oxford Thermofluids Institute de la Universidad de Oxford, sobre estrategias de gestión térmica para la Fórmula 1, y un título MEng con honores de primera clase en ciencias de la ingeniería de la Universidad de Oxford.

Xiangchun Zhang

Xiangchun Zhang es ingeniero de aplicaciones en MathWorks y se especializa en el modelado de baterías y el desarrollo de algoritmos para sistemas de gestión de baterías (BMS). Comenzó su investigación sobre baterías de iones de litio en 2005 durante sus estudios de doctorado, en los que se centró en el modelado multiescala de celdas de iones de litio, incluida la mecánica, la generación de calor y la cinética electroquímica. A lo largo de 2 décadas, ha contribuido a la investigación y el desarrollo de baterías tanto en el ámbito académico como en el industrial, incluido el desarrollo de baterías de estado sólido en Dyson. Su trabajo sobre baterías ha sido citado miles de veces. Zhang tiene títulos de BS y MS en ingeniería de la Universidad de Tsinghua en Beijing, China, y un doctorado (PhD) en Ingeniería Mecánica de la Universidad de Michigan, Ann Arbor.

Siga explorando