見出し画像

化学反応をシミュレーションしてみよう

前回の調査

背景

前回では、リチウムバッテリーの簡単な化学式を調べてみた。
では、化学の世界の理論計算ではバッテリーの性能はどうなるの?温度特性は?エネルギー密度は?

計算してみよう

化学シミュレーションソフトの調査(私の化学の知識は高校化学レベルです)

Cantera は、化学反応速度論、熱力学、輸送プロセスに関連する問題を解決するためのオープンソースのツール スイートです。
こんなのとか。もちろん有料の凄いソフトはあるそうです。

私が使用したのは、PyBAMM (Python Battery Mathematical Modelling)
ではPythonから使えるようです。インストール

pip -m install pybamm

リチウムイオンバッテリーをシミュレーションするスクリプト

リチウムイオンバッテリーの化学反応や性能をシミュレーションすることができます。特に、PyBAMMはリチウムバッテリーのモデリングに特化しており、物理化学的な解析を行うための豊富な機能が備わっています。どのソフトウェアを選ぶかは、シミュレーションの目的や必要な機能に応じて決定すると良いでしょう。

ChatGPT
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()

結果

Energy density at -40°C: 106.93 Wh/kg
Energy density at -15°C: 105.00 Wh/kg
Energy density at 0°C: 105.00 Wh/kg
Energy density at 10°C: 105.00 Wh/kg
Energy density at 25°C: 105.01 Wh/kg
Energy density at 40°C: 105.01 Wh/kg
Energy density at 70°C: 105.03 Wh/kg

エネルギー密度の温度依存性

注意
リチウムイオン電池のエネルギー密度は200~250Wh/kg 程度だそうです。スクリプトが間違えているか、モデルが古いのか?
わかりません。

所感

化学も機電のようにモデル計算の時代なんですね。
もっと凄いシミュレータをネットでいくらでも見ることができます。

いいなと思ったら応援しよう!