Articoli tecnici

Insight di MathWorks

Esecuzione di PyBaMM da MATLAB: ampliamento delle capacità di simulazione delle batterie


Autori:

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

10 minuti di lettura

Riepilogo

  • La modellazione delle batterie sta diventando sempre più essenziale per la progettazione, il controllo e la verifica virtuale in diversi settori.
  • MATLAB, Simulink e Simscape offrono un ambiente integrato per le simulazioni dinamiche di batterie e sistemi.
  • PyBaMM aggiunge modelli elettrochimici avanzati e set di parametri che possono essere eseguiti in MATLAB, Simulink o Simscape.

Introduzione

La modellazione delle batterie è un'attività cruciale per la progettazione di sistemi di gestione delle batterie in molti settori industriali. I modelli delle batterie sono integrati nel software di controllo della batteria come parte di un algoritmo per la stima dello stato di carica in tempo reale. Vengono utilizzati per la prototipazione rapida e lo sviluppo della strategia di controllo della batteria, per analizzare le sensibilità progettuali nelle attività di ricerca e sviluppo e per eseguire la progettazione e la verifica virtuali durante il ciclo di progettazione di un prodotto a batteria. Tutte queste operazioni possono essere eseguite utilizzando MATLAB.®, Simulink® e Simscape™, che forniscono un ambiente potente per il test virtuale delle batterie, con il software di controllo integrato con il resto del sistema.

Grafico che illustra sei aspetti della modellazione delle batterie: progettazione, durata, sicurezza, controllo, caratterizzazione e gestione termica.

Figura 1. Applicazioni di modellazione delle batterie.

PyBaMM è uno dei principali strumenti open source che offre una libreria di modelli per batterie con diversi livelli di complessità, a seconda delle esigenze. Questi modelli elettrochimici dettagliati e ad alta risoluzione delle batterie, che includono effetti di degradazione integrati, possono essere eseguiti direttamente da uno script MATLAB oppure integrati in Simulink. Inoltre, è possibile importare direttamente i set di parametri PyBaMM nei blocchi di Simscape Battery™, che supportano la generazione del codice, la creazione automatica di modelli di pacchi batteria e la modellazione di sistemi elettrotermici, oltre a workflow di modellazione completamente acausali.

Questo articolo spiega come eseguire PyBaMM direttamente da MATLAB, importare i modelli di batterie PyBaMM in Simulink e importare i parametri dei modelli di batterie PyBaMM nei corrispondenti blocchi di Simscape Battery. I file allegati al contenuto sono disponibili per il download.

Diagramma che mostra tre modalità di integrazione tra PyBaMM e MATLAB: esecuzione diretta di PyBaMM da MATLAB, cosimulazione e importazione dei set di parametri PyBaMM nei blocchi Simscape.

Figura 2. Workflow per l'integrazione di PyBaMM con MATLAB.

Installazione di PyBaMM

Per eseguire PyBaMM all'interno di MATLAB, è necessario innanzitutto configurare un ambiente Python accessibile da MATLAB. (Consulta le versioni di Python compatibili con ciascuna versione MATLAB.) Per questo esempio, utilizziamo MATLAB R2025a e Python 3.11.

Per installare PyBaMM nel tuo ambiente Python, segui le istruzioni sul sito web di PyBaMM.

Una volta configurato un ambiente Python compatibile con PyBaMM, è possibile eseguire una simulazione PyBaMM direttamente da MATLAB. Se sul computer sono installate più versioni di Python (o se si utilizzano ambienti virtuali), specifica l’eseguibile Python che MATLAB deve utilizzare:

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

Per ottenere il percorso dell’eseguibile Python nell’ambiente Python, esegui i seguenti comandi dal prompt dei comandi Python:

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

Per verificare se PyBaMM è installato nell'ambiente Python utilizzato da MATLAB, esegui il seguente comando nella riga di comando MATLAB:

tf = check_pybamm_install()

  tf = logical
     1

Una volta verificato che MATLAB utilizza un ambiente Python in cui è installato PyBaMM, puoi eseguire una simulazione PyBaMM direttamente da MATLAB.

Esecuzione di PyBaMM all'interno di MATLAB

Esegui un esperimento PyBaMM in MATLAB è simile a eseguirlo in Python. Stiamo usando un esempio tratto dalla documentazione di PyBaMM.

Innanzitutto, importa il modulo PyBaMM e configura il modello e l'oggetto di simulazione. Successivamente, esegui una simulazione (in questo caso, per 1 ora con intervalli di tempo di 90 secondi) per ottenere la soluzione:

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

Successivamente, estrai dall’oggetto della soluzione le variabili di interesse. Inserisci nel dizionario dei dati della soluzione le variabili di interesse (in questo caso, tempo e tensione) prima di convertirle nei tipi di dati double utilizzabili in 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]'));

Le variabili x e y sono ora array MATLAB da poter rappresentare graficamente utilizzando la normale sintassi MATLAB:

figure; hold on;
plot(t, v, "-");
plot(t, v, ".", "MarkerSize", 5);
grid on; xlabel("Time (s)"); ylabel("Voltage (V)");
Grafico a linee che mostra la tensione della batteria diminuire gradualmente nel tempo, con un forte calo verso la fine del ciclo.

Figura 3. Tensione ai terminali della batteria ottenuta dal modello SPMe di PyBaMM, simulato in MATLAB.

Esecuzione di PyBaMM all'interno di Simulink

A partire da MATLAB R2025a, il codice Python può essere eseguito in Simulink utilizzando il blocco Python Code. Questo blocco consente agli utenti di scrivere codice Python nativo ed eseguirlo all'interno di un modello Simulink.

Il blocco Python Code consente di scrivere codice Python che viene eseguito durante l’inizializzazione del modello, a ogni passo del modello e al termine della simulazione. Gli utenti possono inoltre definire le porte e i parametri per il codice Python, consentendo al blocco di interagire con gli altri blocchi di Simulink e di parametrizzarlo come qualsiasi altro blocco nel canvas di Simulink.

In questo esempio, utilizziamo un carico di corrente e restituiamo la risposta in tensione della simulazione PyBaMM, consentendo inoltre all’utente di definire lo stato di carica iniziale del modello della cella.

Porte e parametri

Le porte e i parametri sono illustrati nella Figura 4; i parametri sono definiti come segue:

  • current_in è un input e definisce il carico attuale della cella. In PyBaMM, un input di corrente positivo viene utilizzato per indicare la scarica.
  • voltage_out è un output che includerà la risposta di tensione della cella.
  • StepSize è un parametro che determina il passo temporale fisso utilizzato dal risolutore PyBaMM per eseguire la simulazione.
  • InitialStateOfCharge è un parametro che verrà utilizzato per impostare lo stato di carica iniziale all'inizio della simulazione.
  • simulation è una variabile persistente, che consente a questo parametro di rimanere in memoria nelle diverse fasi della simulazione.
Finestra di dialogo che mostra la sezione Porte e parametri della maschera del blocco Python Code.

Figura 4. Sezione Porte e parametri della finestra di dialogo della maschera del blocco Python Code.

Quattro di queste porte e parametri sono definiti come tipi di dati “double”. Verranno convertiti automaticamente in tipi di dati float di Python. Il parametro simulation è definito come PythonObject perché è una classe PyBaMM.

Inizializzazione

La scheda “Inizializzazione” contiene il codice che viene eseguito una sola volta all'inizio di una simulazione Simulink. Utilizziamo questo strumento per definire il modello PyBaMM e per impostare le condizioni iniziali.

Finestra di dialogo che mostra la sezione Inizializzazione della maschera del blocco Python Code.

Figura 5. Scheda Codice di inizializzazione della finestra di dialogo della maschera del blocco Python Code.

Qui importiamo il modello PyBaMM e definiamo il modello della cella da utilizzare (in questo caso, un modello SPMe). Creiamo l'oggetto di simulazione PyBaMM e lo memorizziamo nella variabile simulation (definita come parametro persistente). Abbiamo quindi impostato la funzione corrente come input e impostato l’oggetto simulation per avere il nostro stato di carica iniziale definito dall'utente.

Output

La scheda “Output” definisce il codice che viene eseguito in ogni fase del solutore Simulink.

Finestra di dialogo che mostra la sezione di output della maschera del blocco di codice Python.

Figura 6. Scheda Codice di output della finestra di dialogo della maschera del blocco Python Code.

In questo esempio, aggiorniamo l’ingresso di corrente con il valore più recente della porta current_in e facciamo avanzare la simulazione dell’intervallo definito dal parametro StepSize. Quindi recuperiamo il valore della tensione ai terminali dal dizionario dei risultati generato dall’oggetto della soluzione PyBaMM e restituiamo l’ultimo valore della serie temporale tramite la porta voltage_out.

Parametrizzazione del blocco Python Code

Nella sezione “Porte e parametri” precedente, abbiamo definito due parametri per il blocco Python Code. Questi vengono quindi visualizzati nei parametri della finestra di dialogo del blocco, come mostrato di seguito.

Finestra di dialogo dei parametri del blocco Python Code con i campi StepSize (0.1), InitialStateOfCharge (0.5) e sample time (0.1).

Figura 7. Maschera del blocco Python Code dopo le modifiche apportate nella finestra di dialogo.

PyBaMM utilizza i propri algoritmi di risoluzione per la simulazione. Pertanto, è importante mantenere la sincronizzazione con il tempo di passo del solver di Simulink. In questo caso, utilizziamo un solver a passo fisso con un intervallo di 0,1 secondi (per questo motivo abbiamo definito il parametro StepSize come 0,1).

Il blocco Python Code dispone inoltre di un proprio parametro Sample time. In questo caso, deve essere impostato anche su 0,1.

Esecuzione della simulazione

Una volta parametrizzata la simulazione PyBaMM, è possibile procedere all'esecuzione della simulazione come di consueto.

Esempio di layout del blocco Python Code nell'area di lavoro Simulink.

Figura 8. Blocco Python Code nell'area di lavoro Simulink.

Nel nostro esempio, applichiamo un carico di 10 A alla cella dopo 5 secondi dall’inizio della simulazione, partendo da uno stato di carica del 50%. Un valore positivo della corrente in input provoca la scarica della batteria. Questo produce la risposta in tensione mostrata nella Figura 9.

Due grafici che mostrano la tensione diminuire dopo 5 secondi, quando il carico di corrente aumenta bruscamente e rimane costante fino a 10 secondi.

Figura 9. Serie temporale della corrente in ingresso e della tensione ai terminali ottenuta dalla simulazione.

Questa è la configurazione più semplice necessaria per avviare una simulazione PyBaMM in Simulink.

Importazione dei set di parametri PyBaMM nei blocchi Simscape

PyBaMM offre diversi insiemi di parametri predefiniti per le chimiche delle batterie più comuni, ricavati dalla letteratura accademica. All'interno di PyBaMM, questi insiemi sono definiti come oggetti di classe di tipo ParameterSets. Per utilizzare uno di questi set di parametri in un blocco Simscape, è innanzitutto necessario creare un blocco Simscape di modello elettrochimico “equivalente”. In questo esempio, viene importato un set di parametri da utilizzare nel modello Simscape Battery Single Particle Model with Electrolyte (TSPMe). Questo blocco è disponibile all'interno di Simscape Battery.

Inoltre, è necessario uno script MATLAB o una classe di oggetti in grado di:

  • Memorizzare i parametri TSPMe.
  • Eseguire la conversione dei parametri dalla convenzione standard PyBaMM a Simscape.
  • Parametrizzare automaticamente il blocco Simscape.

Come parte di questo articolo, forniamo un oggetto personalizzato TSPMeParameterSet, che funge da contenitore di parametri per il blocco TSPMe e può importare i seguenti set di parametri PyBaMM nel blocco Battery Single Particle Simscape: ["Chen2020","Marquis2019","OKane2022","Ai2020"]. Questa classe può essere estesa per utilizzare altri set di parametri o per parametrizzare qualsiasi altro tipo di modello, ad esempio un modello a circuito equivalente o un modello P2D. Per importare un set di parametri, è necessario innanzitutto definire il nome del set di parametri desiderato in MATLAB:

ParameterSetName = "OKane2022";

Per creare un’istanza dell’oggetto contenitore dei parametri e importare il set di parametri PyBaMM, esegui i seguenti comandi nella finestra dei comandi:

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.

L’oggetto contenitore dei parametri ora contiene il set di parametri specificato di PyBaMM. Per parametrizzare automaticamente un blocco Battery Single Particle di Simscape, esegui i seguenti comandi nella finestra dei comandi di MATLAB:

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

Il frammento di codice precedente dovrebbe aver parametrizzato il blocco Battery nel modello di esempio Simscape.

Diagramma di un modello di batteria con i blocchi Load, Plant e Measurements.

Figura 10. Blocco Battery Single Particle parametrizzato.

Validazione dell'output Simscape TSPMe

Successivamente, puoi convalidare la parametrizzazione del blocco Battery Single Particle eseguendo una simulazione sia con PyBaMM sia con Simscape e confrontando le tensioni ai terminali della batteria ottenute. Innanzitutto, definisci la corrente di carico e le condizioni al contorno:

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

Simulazione PyBaMM

Per eseguire una simulazione PyBaMM con queste condizioni, devi innanzitutto creare e aggiornare un set di parametri PyBaMM. Per raggiungere questo obiettivo, esegui il seguente codice nella riga di comando MATLAB: 

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

Questo set di parametri PyBaMM include anche i parametri relativi allo scambio termico con l’ambiente, che puoi quindi utilizzare per entrambe le simulazioni. Per estrarre questi parametri e utilizzarli nella simulazione Simscape, esegui il seguente codice nella finestra dei comandi di MATLAB:

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

Per avviare la simulazione PyBaMM, esegui il seguente codice:

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

Simulazione Simscape

Per eseguire la stessa simulazione in Simscape, esegui il seguente codice:

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

Come in precedenza, estrai dall’oggetto della soluzione PyBaMM le variabili di interesse. Inserisci le variabili di interesse (in questo caso, tempo e tensione) nel dizionario dei dati della soluzione prima di convertirle nei tipi di dati double utilizzabili in 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]'));

L’oggetto di output out della simulazione Simscape contiene la tensione della batteria e tutte le altre variabili monitorate dal blocco TSPMe. Per creare un grafico di confronto tra PyBaMM e Simscape, esegui il seguente 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"])
Grafico che confronta due curve di tensione nel tempo, mostrando una stretta corrispondenza e un forte calo verso la fine della scarica.

Figura 11. Confronto della tensione ai terminali tra Battery Single Particle e SPMe di PyBaMM.

Tieni presente che l’errore di validazione varia in funzione del C-rate applicato e delle condizioni di temperatura. Il blocco TSPMe predefinito di Simscape non considera la dipendenza della diffusività e della conducibilità dell’elettrolita dalla concentrazione, che può invece essere considerata nel modello PyBaMM. Pertanto, è prevedibile una maggiore discrepanza tra i valori della tensione ai terminali a C-rate più elevati.

Scalabilità dalla cella al sistema della batteria

Per scalare il modello Simscape dalla cella al sistema, utilizza la funzionalità Simscape Battery Pack Builder. Innanzitutto, crea un oggetto cella della batteria e collegalo al blocco del modello Battery Single Particle:

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

Dopo aver definito l’oggetto cella della batteria, scala il modello della cella al livello del modulo eseguendo il seguente comando MATLAB:

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

Puoi aumentare il livello di dettaglio del modello impostando la proprietà ModelResolution su "Detailed". Per generare automaticamente il modello della batteria, esegui il seguente comando:

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

Il frammento di codice precedente dovrebbe aver generato una libreria di batterie contenente il blocco del modello del modulo batteria, come mostrato nella Figura 12.

Immagine di un modello di modulo batteria nel canvas di Simulink, generato con la funzione buildBattery.

Figura 12. Modello di modulo batteria realizzato utilizzando il blocco Battery Single Particle.

I parametri necessari per eseguire questo nuovo blocco del modello sono memorizzati nello script appena generato: Batteries_param.m. Per collegare i parametri del modulo al set di parametri PyBaMM, esegui il seguente comando:

Module1 = SimscapeParameterSet.getModuleElectrochemicalParameters(SimscapeParameterSet);

Utilizzando questo blocco del modello della batteria appena creato, puoi ora creare ed eseguire una simulazione di scarica a corrente costante nell’ambiente Simulink. Inoltre, puoi utilizzare BatterySimulationChart per visualizzare dinamicamente le principali variabili della batteria durante la simulazione. Per creare ed eseguire la simulazione, esegui il seguente comando:

run("CreateAndRunBatterySimscapeModel.mlx")

Conclusione

In questo articolo abbiamo presentato tre diversi flussi di lavoro per integrare le funzionalità di modellazione delle batterie di PyBaMM in MATLAB, Simulink e Simscape. Ogni workflow ha i suoi vantaggi ed è più adatto ad attività specifiche. Ad esempio, l’integrazione di PyBaMM con Simulink è un metodo efficace per la prototipazione rapida e lo sviluppo di un sistema di gestione della batteria. L’importazione dei set di parametri PyBaMM in Simscape è un metodo efficace per creare modelli fisici acausali, che possono essere scalati in modo efficiente e integrati in simulazioni elettriche e termiche più ampie. La scalabilità dai modelli di cella a quelli di sistema può essere gestita in modo efficiente utilizzando la funzionalità Simscape Battery Pack Builder. Questa integrazione amplia le funzionalità native di MATLAB e può apportare valore ai diversi workflow per la progettazione e lo sviluppo delle batterie utilizzati nel settore industriale.

Sviluppi futuri

I metodi presentati in questo articolo sono semplici e si basano sulle funzionalità già disponibili. Questi metodi possono essere perfezionati ed estesi per includere un maggior numero di modelli elettrochimici PyBaMM, supportare altri set di parametri e aggiungere funzionalità avanzate di modellazione a livello di sistema, tra gli altri miglioramenti.

In futuro, svilupperemo ulteriormente i workflow presentati in questo articolo, mostrando come questa integrazione possa supportare attività pratiche di progettazione e verifica delle batterie. Puntiamo inoltre a esplorare altri metodi per stabilire la connessione tra PyBaMM e MATLAB e a presentarli in relazione ai vantaggi che offrono per l’applicazione target delle batterie.

Vediamo opportunità per illustrare: 

  • Progettazione e verifica del pacco batteria con sistemi a livello di modulo e pacco per prevedere l’energia utile e la capacità di erogazione della potenza in condizioni termiche realistiche.
  • Miglioramento della previsione dell’invecchiamento e della garanzia dei sistemi a batteria, basata sulla libreria di modelli di degradazione delle batterie di PyBaMM.
  • Semplificazione dell’utilizzo dei set di parametri PyBaMM per una gamma più ampia di blocchi Simscape.
  • Come i modelli basati su PyBaMM possono supportare lo sviluppo di controller in Simulink.

Ringraziamenti

Un ringraziamento speciale al professor Daniel Auger della Cranfield University per la collaborazione, i suggerimenti sulle possibili aree di sviluppo futuro e le numerose discussioni sui metodi di connessione tra MATLAB e PyBaMM e sulle relative applicazioni ai sistemi a batteria.

Riferimenti

  • Sulzer, V., Marquis, S. G., Timms, R., Robinson, M., & Chapman, S. J. (2021). Python Battery Mathematical Modelling (PyBaMM). Journal of Open Research Software, 9(1).

Pubblicato nel 2026


Prodotti utilizzati: Simscape, Simscape Battery

Informazioni sugli autori

Sebastián Arias Alfaro

Sebastián Arias Alfaro fa parte del team di sviluppo di Simscape Battery presso MathWorks, dove sviluppa modelli, algoritmi e workflow per supportare i clienti che operano nei settori dell’elettrificazione e dell’accumulo di energia. Ha oltre 9 anni di esperienza nella modellazione delle batterie, nella stima dei parametri e nello sviluppo di algoritmi. Ha conseguito un master in progettazione di processi chimici per l’energia presso la University of Manchester e una laurea in ingegneria chimica presso la University of Costa Rica.

Chris Lim

Chris Lim è un ingegnere del gruppo MathWorks Consulting Services. Si occupa principalmente di clienti enterprise nei settori aerospaziale e della difesa, affrontando diversi ambiti, tra cui lo sviluppo software, la modellazione su larga scala e la modellazione e simulazione di sistemi fisici. Ha conseguito un DPhil presso l’Oxford Thermofluids Institute della University of Oxford, con una ricerca sulle strategie di gestione termica per la Formula 1, e una laurea MEng con il massimo dei voti in engineering science presso la University of Oxford.

Xiangchun Zhang

Xiangchun Zhang è un Application Engineer presso MathWorks, specializzato nella modellazione delle batterie e nello sviluppo di algoritmi per i sistemi di gestione delle batterie (BMS). Ha iniziato a occuparsi di batterie agli ioni di litio nel 2005, durante il dottorato, concentrandosi sulla modellazione multiscala delle celle agli ioni di litio, inclusi gli aspetti meccanici, la generazione di calore e la cinetica elettrochimica. Da oltre vent’anni contribuisce alla ricerca e sviluppo nel settore delle batterie, sia in ambito accademico sia industriale, tra cui lo sviluppo di batterie allo stato solido presso Dyson. Le sue pubblicazioni sulle batterie sono state citate migliaia di volte. Zhang ha conseguito una laurea (BS) e una laurea magistrale (MS) in ingegneria presso la Tsinghua University di Pechino, in Cina, e un PhD in ingegneria meccanica presso la University of Michigan, Ann Arbor.

Per saperne di più