0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AIは製造業を加速できるか?】最適な電池のパラメーターを探索する実験

0
Last updated at Posted at 2026-07-15

この記事は、電池のパラメーター調整をプログラミングで行う記事ですが、肝心の著者に電池の知識がほぼないので、全般的にAIと推敲して書きました。
なので、間違いなどあったら、教えていただけると嬉しいです。

はじめに:半導体すらAIが最適化する時代に、電池の最適化もAIでできないか?

突然ですが、2026年7月現在に世界で一番大きい会社がどこかご存知でしょうか?
そう。それは NVIDIA です。

かつてはゲームで使われるGPUを提供していた一介の半導体企業が、今やAI時代のすごいAIを支えるインフラを提供する会社にまでなったのは有名な話です。
ただ、その技術のどこがすごいかはあまり語られることは多くないです。

自分もそこまで半導体に詳しいわけではないですが、その秘密の1つを想像できます。
それは以下の記事のように、「NVIDIAの回路生成はAIで最適化されている」からではないかと思うのです。

つまり、大量の回路をAIに学習させ、「良い回路が存在しそうな空間」を作り、その空間上を勾配法で最適化する 手法です。


これを読んだ当時はそんなものかー、としか自分は思いませんでした。
ただ最近のフィジカルAIの流れで、AIを考え直したところ、半導体ではない製造業も全般的にこの考えを組み入れることができるのではないかと考えました。

つまり、半導体回路以外の製造業でも、製造例を大量に生成できれば、いい感じな製造例を作れるのではないかと思ったのです

では、何を対象にすればいいか?

その時に見つけたのが、電池でした。
電池には、PyBaMMというリチウムイオン電池などの電気化学シミュレーションをPythonで行うOSSがあります。
独自の電池インタプリタ言語を作り、このPyBaMMを使って、何かしらの統計を行えば、そこそこいいパラメーターの電池をシミュレーションできる。そう思いCodexと一緒に開発した結果が以下

と、100回シミュレーションしてできた電池の結果と性能が以下です。

※ 残念ながらIT畑なので、電池の知識を自分は全く持っていなく検証できないのですが...バグがあったらすみません!

シミュレートしたいい感じの電池

電池「Optunaセル0085」を定義する。

モデルはDFN。
基準パラメータはOKane2022。

正極:
  厚さは96.844um。
  空隙率は0.4048。
  粒子半径は4.143um。
  活物質体積分率は0.6456。
  反応速度倍率は2。

負極:
  厚さは122.844um。
  空隙率は0.3028。
  粒子半径は3.941um。
  活物質体積分率は0.6634。
  反応速度倍率は2。

セパレータ:
  厚さは16.677um。
  空隙率は0.5273。

熱:
  モデルは集中定数。
  周囲温度は25C。
  初期温度は25C。

劣化:
  SEIは溶媒拡散律速。
  リチウム析出は不可逆。

実験:
  1Cで4.2Vまで充電する。
  4.2Vで電流がC/20になるまで保持する。
  1時間休止する。
  1Cで2.5Vまで放電する。
  これを1回繰り返す。

電池の性能

  • シミュレーションは正常に放電終了している
  • リチウム析出は発生していない
  • SEIはわずかに成長している
  • 温度上昇は約9.6℃
  • 電解液濃度の偏りは比較的小さい
  • 負極の過電圧の方が大きい
  • 正極・負極はどちらも深く利用されている
性能のJSONの元データ(一部抜粋)
{
  "csv": "build/search/optuna/trial_0085/result.csv",
  "config": {
    "min_voltage": 2.5,
    "max_voltage": 4.2,
    "max_temperature_c": 80.0,
    "expected_final_time_s": null,
    "min_completion_ratio": 0.999,
    "min_slope_dt_s": 0.001,
    "voltage_violation_weight": 1000.0,
    "temperature_violation_weight": 1000.0,
    "lithium_plating_weight": 10.0,
    "lithium_plating_growth_weight": 10.0,
    "sei_growth_weight": 1000000000.0,
    "heat_weight": 0.0001,
    "overpotential_weight": 1.0,
    "early_stop_weight": 10000.0,
    "nonfinite_weight": 10000.0
  },
  "columns": [
    "time_s",
    "negative_solid_lithium_concentration",
    "positive_solid_lithium_concentration",
    "electrolyte_concentration",
    "negative_overpotential",
    "positive_overpotential",
    "terminal_voltage",
    "current",
    "capacity",
    "energy",
    "heat_generation",
    "temperature_k",
    "temperature_c",
    "lithium_plating",
    "sei_growth"
  ],
  "missing_optional_columns": [
    "stress"
  ],
  "rows": 2512,
  "time": {
    "start_s": 0.0,
    "final_s": 8229.73565887341,
    "duration_s": 8229.73565887341,
    "expected_final_time_s": 8229.73565887341,
    "completion_ratio": 1.0,
    "completed": true,
    "monotonic": true
  },
  "voltage": {
    "unit": "V",
    "initial": 4.2,
    "final": 2.4999999999995643,
    "min": 2.4999999999995643,
    "max": 4.200000000000003,
    "max_upper_violation": 2.6645352591003757e-15,
    "max_lower_violation": 4.3565151486291143e-13,
    "max_violation": 4.3565151486291143e-13,
    "violation_count": 25,
    "violation_time_s": 48.647500971234706,
    "violation_area_v_s": 8.47245685033218e-14,
    "max_abs_slope_v_per_s": 0.006793585609944318,
    "min_slope_dt_s": 0.001
  },
  "negative_solid_lithium_concentration": {
    "unit": "mol.m-3",
    "initial": 29866.0,
    "final": 1412.6929364589696,
    "min": 1412.6929364589696,
    "max": 29892.27764906724,
    "mean": 16568.776338354233,
    "integral": 180201344.44701234,
    "positive_delta_sum": 26.277649067240418,
    "max_abs_slope_per_s": 6.294545918091402,
    "min_slope_dt_s": 0.001
  },
  "positive_solid_lithium_concentration": {
    "unit": "mol.m-3",
    "initial": 17038.0,
    "final": 52537.09930154727,
    "min": 16989.11841987764,
    "max": 52537.09930154727,
    "mean": 32930.70064696013,
    "integral": 217950011.96130687,
    "positive_delta_sum": 35547.98088166963,
    "max_abs_slope_per_s": 8.1833788897901,
    "min_slope_dt_s": 0.001
  },
  "electrolyte_concentration": {
    "unit": "mol.m-3",
    "initial": 1000.0,
    "final": 962.7596217095256,
    "min": 947.9073735515692,
    "max": 1001.3872594515336,
    "mean": 965.4327269533792,
    "integral": 8060280.892739437,
    "positive_delta_sum": 51.17597366883899,
    "max_abs_slope_per_s": 0.36761716228551833,
    "min_slope_dt_s": 0.001
  },
  // ... 中略,
  "score": -2.2305888354419583
}

この記事では、どのようにこの電池のシミュレーションを作ったかを解説していきます。

電池最適化の悩み(想像)

電池設計は、非常に多くの設計パラメータを持っています。

例えば、

  • 正極の厚さ
  • 負極の厚さ
  • 空隙率
  • 粒子径
  • 活物質体積分率
  • セパレータ厚さ
  • 電解液特性
  • 反応速度
  • 劣化モデル

など、数十〜数百ものパラメータが存在します。しかも、それぞれが独立ではありません。

例えば

  • 容量を増やそうとすると温度が上がる
  • 急速充電するとリチウム析出が起こる
  • 劣化を減らすと出力が落ちる

など、多くのトレードオフがあります。

つまり、
「良い電池」を作ることは、多目的最適化問題そのものなのです。
もちろん実際のメーカーでは、豊富な知見や実験データを用いて設計しているはずですが、外部の人間から見ると、

「この探索をAIで自動化できないのだろうか?」

という疑問が湧きました。

幸いにも、電池には PyBaMM という非常に優れた電気化学シミュレータがあります。

もし

電池パラメータ → シミュレーション → 性能評価

を高速に回せるのであれば、
AIによる設計探索を試す土台は十分にあります。

そこで私は、電池をDSL(ドメイン固有言語)で表現し、PyBaMMを使って大量にシミュレーションを実行する仕組みを作ることにしました。

実際の仕組みの説明

簡単にまとめると以下の流れになります。

「25Cの標準試験条件で評価する、NMC/グラファイト系リチウムイオンセルの電極設計」における、
電池の構造を日本語DSLで記述し、そのDSLをPyBaMMへ変換してシミュレーションし、Optunaで最適化します。
最終的には、

DSL
 ↓
PyBaMM
 ↓
CSV
 ↓
評価
 ↓
Optuna
 ↓
新しいDSL

というループを回し、人間が電池設計を試行錯誤する代わりにAIが設計を探索します。

なぜDSLなのか

通常のPyBaMMではPythonコードを書きます。
例えば

parameter_values.update({
    "Positive electrode thickness [m]": ...
})

のようになります。
しかしこれでは

  • 人間が読みにくい
  • LLMが編集しづらい
  • 設計意図が残らない

そこで日本語DSLを作りました。
例えば

電池「試作セル」を定義する。

モデルはSPMe。
基準パラメータはOKane2022。

正極:
  厚さは100um。
  空隙率は0.35。
  粒子半径は5um。

負極:
  厚さは120um。
  空隙率は0.30。
  粒子半径は4um。

電池設計そのものを文章として表現できます。
日本人なら、これの方がだいぶ読みやすいのではないでしょうか?

DSLからPyBaMMへ

PeggyでDSLを解析し、

DSL
    ↓
AST
    ↓
IR(JSON)
    ↓
PyBaMM ParameterValues

へ変換しています。
つまりDSLは単なるテキストではなく、構造化データ へ落としてからPyBaMMへ渡しています。

シミュレーションと評価

PyBaMMを実行すると

time
voltage
current
temperature
SEI
Lithium plating
...

などをCSVとして取得します。

CSVの最後だけを見るのではなく、
例えば

放電容量
エネルギー
最大温度
電圧違反
SEI成長
リチウム析出
NaN
シミュレーション失敗

などを総合してスコア化しています。

score =
容量
− 温度ペナルティ
− SEIペナルティ
− Lithium platingペナルティ
− Failureペナルティ
など

この評価関数をOptunaへ渡します。

Optunaによる探索

Optunaは

正極厚さ
正極空隙率
負極厚さ
...

を変更しながら

DSL生成
 ↓
PyBaMM
 ↓
CSV
 ↓
評価

を何百回も繰り返します。
その中で一番scoreが高いものを抽出したのが、冒頭に書いた電池の結果です。

さらに将来は強化学習も組み合わせてみたい

現状では、DSLのパラメータ探索にはOptunaを利用しています。
Optunaは非常に優秀ですが、

DSL
↓
PyBaMM
↓
評価

を独立した試行として扱います。
一方で、人間の設計者はもう少し違うことをしています。
例えば

「負極を少し厚くしたら容量が増えた。
でも温度も上がってしまった。
それなら次は空隙率を少しだけ調整してみよう。」

というように、前回の結果を見ながら次の設計を考えます。
このような「試行錯誤そのもの」を学習させるには、強化学習も面白いのではないかと考えています。
例えば、

現在のDSL
        ↓
LLMまたはRLエージェント
        ↓
DSLを少し変更
        ↓
PyBaMM
        ↓
性能評価
        ↓
Reward

というループです。

Rewardには

  • 放電容量
  • 発熱
  • SEI成長
  • リチウム析出
  • シミュレーション成功率

などを組み合わせたスコアを利用できます。

するとAIは「どのパラメータをどの方向へ変更すると性能が改善しやすいのか」という設計方針そのものを学習できる可能性があります。

もちろん、これはまだアイデア段階です。

実際には状態空間や行動空間の設計、サンプル効率など、多くの課題があります。
それでも、

DSL
↓
PyBaMM
↓
Reward

という枠組みは強化学習と非常に相性が良く、今後試してみたいテーマの一つです。

LLMと強化学習の組み合わせも面白そう

LLMはDSL全体を書き換えるような大きな設計変更が得意です。
一方、強化学習は

正極厚さを+2%
負極粒径を-5%
空隙率を+0.01

といった細かな調整を繰り返すことが得意です。
そのため、

LLM
↓
大まかな電池設計
↓
RL
↓
細かなパラメータ調整
↓
PyBaMM
↓
評価
↓
Reward

という構成も考えています。
これはまだ完全に構想段階ですが、「AIが電池を設計する」という世界を実現する上では、このような生成AIと強化学習を組み合わせたアプローチも面白いのではないかと思っています。

最後に

ここまで読んでくださり、ありがとうございました!
皆様も、ご自身の興味のある分野で、AI加速を進めていけていただければ幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?