化学反応をシミュレーションしてみよう
前回の調査
背景
前回では、リチウムバッテリーの簡単な化学式を調べてみた。
では、化学の世界の理論計算ではバッテリーの性能はどうなるの?温度特性は?エネルギー密度は?
計算してみよう
化学シミュレーションソフトの調査(私の化学の知識は高校化学レベルです)
Cantera は、化学反応速度論、熱力学、輸送プロセスに関連する問題を解決するためのオープンソースのツール スイートです。
こんなのとか。もちろん有料の凄いソフトはあるそうです。
私が使用したのは、PyBAMM (Python Battery Mathematical Modelling)
ではPythonから使えるようです。インストール
pip -m install pybamm
リチウムイオンバッテリーをシミュレーションするスクリプト
import pybamm
import numpy as np
import matplotlib.pyplot as plt
def lithium_ion(ondo):
# PyBAMMのロギングレベルを設定
pybamm.set_logging_level("INFO")
# 使用可能なパラメータセットを表示
available_parameter_sets = [set_name for set_name in dir(pybamm.parameter_sets) if not set_name.startswith("__")]
# print("Available parameter sets:", available_parameter_sets)
# リチウムイオンDFNモデルの読み込み
model = pybamm.lithium_ion.DFN()
# パラメータの設定(例として 'Chen2020' パラメータセットを使用)
param = pybamm.ParameterValues(values=pybamm.parameter_sets.Chen2020)
# 温度を設定(例:298.15 K = 25°C)
temperature = 273.15 + ondo
param.update({"Ambient temperature [K]": temperature})
# 公称容量を設定(例:3.0 Ah)
param.update({"Nominal cell capacity [A.h]": 3.0})
# 実験の設定
experiment = pybamm.Experiment(
[
("Rest for 3 hours",
"Charge at C/5 until 4.2 V",
"Hold at 4.2 V until 50 mA",
"Rest for 2 hours",
"Discharge at C/10 until 2.5 V"
)
] * 3, # 3回繰り返す
)
# シミュレーションの実行
sim = pybamm.Simulation(model, parameter_values=param, experiment=experiment, solver=pybamm.CasadiSolver())
solution = sim.solve()
# 結果のプロット
# sim.plot()
# 電池の重量を設定(例:45gのセルを6個、総重量270g)
battery_weight_grams = 270
battery_weight_kg = battery_weight_grams / 1000
# エネルギー密度を計算
time = solution["Time [s]"].entries
voltage = solution["Terminal voltage [V]"].entries
current = solution["Current [A]"].entries
# 放電エネルギーの計算
discharge_mask = current > 0
discharge_power = voltage[discharge_mask] * current[discharge_mask]
total_discharge_energy_wh = np.trapz(discharge_power, time[discharge_mask]) / 3600
# 平均放電エネルギーの計算
average_discharge_energy_wh = total_discharge_energy_wh / 3
# エネルギー密度の計算
energy_density_wh_per_kg = average_discharge_energy_wh / battery_weight_kg
return energy_density_wh_per_kg
# 複数の温度条件でエネルギー密度を計算
temperatures = [-40, -15, 0, 10, 25, 40, 70]
energy_densities = [lithium_ion(temp) for temp in temperatures]
# 結果を出力
for temp, energy_density in zip(temperatures, energy_densities):
print(f"Energy density at {temp}°C: {energy_density:.2f} Wh/kg")
# 線グラフの描画
plt.plot(temperatures, energy_densities, marker='o', linestyle='-', color='b') # 線グラフに変更
plt.xlabel('Temperature (°C)')
plt.ylabel('Energy Density (Wh/kg)')
plt.title('Energy Density at Different Temperatures')
plt.ylim(50, 120) # Y 軸の範囲を設定
plt.grid(True)
plt.show()
結果
エネルギー密度の温度依存性
注意
リチウムイオン電池のエネルギー密度は200~250Wh/kg 程度だそうです。スクリプトが間違えているか、モデルが古いのか?
わかりません。
所感
化学も機電のようにモデル計算の時代なんですね。
もっと凄いシミュレータをネットでいくらでも見ることができます。