概要
- バッテリーモデリングは、業界を問わず、設計、制御、仮想検証においてますます不可欠なものとなっています。
- MATLAB、Simulink、Simscape は、動的なバッテリーおよびシステム シミュレーションのための統合環境を提供します。
- PyBaMM は、MATLAB、Simulink、Simscape で実行できる高度な電気化学モデルとパラメーターセットを追加します。
技術情報
このページは機械翻訳を使用して翻訳されました。
翻訳品質のアンケートに 1 分ご協力ください。
MathWorks インサイト
著者:
この記事は10分で読めます
バッテリーモデリングは、多くの産業分野においてバッテリー マネジメント システムを設計する上で極めて重要な活動です。バッテリーモデルは、リアルタイムの充電状態推定アルゴリズムの一部として、バッテリー制御ソフトウェアに組み込まれます。バッテリーモデルは、バッテリー制御戦略のラピッド プロトタイピングと開発、研究開発活動における設計感度の検討、およびバッテリー製品設計サイクル中の仮想設計と検証に使用されます。これらのタスクはすべて MATLAB®、Simulink®、Simscape™ を使用して実行できます。また、これらは仮想バッテリーテストのための強力な環境を提供し、制御ソフトウェアはシステムの他の部分と統合されています。
図 1. バッテリーモデリングの用途。
PyBaMM は、要件に応じて複数の複雑さのレベルを持つバッテリーモデルのライブラリを提供する、主要なオープンソース ツールです。こうした劣化効果を組み込んだ詳細かつ高解像度の電気化学バッテリーモデルは、MATLAB スクリプトから直接実行することも、Simulink に組み込むこともできます。さらに、PyBaMM のパラメーターセットを Simscape Battery™ ブロックに直接インポートすることもできます。Simscape Battery™ ブロックは、コード生成、バッテリー パック モデルの自動作成、電気熱システムのモデリング、および完全な非因果モデリングワークフローをサポートしています。
この記事では、MATLAB から PyBaMM を直接実行する方法、PyBaMM のバッテリーモデルを Simulink にインポートする方法、および PyBaMM のバッテリーモデルのパラメーターを同等の Simscape Battery ブロックにインポートする方法について説明します。コンテンツに付属するファイルはダウンロード可能です。
図 2. PyBaMM と MATLAB の統合ワークフロー。
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 実験を実行する方法は、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 モデルによるバッテリー端子電圧。
MATLAB R2025a 以降、Python Code ブロックを使用して Simulink で Python コードを実行できます。このブロックを使用すると、ネイティブの Python コードを記述して Simulink モデル内で実行できます。
Python Code ブロックを使用すると、モデル初期化時、モデル ステップ実行時、およびシミュレーション終了時に実行される Python コードを記述できます。Python コードのポートとパラメーターを定義することもできます。これにより、ブロックが Simulink 内の他のブロックと相互作用したり、Simulink キャンバス上の他のブロックと同様にブロックをパラメーター化したりできるようになります。
この例では、電流負荷を入力として PyBaMM シミュレーションの電圧応答を出力しつつ、セルモデルの初期充電状態を定義できるようにしています。
ポートとパラメーターを図 4 に示します。パラメーターは次のように定義されます。
図 4. Python Code ブロック マスク ダイアログの「ポートとパラメーター」セクション。
これらのポートとパラメーターのうち 4 つは、「double」データ型として定義されています。これらは自動的に Python の浮動小数点データ型に変換されます。simulationパラメーターは PyBaMM クラスであるため、PythonObject として定義されます。
[Initialize] タブには、Simulink シミュレーションの開始時に一度だけ実行されるコードが含まれています。ここで PyBaMM モデルを定義し、初期条件を設定します。
図 5. Python Code ブロック マスク ダイアログの [Initialize] コード タブ。
ここでは、PyBaMM モデルをインポートし、使用するセルモデル (この場合は SPMe モデル) を定義します。PyBaMM Simulation オブジェクトを作成し、これを simulation 変数 (永続パラメータとして定義される) として格納します。次に、現在の関数を入力として設定し、simulation オブジェクトは、ユーザーが定義した初期充電状態を持つようにします。
[Output] タブでは、Simulink ソルバーの各ステップで実行されるコードを定義します。
図 6. Python Code ブロック マスク ダイアログの [Output] コード タブ。
この例では、現在の入力をcurrent_in ポートの最新の値で更新し、StepSize パラメーターで定義された値でシミュレーションをステップします。次に、PyBaMM ソリューションオブジェクトによって生成された結果辞書から端子電圧値を取得し、voltage_out ポートを通して最新の時系列値を返します。
上記の「ポートとパラメーター」のセクションでは、Python Code ブロックの 2 つのパラメーターを定義しました。これらはブロック ダイアログのパラメーターに表示されます (下記参照)。
図 7. ブロック ダイアログ編集後の Python Code ブロック マスク。
PyBaMM はシミュレーションに独自のソルバーを使用します。したがって、Simulink ソルバーのステップ時間と同期を保つことが重要です。PyBaMM 内では、この場合、0.1 秒の時間ステップを持つ固定ステップソルバーを使用しています。(したがって、StepSizeパラメーターを 0.1 とします)。
Python Code ブロックには独自のSample timeパラメータがあります。この場合も、0.1 に設定する必要があります。
PyBaMM シミュレーションのパラメーター設定が完了したら、通常どおりシミュレーションを実行できます。
図 8. Simulink キャンバス上の Python Code ブロック。
この例では、充電状態 50% のセルに、シミュレーション開始 5 秒後から 10 A の負荷をかけます。正の電流入力値はバッテリーの放電を引き起こします。その結果、図 9 に示すような電圧応答が得られます。
図 9. シミュレーションによる電流入力と端子電圧出力の時系列データ。
これは、PyBaMM シミュレーションを Simulink で実行するために必要な最もシンプルな構成です。
PyBaMM は一般的なバッテリー化学向けのいくつかの事前定義されたパラメーターセットを提供しています。これは学術文献から得られたものです。PyBaMM 内では、これらのセットは ParameterSets 型のクラスオブジェクトとして定義されます。これらのパラメーターセットのいずれかを MATLAB Simscape ブロックで使用するには、まず「同等の」Simscape 電気化学モデルブロックを作成する必要があります。この例では、電解質付き Battery Single Particle モデル ブロック (TSPMe) で使用するパラメーターセットをインポートします。このブロックは Simscape Battery 内で利用できます。
さらに、次の機能を持つ MATLAB スクリプトまたはオブジェクト クラスが必要です。
この記事では、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 ブロック。
次に、PyBaMM と Simscape の両方でシミュレーションを実行し、出力されるバッテリー端子電圧を比較することで、Battery Single Particle ブロックのパラメーター設定を検証できます。まず、負荷電流と境界条件を定義します。
BatteryCurrent = 2.5; % A AmbientTemperature = 298.15; % K
これらの条件で 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 で同じシミュレーションを実行するには、次のコードを実行します。
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"])
図 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 に示すように、バッテリー モジュール モデル ブロックを含むバッテリーライブラリが生成されます。
図 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 間の接続を確立するためのその他の方法も検討し、対象となるバッテリー アプリケーションにもたらす利点という観点から紹介することを目指しています。
以下のような機会があると考えています。
クランフィールド大学の 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
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
ヨーロッパ