Articles techniques

La perspective de MathWorks

Exécution de PyBaMM depuis MATLAB : développement des capacités de simulation de batteries


Auteurs:

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

10 minutes de lecture

Résumé

  • La modélisation des batteries est de plus en plus essentielle pour le design, le contrôle et la vérification virtuelle dans tous les secteurs d'activité.
  • MATLAB, Simulink et Simscape offrent un environnement intégré pour les simulations dynamiques de batteries et de systèmes.
  • PyBaMM ajoute des modèles électrochimiques avancés et des ensembles de paramètres qui peuvent être exécutés dans MATLAB, Simulink ou Simscape.

Introduction

La modélisation des batteries est une activité cruciale pour le design des systèmes de gestion des batteries dans de nombreux secteurs industriels. Les modèles de batterie sont intégrés au logiciel de contrôle de la batterie dans le cadre d'un algorithme d'estimation en temps réel de l'état de charge. Ils sont utilisés pour le prototypage rapide et le développement de la stratégie de contrôle de la batterie, pour explorer les sensibilités de design dans les activités de recherche et développement, et pour effectuer un design et une vérification virtuels au cours d'un cycle de développement de produit de batterie. Toutes ces tâches peuvent être réalisées à l'aide de MATLAB®, Simulink® et Simscape™, qui offrent un environnement puissant pour les tests virtuels de batteries, avec un logiciel de contrôle intégré au reste du système.

Graphique illustrant six aspects de la modélisation des batteries : design, durée de vie, sécurité, contrôle, caractérisation et thermique.

Figure 1. Applications de modélisation des batteries.

PyBaMM est un outil open-source de premier plan qui propose une bibliothèque de modèles de batteries avec plusieurs niveaux de complexité en fonction de vos besoins. Ces modèles de batteries électrochimiques détaillés et à haute résolution, avec effets de dégradation intégrés, peuvent être exécutés directement à partir d'un script MATLAB ou intégrés dans Simulink. De plus, vous pouvez importer directement les ensembles de paramètres PyBaMM dans les blocs Simscape Battery™, qui supportent la génération de code, la création automatisée de modèles de batteries et la modélisation de systèmes électrothermiques ainsi que les workflows de modélisation entièrement acausale.

Cet article explique comment exécuter PyBaMM directement depuis MATLAB, importer des modèles de batterie PyBaMM dans Simulink et importer les paramètres des modèles de batterie PyBaMM dans des blocs de Simscape Battery équivalents. Les fichiers qui accompagnent le contenu sont disponibles au téléchargement.

Diagramme illustrant trois méthodes d'intégration entre PyBaMM et MATLAB: exécution directe de PyBaMM depuis MATLAB, co-simulation et importation des ensembles de paramètres PyBaMM dans les blocs Simscape.

Figure 2. Workflows d'intégration de PyBaMM à MATLAB.

Installation de PyBaMM

Pour exécuter PyBaMM dans MATLAB, vous devez d'abord configurer un environnement Python accessible dans MATLAB. (Consultez la liste des versions de Python compatibles avec chaque version de MATLAB.) Pour cet exemple, nous utilisons MATLAB R2025a et Python 3.11.

Pour installer PyBaMM dans votre environnement Python, suivez les instructions sur le Site web PyBaMM.

Une fois que vous disposez d'un environnement Python compatible avec PyBaMM installé, vous pouvez exécuter une simulation PyBaMM depuis MATLAB. Si vous avez plusieurs installations de Python sur votre machine (ou si vous utilisez des environnements virtuels), indiquez à MATLAB l'exécutable Python que vous souhaitez utiliser :

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

Pour obtenir le chemin d'accès à votre exécutable Python dans l'environnement Python, exécutez les commandes suivantes depuis l'invite de commandes Python :

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

Pour vérifier si PyBaMM est installé dans l'environnement Python utilisé par MATLAB, exécutez la commande suivante dans la ligne de commande MATLAB :

tf = check_pybamm_install()

  tf = logical
     1

Une fois que vous avez vérifié que MATLAB utilise un environnement Python avec PyBaMM installé, vous êtes prêt à exécuter une simulation PyBaMM depuis MATLAB.

Exécuter PyBaMM dans MATLAB

L'exécution d'une expérience PyBaMM dans MATLAB est similaire à la manière dont vous l'exécuteriez en Python. Nous utilisons un exemple extrait de la documentation PyBaMM.

Commencez par importer le module PyBaMM et configurez le modèle et l'objet de simulation. Lancez ensuite une simulation (dans ce cas, pendant 1 heure avec un intervalle de temps de 90 secondes) pour obtenir la solution :

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

Ensuite, extrayez les variables qui vous intéressent de l'objet solution. Remplissez le dictionnaire de données de la solution avec les variables (dans ce cas, le temps et la tension) avant de les convertir en types de données double utilisables dans 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]'));

Les variables x et y sont désormais des tableaux MATLAB que vous pouvez représenter graphiquement en utilisant la syntaxe MATLAB normale :

figure; hold on;
plot(t, v, "-");
plot(t, v, ".", "MarkerSize", 5);
grid on; xlabel("Time (s)"); ylabel("Voltage (V)");
Graphique linéaire montrant la tension de la batterie diminuant progressivement au fil du temps, avec une chute brutale vers la fin du cycle.

Figure 3. Tension aux bornes de la batterie issue du modèle PyBaMM SPMe simulé dans MATLAB.

Exécuter PyBaMM dans Simulink

Depuis MATLAB R2025a, le code Python peut être exécuté dans Simulink à l'aide du bloc Python code. Ce bloc permet aux utilisateurs d'écrire du code Python natif et de l'exécuter au sein d'un modèle Simulink.

Le bloc Python Code offre aux utilisateurs la possibilité d'écrire du code Python qui est exécuté lors de l'initialisation du modèle, à chaque étape du modèle et à la fin d'une simulation. Les utilisateurs peuvent également définir les ports et les paramètres de leur bloc Python Code, ce qui permet au bloc d'interagir avec d'autres blocs au sein de Simulink et de paramétrer le bloc comme ils le feraient pour d'autres blocs sur le canevas Simulink.

Dans cet exemple, nous prenons une charge actuelle et affichons la réponse en tension de la simulation PyBaMM tout en donnant à l'utilisateur la possibilité de définir l'état de charge initial du modèle de cellule.

Ports et paramètres

Les ports et les paramètres sont illustrés sur la figure 4 ; les paramètres sont définis comme suit :

  • current_in est une entrée et définit la charge actuelle de la cellule. Dans PyBaMM, un courant d'entrée positif est utilisé pour indiquer une décharge.
  • voltage_out est une sortie qui contiendra la réponse en tension de la cellule.
  • StepSize est un paramètre qui déterminera le pas de temps fixe utilisé par le solveur PyBaMM pour effectuer la simulation.
  • InitialStateOfCharge est un paramètre qui sera utilisé pour définir l'état de charge initial au début de la simulation.
  • simulation est une variable persistante, ce qui permet à ce paramètre de rester en mémoire à travers les différentes étapes de la simulation.
Boîte de dialogue affichant la section des ports et des paramètres du masque du bloc Python Code.

Figure 4. Section « Ports and Parameters » de la boîte de dialogue du masque de bloc Python Code.

Quatre de ces ports et paramètres sont définis comme des types de données « double ». Elles seront automatiquement converties en types de données float Python. Le paramètre simulation est défini comme un objet Python car il s'agit d'une classe PyBaMM.

Initialiser

L’onglet « Initialize » contient le code qui est exécuté une seule fois au début d’une simulation Simulink. Nous utilisons cela pour définir le modèle PyBaMM et pour établir les conditions initiales.

Boîte de dialogue affichant la section d'initialisation du masque du bloc Python Code

Figure 5. Onglet d’initialisation du code du masque de bloc Python Code.

Ici, nous importons le modèle PyBaMM et définissons le modèle de cellule à utiliser (dans ce cas, un modèle SPMe). Nous créons l'objet de simulation PyBaMM et le stockons dans la variable simulation (définie comme un paramètre persistant). Nous définissons ensuite la fonction actuelle comme entrée et nous configurons l’objet simulation afin d'avoir notre état de charge initial défini par l'utilisateur.

Sortie

L'onglet « Output » définit le code exécuté à chaque étape du solveur Simulink.

Boîte de dialogue affichant la section de sortie du masque de bloc Python Code.

Figure 6. Onglet de sortie du code du masque de bloc Python Code.

Dans cet exemple, nous mettons à jour l'entrée actuelle avec la dernière valeur provenant du port current_in et puis nous avançons la simulation d’un pas défini dans le paramètre StepSize. Nous récupérons ensuite la valeur de la tension aux bornes à partir du dictionnaire de résultats généré par l'objet solution PyBaMM et renvoyons la dernière valeur de la série temporelle via le port voltage_out.

Paramétrage du bloc Python Code

Dans la section « Ports and Parameters » ci-dessus, nous avons défini deux paramètres pour le bloc Python Code. Ces éléments apparaissent ensuite dans les paramètres de la boîte de dialogue du bloc (voir ci-dessous).

Boîte de dialogue des paramètres du bloc Python Code avec des champs pour StepSize (0.1), InitialStateOfCharge (0.5) et le temps d'échantillonnage (0.1).

Figure 7. Masque du bloc Python Code après modification de la boîte de dialogue.

PyBaMM utilise ses propres solveurs pour la simulation. Il est donc important de rester synchronisé avec le temps d'exécution du solveur Simulink. Dans ce cas, nous utilisons un solveur à pas fixe avec un pas de temps de 0,1 seconde (nous avons donc défini le paramètre StepSize à 0,1).

Le bloc Python Code possède également son propre paramètre temps d'échantillonnage. Dans ce cas, il faut également le fixer à 0,1.

Exécution de la simulation

Une fois votre simulation PyBaMM paramétrée, vous pouvez alors procéder à son exécution comme d'habitude.

Exemple de disposition du bloc Python Code dans le canevas Simulink.

Figure 8. Bloc Python Code dans le canevas Simulink.

Dans notre exemple, nous appliquons une charge de 10 A à la cellule à 5 secondes après le début de la simulation, en commençant par un état de charge de 50 %. Une valeur de courant d'entrée positive entraînera la décharge de la batterie. Il en résulte la réponse en tension illustrée à la figure 9.

Deux graphiques illustrant la chute de tension après 5 secondes tandis que la charge de courant augmente et reste constante jusqu'à 10 secondes.

Figure 9. Séries temporelles de la tension d'entrée et de la tension de sortie aux bornes issues de la simulation.

Il s'agit de la configuration la plus simple requise pour faire fonctionner une simulation PyBaMM dans Simulink.

Importer les ensembles de paramètres PyBaMM dans les blocs Simscape

PyBaMM propose plusieurs options prédéfinies d’ensembles de paramètres pour les compositions chimiques courantes des batteries, qui sont issues de la littérature académique. Dans PyBaMM, ces ensembles sont définis comme des objets de classe de type ParameterSets. Pour utiliser l'un de ces ensembles de paramètres dans un bloc MATLAB Simscape, il faut d'abord créer un bloc de modèle électrochimique Simscape « équivalent ». Dans cet exemple, un ensemble de paramètres est importé pour être utilisé dans le modèle Simscape Battery Single Particle avec un bloc électrolyte (TSPMe). Ce bloc est disponible dans Simscape Battery.

De plus, un script MATLAB ou une classe d'objet est requis et doit pouvoir :

  • Stocker les paramètres TSPMe.
  • Effectuer la conversion des paramètres de la convention standard PyBaMM vers Simscape.
  • Paramétrer automatiquement le bloc Simscape.

Dans le cadre de cet article, nous fournissons un objet personnalisé TSPMeParameterSet, qui sert de conteneur de paramètres pour le bloc TSPMe et peut importer les ensembles de paramètres PyBaMM suivants dans le bloc Simscape Battery Single Particle : ["Chen2020","Marquis2019","OKane2022 ","Ai2020 "]. Cette classe peut être étendue pour utiliser d'autres ensembles de paramètres ou pour paramétrer tout autre type de modèle (par exemple, un modèle de circuit équivalent ou un modèle P2D). Pour importer un ensemble de paramètres, commencez par définir le nom de l'ensemble de paramètres requis dans MATLAB :

ParameterSetName = "OKane2022";

Pour instancier l'objet conteneur de paramètres et importer l'ensemble de paramètres PyBaMM, exécutez les commandes suivantes depuis la fenêtre de commande :

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'objet conteneur de paramètres contient désormais l'ensemble de paramètres spécifié par PyBaMM. Pour paramétrer automatiquement un bloc Battery Single Particle à partir de Simscape, exécutez les commandes suivantes dans la fenêtre de commande MATLAB :

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

L'extrait de code ci-dessus aurait dû paramétrer le bloc Battery dans le modèle d'exemple Simscape.

Diagramme d'un modèle de batterie avec blocs de charge, d'installation et de mesures.

Figure 10. Bloc Battery Single Particle paramétré.

Valider la sortie TSPMe de Simscape

Ensuite, vous pouvez valider votre paramétrage du bloc Battery Single Particle en exécutant une simulation à l'aide de PyBaMM et de Simscape et en comparant les tensions des bornes de sortie de la batterie. Tout d'abord, définissez le courant de charge et les conditions aux limites :

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

Simulation PyBaMM

Pour exécuter une simulation PyBaMM dans ces conditions, vous devez d'abord créer et mettre à jour un ensemble de paramètres PyBaMM. Pour ce faire, exécutez le code suivant dans la ligne de commande MATLAB : 

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

Cet ensemble de paramètres PyBaMM comprend également des paramètres liés au transfert de chaleur ambiant ; vous pouvez donc les utiliser pour les deux simulations. Pour extraire ces paramètres en vue de leur utilisation dans la simulation Simscape, exécutez le code suivant dans la ligne de commande MATLAB :

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

Pour exécuter la simulation PyBaMM, exécutez le code suivant :

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

Simulation Simscape

Pour exécuter la même simulation dans Simscape, exécutez le code suivant :

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

Comme précédemment, vous extrayez les variables qui vous intéressent de l'objet solution PyBaMM. Remplissez le dictionnaire de données de la solution avec vos variables (dans ce cas, le temps et la tension) avant de les convertir en types de données double que vous pouvez utiliser dans 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'objet de sortie out de la simulation Simscape contient la tension de la batterie et toutes les autres variables suivies par le bloc TSPMe. Pour créer un graphique comparatif entre PyBaMM et Simscape, exécutez la commande suivante :

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"])
Graphique comparant deux courbes de tension au fil du temps, montrant un alignement étroit avec une chute brutale vers la fin de la décharge.

Figure 11. Comparaison de la tension aux bornes entre le bloc Battery Single Particle et le PyBaMM SPMe.

Veuillez noter que l'erreur de validation varie en fonction du taux C appliqué et des conditions de température. Le bloc TSPMe par défaut de Simscape ne contient pas de dépendance du paramètre de concentration pour la diffusivité et la conductivité de l'électrolyte, qui peuvent être prises en compte dans le modèle PyBaMM. Par conséquent, il faut s'attendre à un écart plus important entre les valeurs de tension aux bornes pour des taux de charge/décharge plus élevés.

Passage à l'échelle du système à partir de la cellule de batterie

Pour étendre notre modèle Simscape de la cellule au système, utilisez la fonctionnalité Simscape Battery Pack Builder. Commencez par créer un objet cellule de batterie et liez-le au bloc Battery Single Particle :

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

Après avoir défini votre objet cellule de batterie, mettez à l'échelle votre modèle de cellule au niveau du module en exécutant la commande MATLAB suivante :

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

Vous pouvez augmenter la résolution du modèle en configurant la propriété ModelResolution à « Detailed ». Pour générer automatiquement le modèle de votre batterie, exécutez la commande suivante :

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

L'extrait de code ci-dessus aurait dû générer une bibliothèque de batterie avec votre bloc de modèle de module de batterie comme indiqué sur la figure 12.

Image d'un modèle de module de batterie dans le canevas Simulink généré avec la fonction buildBattery.

Figure 12. Modèle de module de batterie construit à l'aide du bloc Battery Single Particle.

Les paramètres nécessaires à l'exécution de ce nouveau bloc de modèle sont stockés dans le script nouvellement généré : Batteries_param.m. Pour lier les paramètres du module à l'ensemble de paramètres PyBaMM, exécutez la commande suivante :

Module1 = SimscapeParameterSet.getModuleElectrochemicalParameters(SimscapeParameterSet);

Grâce à ce nouveau bloc de modèle de batterie, vous pouvez désormais créer et exécuter une simulation de décharge constante de batterie dans l'environnement Simulink. De plus, vous pouvez utiliser BatterySimulationChart pour visualiser dynamiquement les principales variables de la batterie tout au long de votre simulation. Pour créer et exécuter la simulation, exécutez la commande suivante :

run("CreateAndRunBatterySimscapeModel.mlx")

Conclusion

Dans cet article, nous avons présenté trois workflows différents pour intégrer la capacité de modélisation de batteries PyBaMM dans MATLAB, Simulink et Simscape. Chaque workflow présente ses propres avantages et est mieux adapté à des activités spécifiques. Par exemple, l'intégration de PyBaMM avec Simulink est une bonne méthode pour réaliser un prototypage rapide et développer un système de gestion de batterie. L'importation des ensembles de paramètres PyBaMM dans Simscape est une bonne méthode pour créer des modèles physiques acausaux qui peuvent être mis à l'échelle efficacement et inclus dans une simulation électrique et thermique plus large. Le passage des modèles de cellules aux modèles de systèmes peut être réalisé efficacement grâce à la fonctionnalité Simscape Battery Pack Builder. Cette intégration contribue à améliorer les capacités natives de MATLAB et peut apporter une valeur ajoutée aux différents workflows de design et de développement de batteries utilisés dans l'industrie.

Travaux futurs

Les méthodes présentées dans cet article sont simples et s'appuient sur des fonctionnalités existantes. Ces méthodes peuvent être affinées et étendues pour inclure davantage de modèles électrochimiques PyBaMM, supporter d'autres ensembles de paramètres et ajouter une modélisation complexe au niveau système, entre autres améliorations.

Pour la suite, nous nous appuierons sur les workflows présentés ici en démontrant comment cette intégration peut supporter des activités pratiques de design et de vérification de batteries. Nous cherchons également à explorer d'autres méthodes pour établir une connectivité entre PyBaMM et MATLAB et à les présenter dans le contexte des avantages qu'elles apportent à l'application cible de la batterie.

Nous voyons des opportunités de mettre en avant : 

  • Le design et la vérification des packs avec des systèmes au niveau du module et du pack pour la prédiction de l'énergie utile et de la capacité de puissance dans des conditions thermiques réalistes
  • L’amélioration de la prédiction du vieillissement des systèmes de batteries et de la garantie grâce à la bibliothèque de modèles de dégradation des batteries de PyBaMM
  • Une utilisation simplifiée des ensembles de paramètres de PyBaMM pour une plus grande variété de blocs Simscape
  • La manière dont les modèles basés sur PyBaMM peuvent faciliter le développement de contrôleurs dans Simulink

Remerciements

Nous tenons à remercier tout particulièrement le professeur Daniel Auger de l'université de Cranfield pour sa collaboration, ses idées sur les axes de recherche futurs et les nombreuses discussions que nous avons eues sur les méthodes de connectivité entre MATLAB et PyBaMM et leurs applications aux systèmes de batteries.

Références

  • 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).

Publié en 2026


Produits utilisés : Simscape, Simscape Battery

À propos des auteurs

Sebastián Arias Alfaro

Sebastián Arias Alfaro fait partie de l’équipe de développement de Simscape Battery chez MathWorks, où il développe des modèles, des algorithmes et des workflows destinés à aider les clients des secteurs de l’électrification et du stockage de l’énergie. Sebastián possède plus de neuf ans d’expérience dans la modélisation des batteries, l’estimation de paramètres et le développement d’algorithmes. Il est titulaire d’un master en conception de procédés chimiques pour l’énergie de l’Université de Manchester et d’un diplôme d’ingénieur en génie chimique de l’Université du Costa Rica.

Chris Lim

Chris Lim est ingénieur au sein du groupe MathWorks Consulting Services. Il collabore principalement avec des clients grands comptes des secteurs de l’aérospatiale et de la défense sur un large éventail de sujets, notamment le développement logiciel, la modélisation à grande échelle, ainsi que la modélisation et la simulation de systèmes physiques. Chris est titulaire d’un DPhil de l’Oxford Thermofluids Institute de l’Université d’Oxford, où ses travaux portaient sur les stratégies de gestion thermique pour la Formule 1. Il est également titulaire d’un diplôme MEng avec mention très bien (first-class honours) en sciences de l’ingénieur de l’Université d’Oxford.

Xiangchun Zhang

Xiangchun Zhang est ingénieur d’applications chez MathWorks, spécialisé dans la modélisation des batteries et le développement d’algorithmes pour les systèmes de gestion de batterie (BMS, Battery Management System). Il a commencé ses recherches sur les batteries lithium-ion en 2005 dans le cadre de ses études doctorales, au cours desquelles il s’est intéressé à la modélisation multiéchelle des cellules lithium-ion, notamment aux aspects mécaniques, à la génération de chaleur et à la cinétique électrochimique. Au cours de plus de vingt années de carrière, il a contribué à des activités de R&D sur les batteries, tant dans le milieu universitaire que dans l’industrie, notamment au développement de batteries à électrolyte solide chez Dyson. Ses travaux de recherche sur les batteries ont été cités plusieurs milliers de fois. Xiangchun Zhang est titulaire d’une licence (BS) et d’un master (MS) en ingénierie de l’Université Tsinghua à Pékin, en Chine, ainsi que d’un doctorat (PhD) en génie mécanique de l’Université du Michigan à Ann Arbor.

Continuer votre exploration