技術情報

MathWorks インサイト

MATLAB から PyBaMM を実行する:バッテリー シミュレーション機能の拡張


著者:

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

この記事は10分で読めます

はじめに

バッテリーモデリングは、多くの産業分野においてバッテリー マネジメント システムを設計する上で極めて重要な活動です。バッテリーモデルは、リアルタイムの充電状態推定アルゴリズムの一部として、バッテリー制御ソフトウェアに組み込まれます。バッテリーモデルは、バッテリー制御戦略のラピッド プロトタイピングと開発、研究開発活動における設計感度の検討、およびバッテリー製品設計サイクル中の仮想設計と検証に使用されます。これらのタスクはすべて MATLAB®、Simulink®、Simscape™ を使用して実行できます。また、これらは仮想バッテリーテストのための強力な環境を提供し、制御ソフトウェアはシステムの他の部分と統合されています。

バッテリーモデリングの 6 つの側面 (設計、寿命、安全性、制御、特性評価、熱) を示す図。

図 1. バッテリーモデリングの用途。

PyBaMM は、要件に応じて複数の複雑さのレベルを持つバッテリーモデルのライブラリを提供する、主要なオープンソース ツールです。こうした劣化効果を組み込んだ詳細かつ高解像度の電気化学バッテリーモデルは、MATLAB スクリプトから直接実行することも、Simulink に組み込むこともできます。さらに、PyBaMM のパラメーターセットを Simscape Battery™ ブロックに直接インポートすることもできます。Simscape Battery™ ブロックは、コード生成、バッテリー パック モデルの自動作成、電気熱システムのモデリング、および完全な非因果モデリングワークフローをサポートしています。

この記事では、MATLAB から PyBaMM を直接実行する方法、PyBaMM のバッテリーモデルを Simulink にインポートする方法、および PyBaMM のバッテリーモデルのパラメーターを同等の Simscape Battery ブロックにインポートする方法について説明します。コンテンツに付属するファイルはダウンロード可能です。

PyBaMM と MATLAB 間の 3 つの統合方法を示す図: MATLAB から PyBaMM を直接実行する方法、コシミュレーション、および PyBaMM パラメーターセットを Simscape ブロックにインポートする方法。

図 2. PyBaMM と MATLAB の統合ワークフロー。

PyBaMM のインストール

MATLAB 内で PyBaMM を実行するには、まず MATLAB 内からアクセスできる Python 環境をセットアップする必要があります。(各 MATLAB リリースに対応する Python のバージョンを参照してください。)この例では、MATLAB R2025a と Python 3.11 を使用します。

PyBaMM を Python 環境にインストールするには、 PyBaMM のウェブサイトの手順に従ってください。

PyBaMM がインストールされた互換性のある Python 環境が整えば、MATLAB 内から PyBaMM シミュレーションを実行できます。お使いのコンピューターに複数の Python がインストールされている (または仮想環境を使用している) 場合は、MATLAB で使用する Python 実行ファイルを次のように指定してください。

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

Python 環境内で Python 実行ファイルへのパスを取得するには、Python コマンド プロンプトから次のコマンドを実行します。

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

MATLAB が使用している Python 環境に PyBaMM がインストールされているかどうかを確認するには、MATLAB コマンド ラインで次のコマンドを実行します。

tf = check_pybamm_install()

  tf = logical
     1

MATLAB が PyBaMM をインストール済みの Python 環境を使用していることを確認できたら、MATLAB 内から PyBaMM シミュレーションを実行する準備は完了です。

MATLAB 内で PyBaMM を実行する

MATLAB 内で PyBaMM 実験を実行する方法は、Python で実行する方法と似ています。ここでは PyBaMM のドキュメンテーションの例を使用しています。

まず、PyBaMM モジュールをインポートし、モデルとシミュレーション オブジェクトを設定します。次に、シミュレーションを実行して解を取得します (この場合は、90 秒間隔で 1 時間分)。

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

次に、solution オブジェクトから必要な変数を抽出します。solution データ辞書に変数 (この場合は時間と電圧) を格納してから、MATLAB で使用できる double 型に変換します。

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

x そして y 変数は MATLAB 配列となり、通常の MATLAB 構文を使用してプロットできるようになりました。

figure; hold on;
plot(t, v, "-");
plot(t, v, ".", "MarkerSize", 5);
grid on; xlabel("Time (s)"); ylabel("Voltage (V)");
バッテリー電圧が時間とともに徐々に低下し、サイクルの終わりに近づくにつれて急激に低下する様子を示す折れ線グラフ。

図 3. MATLAB でシミュレーションされた PyBaMM SPMe モデルによるバッテリー端子電圧。

Simulink 内での PyBaMM の実行

MATLAB R2025a 以降、Python Code ブロックを使用して Simulink で Python コードを実行できます。このブロックを使用すると、ネイティブの Python コードを記述して Simulink モデル内で実行できます。

Python Code ブロックを使用すると、モデル初期化時、モデル ステップ実行時、およびシミュレーション終了時に実行される Python コードを記述できます。Python コードのポートとパラメーターを定義することもできます。これにより、ブロックが Simulink 内の他のブロックと相互作用したり、Simulink キャンバス上の他のブロックと同様にブロックをパラメーター化したりできるようになります。

この例では、電流負荷を入力として PyBaMM シミュレーションの電圧応答を出力しつつ、セルモデルの初期充電状態を定義できるようにしています。

ポートとパラメーター

ポートとパラメーターを図 4 に示します。パラメーターは次のように定義されます。

  • current_in は入力であり、セルの現在の負荷を定義します。PyBaMM では、正の電流入力は放電を表します。
  • voltage_outこれは、セルの電圧応答を含む出力です。
  • StepSize は、PyBaMMソルバーがシミュレーションを進めるために使用する固定時間ステップを決定するパラメータです。
  • InitialStateOfCharge は、シミュレーション開始時の初期充電状態を設定するために使用されるパラメータです。
  • simulation は永続変数であり、このパラメータはシミュレーションのさまざまな段階にわたってメモリに保持されます。
Python Code ブロック マスクのポートとパラメーター セクションを表示するダイアログ ボックス。

図 4. Python Code ブロック マスク ダイアログの「ポートとパラメーター」セクション。

これらのポートとパラメーターのうち 4 つは、「double」データ型として定義されています。これらは自動的に Python の浮動小数点データ型に変換されます。simulationパラメーターは PyBaMM クラスであるため、PythonObject として定義されます。

初期化

[Initialize] タブには、Simulink シミュレーションの開始時に一度だけ実行されるコードが含まれています。ここで PyBaMM モデルを定義し、初期条件を設定します。

Python Code ブロック マスクの Initialize セクションを示すダイアログ ボックス。

図 5. Python Code ブロック マスク ダイアログの [Initialize] コード タブ。

ここでは、PyBaMM モデルをインポートし、使用するセルモデル (この場合は SPMe モデル) を定義します。PyBaMM Simulation オブジェクトを作成し、これを simulation 変数 (永続パラメータとして定義される) として格納します。次に、現在の関数を入力として設定し、simulation オブジェクトは、ユーザーが定義した初期充電状態を持つようにします。

アウトプット

[Output] タブでは、Simulink ソルバーの各ステップで実行されるコードを定義します。

Python Code ブロック マスクの Output セクションを表示するダイアログ ボックス。

図 6. Python Code ブロック マスク ダイアログの [Output] コード タブ。

この例では、現在の入力をcurrent_in ポートの最新の値で更新し、StepSize パラメーターで定義された値でシミュレーションをステップします。次に、PyBaMM ソリューションオブジェクトによって生成された結果辞書から端子電圧値を取得し、voltage_out ポートを通して最新の時系列値を返します。

Python Code ブロックのパラメーター化

上記の「ポートとパラメーター」のセクションでは、Python Code ブロックの 2 つのパラメーターを定義しました。これらはブロック ダイアログのパラメーターに表示されます (下記参照)。

Python Code ブロックのパラメーター ダイアログ。StepSize (0.1)、InitialStateOfCharge (0.5)、および Sample time (0.1) のフィールドがある。

図 7. ブロック ダイアログ編集後の Python Code ブロック マスク。

PyBaMM はシミュレーションに独自のソルバーを使用します。したがって、Simulink ソルバーのステップ時間と同期を保つことが重要です。PyBaMM 内では、この場合、0.1 秒の時間ステップを持つ固定ステップソルバーを使用しています。(したがって、StepSizeパラメーターを 0.1 とします)。

Python Code ブロックには独自のSample timeパラメータがあります。この場合も、0.1 に設定する必要があります。

シミュレーションの実行

PyBaMM シミュレーションのパラメーター設定が完了したら、通常どおりシミュレーションを実行できます。

Simulink キャンバス上の Python Code ブロックのレイアウト例。

図 8. Simulink キャンバス上の Python Code ブロック。

この例では、充電状態 50% のセルに、シミュレーション開始 5 秒後から 10 A の負荷をかけます。正の電流入力値はバッテリーの放電を引き起こします。その結果、図 9 に示すような電圧応答が得られます。

5 秒後に電圧が低下する一方、電流負荷はステップ状に上昇して 10 秒まで一定に保たれる様子を示す 2 つのグラフ。

図 9. シミュレーションによる電流入力と端子電圧出力の時系列データ。

これは、PyBaMM シミュレーションを Simulink で実行するために必要な最もシンプルな構成です。

Simscape ブロックへの PyBaMM パラメーターセットのインポート

PyBaMM は一般的なバッテリー化学向けのいくつかの事前定義されたパラメーターセットを提供しています。これは学術文献から得られたものです。PyBaMM 内では、これらのセットは ParameterSets 型のクラスオブジェクトとして定義されます。これらのパラメーターセットのいずれかを MATLAB Simscape ブロックで使用するには、まず「同等の」Simscape 電気化学モデルブロックを作成する必要があります。この例では、電解質付き Battery Single Particle モデル ブロック (TSPMe) で使用するパラメーターセットをインポートします。このブロックは Simscape Battery 内で利用できます。

さらに、次の機能を持つ MATLAB スクリプトまたはオブジェクト クラスが必要です。

  • TSPMe のパラメーターを保存する。
  • 標準の PyBaMM 規約から Simscape へのパラメーター変換を実行する。
  • Simscape ブロックを自動的にパラメーター化する。

この記事では、TSPMeParameterSet カスタム オブジェクトを提供します。これは TSPMe ブロックのパラメーター コンテナーとして機能し、次の PyBaMM パラメーターセットを Battery Single Particle Simscape ブロックにインポートできます: ["Chen2020","Marquis2019","OKane2022","Ai2020"]。このクラスは、他のパラメーターセットを使用したり、他のタイプのモデル (等価回路モデルや P2D モデルなど) をパラメーター化したりできるように拡張できます。パラメーターセットをインポートするには、まず MATLAB で必要なパラメーターセット名を定義します。

ParameterSetName = "OKane2022";

パラメーター コンテナー オブジェクトをインスタンス化して PyBaMM パラメーターセットをインポートするには、[コマンド ウィンドウ] から次のコマンドを実行します。

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.
初期電解質濃度をインポートしています...完了。

パラメーター コンテナー オブジェクトには、PyBaMM から指定されたパラメーターセットが格納されました。Simscape の Battery Single Particle ブロックを自動的にパラメーター化するには、[MATLAB コマンド ウィンドウ] で次のコマンドを実行します。

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

上記のコード スニペットにより、Simscape サンプル モデル内の Battery ブロックがパラメーター化されます。

負荷、プラント、および測定ブロックを含むバッテリーモデルの図。

図 10. パラメーター化された Battery Single Particle ブロック。

Simscape TSPMe 出力の検証

次に、PyBaMM と Simscape の両方でシミュレーションを実行し、出力されるバッテリー端子電圧を比較することで、Battery Single Particle ブロックのパラメーター設定を検証できます。まず、負荷電流と境界条件を定義します。

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

PyBaMM シミュレーション

これらの条件で PyBaMM シミュレーションを実行するには、まず PyBaMM パラメーターセットを作成して更新する必要があります。これを行うには、MATLAB コマンド ラインで次のコードを実行します。 

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

この PyBaMM パラメーターセットには、周囲熱伝達に関連するパラメーターも含まれているため、両方のシミュレーションに使用できます。Simscape シミュレーションで使用するためにこれらのパラメーターを抽出するには、MATLAB コマンド ラインで次のコードを実行します。

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

PyBaMM シミュレーションを実行するには、次のコードを実行します。

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

Simscape シミュレーション

Simscape で同じシミュレーションを実行するには、次のコードを実行します。

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

これまでと同様に、PyBaMM の solution オブジェクトから必要な変数を抽出します。solution データ辞書に変数 (この場合は時間と電圧) を格納してから、MATLAB で使用できる double 型に変換します。

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

Simscape out シミュレーション出力オブジェクトには、バッテリー電圧と、TSPMe ブロックによって追跡されるその他のすべての変数が含まれます。PyBaMM と Simscape の比較プロットを作成するには、次のコマンドを実行します。

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"])
時間経過に伴う 2 つの電圧曲線を比較したグラフ。放電終了付近で急激な低下が見られるものの、ほぼ一致している。

図 11. Battery Single Particle と PyBaMM SPMe の端子電圧比較。

検証誤差は、適用される C レートと温度条件によって変動する点にご注意ください。Simscape のデフォルトの TSPMe ブロックには、拡散率と電解質伝導率の濃度パラメーター依存性が含まれていませんが、これは PyBaMM モデルで考慮できます。したがって、C レートが高くなるほど、端子電圧値の差は大きくなることが予想されます。

バッテリー セルからシステムへのスケールアップ

Simscape モデルをセルからシステムへと拡張するには、Simscape バッテリー パック ビルダー機能を使用します。まず、バッテリー セル オブジェクトを作成し、Battery Single Particle モデルブロックにリンクします。

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

バッテリー セル オブジェクトを定義したら、次の MATLAB コマンドを実行してセルモデルをモジュールレベルに拡張します。

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

モデルの解像度を上げるには、ModelResolutionプロパティを「詳細」に設定します。バッテリーモデルを自動的に生成するには、次のコマンドを実行します。

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

上記のコードスニペットにより、図 12 に示すように、バッテリー モジュール モデル ブロックを含むバッテリーライブラリが生成されます。

buildBattery 関数で生成された Simulink キャンバス上のバッテリー モジュール モデルの画像。

図 12. Battery Single Particle ブロックを使用して構築されたバッテリー モジュール モデル。

この新しいモデルブロックを実行するために必要なパラメーターは、新しく生成されたスクリプトに格納されています。Batteries_param.m.モジュール パラメーターを PyBaMM パラメーターセットにリンクするには、次のコマンドを実行します。

Module1 = SimscapeParameterSet.getModuleElectrochemicalParameters(SimscapeParameterSet);

新しく作成されたこのバッテリーモデル ブロックを使用すると、Simulink 環境でバッテリー定常放電シミュレーションを作成・実行できます。さらに、BatterySimulationChart を使用して、シミュレーション全体を通して、主要なバッテリー変数を動的に視覚化します。シミュレーションを作成して実行するには、次のコマンドを実行します。

run("CreateAndRunBatterySimscapeModel.mlx")

まとめ

この記事では、PyBaMM のバッテリーモデリング機能を MATLAB、Simulink、および Simscape に統合するための 3 つの異なるワークフローを紹介しました。それぞれのワークフローには独自の利点があり、特定の作業に適しています。たとえば、PyBaMM を Simulink と統合することは、迅速なプロトタイピングやバッテリー管理システム開発に有効な方法です。PyBaMM のパラメーターセットを Simscape にインポートすることは、効率的にスケールアップでき、より広範な電気・熱シミュレーションに組み込める非因果的な物理モデルを作成するための有効な方法です。Simscape バッテリー パック ビルダー機能を使用すると、セルモデルからシステム モデルへのスケールアップを効率的に行えます。この統合により、MATLAB のネイティブ機能が強化され、業界で使用されているさまざまなバッテリー設計・開発ワークフローに付加価値をもたらすことができます。

今後の取り組み

本稿で紹介した方法はシンプルで、既存の機能を利用しています。これらの手法は、より多くの PyBaMM 電気化学モデルの追加、他のパラメーターセットのサポート、複雑なシステムレベル モデリングの追加など、さまざまな機能強化に向けて改良・拡張できます。

今後は、ここで紹介したワークフローを基に、この統合が実践的なバッテリー設計・検証作業をどのようにサポートできるかを実証していきます。また、PyBaMM と MATLAB 間の接続を確立するためのその他の方法も検討し、対象となるバッテリー アプリケーションにもたらす利点という観点から紹介することを目指しています。

以下のような機会があると考えています。 

  • モジュールレベルおよびパックレベルのシステムを用いたパックの設計と検証による、現実的な熱条件下での有効エネルギーおよび電力能力の予測
  • PyBaMM のバッテリー劣化モデル ライブラリを活用した、バッテリーシステムの経年劣化予測および保証期間予測の強化
  • PyBaMM のパラメーターセットの使用方法を合理化し、より幅広い種類の Simscape ブロックに対応
  • PyBaMM ベースのモデルによる Simulink でのコントローラー開発サポートの可能性

謝辞

クランフィールド大学の Daniel Auger 教授には、ご協力、今後の取り組み分野に関するご意見、そしてバッテリーシステムへの応用を念頭に置いた MATLAB と PyBaMM 間の接続方法に関する数々の議論に深く感謝いたします。

参照文献

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

公開年 2026


使用製品: Simscape, Simscape Battery

著者について

Sebastián Arias Alfaro

Sebastián Arias Alfaro は、MathWorks の Simscape Battery 開発チームに所属し、電動化およびエネルギー貯蔵分野のお客様を支援するモデル、アルゴリズム、ワークフローを開発しています。バッテリー モデリング、パラメーター推定、アルゴリズム開発において 9 年以上の経験を有しています。マンチェスター大学でエネルギー向け化学プロセス設計の修士号を、コスタリカ大学で化学工学の学位を取得しています。

Chris Lim

Chris Lim は、MathWorks コンサルティング サービス グループのエンジニアです。主に航空宇宙・防衛業界の企業のお客様とともに、ソフトウェア開発、大規模モデリング、物理システムのモデリングとシミュレーションなど、幅広いテーマに取り組んでいます。オックスフォード大学 Oxford Thermofluids Institute にてフォーミュラ 1 の熱管理戦略に関する研究で博士号 (DPhil) を取得したほか、同大学でエンジニアリング サイエンスの修士号 (MEng) を優等 (First-Class) で取得しています。

Xiangchun Zhang

Xiangchun Zhang は、MathWorks のアプリケーション エンジニアであり、バッテリー モデリングおよびバッテリー マネジメント システム アルゴリズム開発を専門としています。2005 年に博士課程でリチウム イオン バッテリーの研究を開始し、力学、発熱、電気化学反応速度論を含むリチウム イオン セルのマルチスケール モデリングに注力しました。20 年以上にわたり、Dyson での全固体バッテリー開発を含め、学術・産業両分野のバッテリー研究開発に貢献してきました。バッテリーに関する研究は数千回にわたり引用されています。中国・北京の清華大学で工学の学士号と修士号を、ミシガン大学アナーバー校で機械工学の博士号を取得しています。

さらに詳しく