フェーズ2単粒子モデル(SPM)の導出と実装
フェーズ1で組み上げた DFN モデルは、5 本の偏微分方程式が絡み合う大きな系でした。 この章では、DFN に 3 つの近似を入れて得られる最小の電池モデル 「単粒子モデル(Single Particle Model, SPM)」を導出します。 SPM は「各電極を代表粒子 1 個で表す」という大胆な簡約ですが、 低レートでは驚くほど良く実測を再現し、しかも球の拡散方程式 2 本と代数式だけで書けるため、 手を動かして電池モデルの数値計算を学ぶのに最適な題材です。 章の後半では、ブラウザ上で動く SPM シミュレータと、 そのまま Jupyter でも動く Python 実装を作ります。
2.1 SPM の仮定 — 何を無視するのか
DFN モデル(フェーズ1)は、セル厚み方向の位置 $x$ [m] ごとに 粒子を置き、電解液の濃度 $c_e(x,t)$ [mol/m³] と電位 $\phi_e(x,t)$ [V]、 固相電位 $\phi_s(x,t)$ [V]、界面電流密度 $j(x,t)$ [A/m²] をすべて解きました。 SPM はこのうち「電解液側の物理」と「電極内の位置依存性」をまとめて捨てます。 まず、何を仮定するのかを明示的に並べます。
仮定と近似(SPM の 3 仮定)
- (i) 電解液の濃度・電位変化を無視する。 塩濃度は初期値のまま一定 $c_e(x,t) = c_{e0} = 1000$ mol/m³ とし、 液相電位の勾配をゼロ $\partial \phi_e/\partial x = 0$ とみなす (つまり $\phi_e$ は場所によらない定数。電位の基準に取れる)。
- (ii) 反応電流密度 $j$ は電極内で一様とする。 負極内のどの粒子も同じ $j^-$、正極内のどの粒子も同じ $j^+$ で反応する。 $j$ の $x$ 依存性を消す仮定であり、これは (i) と固相の高い電子伝導度から導かれる (§2.2 で確認)。
- (iii) 各電極を代表粒子 1 個で表す。 (i)(ii) が成り立つなら、電極内のすべての粒子は同じ境界条件・同じ初期条件で 同じ拡散方程式に従うから、解はどの粒子でも同一である。 よって電極 1 本につき粒子 1 個だけ解けばよい。これが「単粒子」の由来である。
それぞれの仮定が「いつ妥当か」を、LG M50 セル(Chen et al. 2020、
js/params.js の値)で定量的に見積もっておきます。
ここで使う実効物性は Bruggeman 補正
$\kappa^{\mathrm{eff}} = \kappa\,\varepsilon_e^{1.5}$,
$D_e^{\mathrm{eff}} = D_e\,\varepsilon_e^{1.5}$
です($\kappa$ [S/m]:液相イオン伝導率、$D_e$ [m²/s]:電解液拡散係数、
$\varepsilon_e$ [−]:空隙率)。
仮定 (i) の目安 — 低 C レート・薄い電極
電解液に濃度勾配ができる速さと大きさを見積もります。 セル全厚 $L = L_n + L_s + L_p = 172.8$ μm、 $D_e(c_{e0}) = 1.77\times10^{-10}$ m²/s、セパレータの $D_e^{\mathrm{eff}} \approx 5.7\times10^{-11}$ m²/s を使うと、 電解液が定常濃度分布に達する時定数は
$$ \tau_e \sim \frac{L^2}{D_e^{\mathrm{eff}}} = \frac{(172.8\times10^{-6}\ \mathrm{m})^2}{5.7\times10^{-11}\ \mathrm{m^2/s}} \approx 520\ \mathrm{s} \approx 9\ \text{分} $$つまり放電開始から 10 分ほどで電解液には定常的な濃度勾配が立ちます。 その大きさは、供給すべき Li⁺ 流束と拡散のつり合いから (輸率 $t_+^0 = 0.259$ [−]、$F = 96485$ C/mol、印加電流密度 $I$ [A/m²]、放電を正)
$$ \Delta c_e \sim \frac{(1 - t_+^0)\, I\, L}{2 F D_e^{\mathrm{eff}}} \approx 570 \ \mathrm{mol/m^3} \times \frac{I}{I_{1C}} $$と見積もれます($I_{1C} = 48.7$ A/m² は 1C 相当の電流密度)。 1C では $\Delta c_e$ が初期濃度 1000 mol/m³ の半分を超えるオーダーであり、 仮定 (i) が安心して使えるのは目安として 0.5C 以下、厳密には 0.2C 程度までです。 また $\Delta c_e \propto L$ なので、電極が薄いセル(高出力設計)ほど SPM は良く当たります。 液相電位の方は、1C・$\kappa^{\mathrm{eff}} \approx 0.12$–$0.31$ S/m で 電位降下が電極あたり 10–18 mV 程度(後述)。 端子電圧 3–4 V に対しては小さいものの、無視できるのはやはり低レートに限られます。
仮定 (ii) の目安 — 電位降下が反応の「感度」より小さいこと
$j(x)$ が一様になるのは、電極内で $\phi_s - \phi_e$ がほぼ一様なときです (界面反応は $\eta = \phi_s - \phi_e - U$ で駆動されるため)。 一様 $j$ のときの液相電位降下は電極厚さ $L^\pm$ にわたって
$$ \Delta\phi_e \approx \frac{I L^\pm}{2\kappa^{\mathrm{eff}}} = \begin{cases} 17.5\ \mathrm{mV} & \text{(負極、1C)}\\[2pt] 10.0\ \mathrm{mV} & \text{(正極、1C)} \end{cases} $$固相側は負極では $\sigma^{\mathrm{eff}} = 140$ S/m と大きく降下は 0.01 mV 程度で完全に無視できますが、 正極は $\sigma^{\mathrm{eff}} = 0.098$ S/m しかなく約 19 mV(1C)になります。 これらを反応の感度スケール $RT/F = 25.7$ mV(室温)と比べると、 1C ですでに同程度です。 つまり厳密には 1C で $j$ の非一様性が現れ始め、 それ以下のレート(目安 0.5C 以下)なら一様とみなせます。 伝導度が高い(または電極が薄い)ほどこの条件は緩みます。
仮定 (iii) は (i)(ii) の帰結
(i)(ii) が成り立てば、電極内の全粒子は「同じ表面流束・同じ初期濃度」なので 区別がつきません。粒径分布も無視して代表半径 $R_s^\pm$ [m] の球 1 個に集約します。 以上の適用範囲をまとめると:
まとめ — SPM が良い近似になる条件(LG M50 での目安)
- 低 C レート:0.5C 以下なら良好、1C で誤差数十 mV、2C 以上は要注意(§2.9)。
- 薄い電極:$\Delta c_e \propto L$、$\Delta\phi \propto L$。全厚 100 μm 級の高出力セルでは 1C 超でも使える。
- 高い伝導度:$\kappa^{\mathrm{eff}}, \sigma^{\mathrm{eff}}$ による電位降下が $RT/F = 25.7$ mV より十分小さいこと。
逆に言えば、SPM が捨てなかったもの — 固相拡散と界面反応 — こそ、 低レートの電池電圧を支配する物理です。
物理的な意味 — SPM は「固体の中の渋滞」だけを残す
リチウムイオン電池の電圧損失は、大きく分けて (a) 界面反応の遅さ(活性化過電圧)、(b) 固相内拡散の遅さ、 (c) 電解液内の輸送の遅さ(濃度分極・オーム損)の 3 つです。 SPM は (c) を丸ごと捨て、(a) と (b) だけを残したモデルです。 LG M50 のようなエネルギー型セルでは、低レートの電圧応答は 正極粒子内の遅い拡散($D_s^+ = 4\times10^{-15}$ m²/s)と 負極の反応抵抗に支配されるため、(c) を捨てても 1C 程度までは 電圧曲線の形がよく再現されます。高レートで (c) が主役になったとき、 SPM は破綻します(§2.9)。
2.2 DFN からの簡約 — 5 式のうち何が消えるか
フェーズ1で導出した DFN の支配方程式 5 本を再掲します(導出はフェーズ1参照)。 記号はすべてフェーズ1と共通です: $c_s(x,r,t)$ [mol/m³] は固相 Li 濃度、$r$ [m] は粒子中心からの半径、 $D_s$ [m²/s] は固相拡散係数、$a = 3\varepsilon_s/R_s$ [1/m] は比界面積 ($\varepsilon_s$ [−]:活物質体積分率)、 $i_s, i_e$ [A/m²] は固相・液相の見かけ電流密度、 $\sigma^{\mathrm{eff}}$ [S/m] は実効電子伝導率、 $i_0$ [A/m²] は交換電流密度、$k$ [m²·⁵/(mol⁰·⁵·s)] は反応速度定数、 $\alpha_a, \alpha_c$ [−] は移動係数(本教材では 0.5, 0.5)、 $R = 8.314$ J/(mol·K)、$T = 298.15$ K です。 座標は負極集電体を $x = 0$、放電電流を正 $I > 0$、 酸化(粒子から Li が出る)方向の界面電流を正 $j > 0$ とします。
① 固相拡散(各 $x$ の粒子内):
$$ \frac{\partial c_s}{\partial t} = \frac{1}{r^2}\frac{\partial}{\partial r}\!\left(D_s r^2 \frac{\partial c_s}{\partial r}\right), \qquad \left.\frac{\partial c_s}{\partial r}\right|_{r=0} = 0,\quad -D_s \left.\frac{\partial c_s}{\partial r}\right|_{r=R_s} = \frac{j}{F} \tag{DFN-1} $$② 液相物質保存:
$$ \varepsilon_e \frac{\partial c_e}{\partial t} = \frac{\partial}{\partial x}\!\left(D_e^{\mathrm{eff}}\frac{\partial c_e}{\partial x}\right) + (1 - t_+^0)\frac{a j}{F} \tag{DFN-2} $$③ 固相電荷保存:
$$ \frac{\partial}{\partial x}\!\left(\sigma^{\mathrm{eff}}\frac{\partial \phi_s}{\partial x}\right) = a j, \qquad i_s = -\sigma^{\mathrm{eff}} \frac{\partial \phi_s}{\partial x} \tag{DFN-3} $$④ 液相電荷保存(修正オームの法則。熱力学因子は 1 とする):
$$ i_e = -\kappa^{\mathrm{eff}}\frac{\partial \phi_e}{\partial x} + \frac{2\kappa^{\mathrm{eff}} R T}{F}(1 - t_+^0)\frac{\partial \ln c_e}{\partial x}, \qquad \frac{\partial i_e}{\partial x} = a j \tag{DFN-4} $$⑤ 界面反応(Butler–Volmer):
$$ j = i_0\left[\exp\!\left(\frac{\alpha_a F \eta}{R T}\right) - \exp\!\left(-\frac{\alpha_c F \eta}{R T}\right)\right], \qquad \eta = \phi_s - \phi_e - U(\theta), \qquad i_0 = k F c_e^{1/2} c_{s,\mathrm{surf}}^{1/2}(c_{s,\max} - c_{s,\mathrm{surf}})^{1/2} \tag{DFN-5} $$どの $x$ でも $i_s + i_e = I$(電荷保存則)が成り立つことも思い出しておきます。 ここに §2.1 の仮定を順番に入れていきます。
ステップ 1: 仮定 (i) で液相の 2 式が消える
$c_e(x,t) = c_{e0}$(定数)と置くと、(DFN-2) の左辺と拡散項はゼロになります。 厳密にはこのとき生成項 $(1-t_+^0)aj/F$ が残って矛盾しますが、 仮定 (i) の主張は「この生成項が作る濃度変化 $\Delta c_e$ が $c_{e0}$ に比べて無視できるほど小さい」(§2.1 の見積もり)ということです。 つまり (DFN-2) は「解かない」と決めるのが SPM です。
(DFN-4) では $\partial \ln c_e/\partial x = 0$ となるので濃度項が消え、 $i_e = -\kappa^{\mathrm{eff}}\,\partial\phi_e/\partial x$ という普通のオームの法則に戻ります。 さらに $\partial\phi_e/\partial x = 0$ とみなす(伝導率が実質無限大という理想化)ので、 $\phi_e(x) =$ 定数となり (DFN-4) も消えます。 ただし液相電流 $i_e$ 自体は流れていることに注意してください — 「勾配ゼロで電流が流れる」のは $\kappa^{\mathrm{eff}} \to \infty$ の極限の理想化です。 このあと §2.3 で使うのは (DFN-4) の後半、 電荷保存の微分形 $\partial i_e/\partial x = a j$ だけです。 これは電位とは無関係に成り立つ「電流の帳簿」なので、SPM でも生き残ります。
ステップ 2: 固相電荷保存が自明になる
(DFN-3) は $\phi_s(x)$ の分布を決める式でした。 負極では $\sigma^{\mathrm{eff}} = 140$ S/m と大きく、 1C での電位降下は $\sim 0.01$ mV(§2.1)。 よって $\phi_s$ は各電極内で一様と置けます。 $\phi_s$ が一様なら (DFN-3) の左辺の意味は失われ、 残る内容は「両辺を電極厚さで積分した電流の帳簿」だけになります。 実際、$i_s + i_e = I$ と $\partial i_e/\partial x = aj$ から $\partial i_s/\partial x = -aj$ であり、これを負極全体 $[0, L_n]$ で積分すると
$$ i_s(L_n) - i_s(0) = -\int_0^{L_n} a j \, dx \quad\Longrightarrow\quad 0 - I = -\int_0^{L_n} a j \, dx \quad\Longrightarrow\quad \int_0^{L_n} a j \, dx = I $$(負極集電体 $x=0$ では電流はすべて固相なので $i_s(0) = I$、 セパレータ境界 $x=L_n$ では固相電流は流れられないので $i_s(L_n) = 0$)。 つまり「電極内の反応電流を全部足すと印加電流になる」という当然の帳簿だけが残ります。 これが「固相電荷保存が自明になる」の意味です。
ステップ 3: 対応表
まとめ — DFN 5 式 → SPM 方程式系の対応
| DFN の式 | SPM での扱い | SPM に残るもの |
|---|---|---|
| (DFN-1) 固相拡散 ($x$ ごとに無数の粒子) |
残す。ただし代表粒子は各電極 1 個($x$ 依存性が消える) | 球拡散 2 本:式 (2.3)(2.4) |
| (DFN-2) 液相物質保存 | 解かない。$c_e = c_{e0} = 1000$ mol/m³ 定数 | —($i_0$ の中の $c_e$ が定数になるだけ) |
| (DFN-3) 固相電荷保存 | 自明化。$\phi_s$ は電極内一様。電流の帳簿 $\int aj\,dx = I$ だけ残る | 一様 $j$ の値:式 (2.1)(2.2) |
| (DFN-4) 液相電荷保存 | 消える。$\phi_e =$ 定数(電位基準)。$\partial i_e/\partial x = aj$ の帳簿だけ使う | — |
| (DFN-5) Butler–Volmer | 残す。ただし $j$ が既知になるので、$\eta$ について「解く」式に役割が変わる | 逆変換 2 本:式 (2.8) |
未知場の数で見ると、DFN の $\{c_s(x,r,t),\ c_e(x,t),\ \phi_s(x,t),\ \phi_e(x,t),\ j(x,t)\}$ が、SPM では $\{c_s^-(r,t),\ c_s^+(r,t)\}$ の 1 次元場 2 本 + 代数式まで減ります。 偏微分方程式の本数が 5 → 2、独立変数が $(x, r, t)$ → $(r, t)$。 これが SPM の計算が軽い理由です。
2.3 一様反応流束の導出 — $j^\pm = \pm I/(a^\pm L^\pm)$
SPM の入力は印加電流密度 $I$ [A/m²](放電を正)だけです。 代表粒子の境界条件になる $j^\pm$ を、電荷保存と境界条件から 1 ステップずつ求めます。 使うのは (DFN-4) の後半 $\partial i_e/\partial x = aj$ と、 「集電体では電流はすべて固相、セパレータでは電流はすべて液相」という境界条件だけです。
導出 — 負極($0 \le x \le L_n$)
液相の電荷保存の微分形から出発します。液相電流 $i_e$ [A/m²] は、 界面反応で固相から液相に電流が「乗り移る」ぶんだけ $x$ 方向に増えていきます:
$$ \frac{\partial i_e}{\partial x} = a^- j^-(x) $$ここで $a^- = 3\varepsilon_s^-/R_s^-$ [1/m] は負極の比界面積です。 仮定 (ii) により $j^-(x) = j^-$(定数)なので、右辺は $x$ によらない定数です。
境界条件を確認します。負極集電体 $x = 0$ は金属と接しており、 イオンはそこを通れないので液相電流はゼロです:
$$ i_e(0) = 0 $$右辺が定数なので、(1) を $0$ から $x$ まで積分すると $i_e$ は 1 次関数になります:
$$ i_e(x) = i_e(0) + \int_0^{x} a^- j^- \, dx' = a^- j^- x $$電流が固相から液相へ、位置に比例してなだらかに乗り移っていく描像です。
セパレータ境界 $x = L_n$ では、固相(活物質)が途切れるので 電流はすべて液相が担います。全電流は $I$ ですから:
$$ i_e(L_n) = I \quad\Longrightarrow\quad a^- j^- L_n = I $$$j^-$ について解けば、負極の一様反応電流密度が得られます:
放電($I > 0$)のとき $j^- > 0$。 符号規約「$j > 0$ は酸化 = 粒子から Li が出る」と整合します: 放電時、負極粒子は Li を吐き出します。
導出 — 正極($L_n + L_s \le x \le L$)
セパレータ内には活物質がなく($aj = 0$)、$i_e$ は一定のまま $I$ で正極に入ります。 よって正極入口で
$$ i_e(L_n + L_s) = I $$正極内でも $\partial i_e/\partial x = a^+ j^+$(定数)を積分します:
$$ i_e(x) = I + a^+ j^+ \left[x - (L_n + L_s)\right] $$正極集電体 $x = L$ では再び液相電流はゼロ、$i_e(L) = 0$:
$$ 0 = I + a^+ j^+ L_p $$$j^+$ について解きます:
放電時は $j^+ < 0$、すなわち還元(粒子に Li が入る)。 液相を渡ってきた Li⁺ が正極粒子に取り込まれる、という放電の描像そのものです。
単位確認:$[I] = \mathrm{A/m^2}$、$[a] = 1/\mathrm{m}$、$[L] = \mathrm{m}$ なので $a L$ は無次元、したがって $[j] = \mathrm{A/m^2}$ ✓。 $j$ は「活物質表面 1 m² あたりの電流」、$I$ は「セル断面 1 m² あたりの電流」で、 同じ単位ですが面積の基準が違うことに注意してください。 その換算係数が無次元量 $aL$ です。
物理的な意味 — $aL$ は「面積の増幅率」
$a L$ は「セルの見かけ面積 1 m² の裏に、反応できる粒子表面が何 m² あるか」を表します。 LG M50 では $a^- = 3 \times 0.75 / 5.86\,\mathrm{μm} = 3.84\times10^5$ 1/m、 $a^- L_n = 32.7$。 つまり負極は見かけの 33 倍、正極は $a^+ L_p = 28.9$ 倍の反応面積を持ちます。 多孔質電極が優れているのはこの増幅のおかげで、 1C($I = 48.7$ A/m²)でも界面あたりは $j^- = 48.7/32.7 = +1.49$ A/m²、 $j^+ = -48.7/28.9 = -1.69$ A/m² という穏やかな電流密度で済みます。
2.4 SPM の方程式系 — 球拡散と平均濃度の帳簿
材料が出そろいました。SPM の全方程式系を明示します。 上付き $\pm$ は正極・負極を表し、$-$ が負極です。 未知関数は $c_s^-(r,t)$ と $c_s^+(r,t)$ の 2 つだけ、 残りはすべて代数式(その場で計算できる式)です。
まとめ — SPM の方程式系(これがこの章の主結果)
(A) 球拡散 2 本(各電極の代表粒子内、$0 < r < R_s^\pm$):
$$ \frac{\partial c_s^\pm}{\partial t} = \frac{1}{r^2}\frac{\partial}{\partial r}\!\left(D_s^\pm\, r^2\, \frac{\partial c_s^\pm}{\partial r}\right) \tag{2.3} $$境界条件(中心は対称、表面は反応流束):
$$ \left.\frac{\partial c_s^\pm}{\partial r}\right|_{r=0} = 0, \qquad -D_s^\pm \left.\frac{\partial c_s^\pm}{\partial r}\right|_{r=R_s^\pm} = \frac{j^\pm}{F}, \qquad j^- = \frac{I}{a^- L_n},\quad j^+ = -\frac{I}{a^+ L_p} \tag{2.4} $$(B) Butler–Volmer 2 本($\alpha_a = \alpha_c = 0.5$、§2.5 で導出):
$$ \eta^\pm = \frac{2RT}{F}\, \mathrm{asinh}\!\left(\frac{j^\pm}{2\, i_0^\pm}\right), \qquad i_0^\pm = k^\pm F\, c_{e0}^{1/2}\, \left(c_{s,\mathrm{surf}}^\pm\right)^{1/2} \left(c_{s,\max}^\pm - c_{s,\mathrm{surf}}^\pm\right)^{1/2} $$(C) 電圧式 1 本(§2.6 で組み立て):
$$ V = \left[U_p(\theta_p^{\mathrm{surf}}) + \eta^+\right] - \left[U_n(\theta_n^{\mathrm{surf}}) + \eta^-\right], \qquad \theta^{\mathrm{surf}} = \frac{c_{s,\mathrm{surf}}}{c_{s,\max}} $$解く順番:$I$ を与える → (2.1)(2.2) で $j^\pm$ → (2.3)(2.4) を時間積分して $c_{s,\mathrm{surf}}^\pm(t)$ → BV 逆変換で $\eta^\pm(t)$ → 電圧 $V(t)$。 微分方程式は (A) だけで、しかも $j^\pm$ が定数なので線形です。
平均濃度の時間発展 — 積分するだけで厳密に出る保存則
(2.3) を数値で解く前に、手で厳密に分かることを 1 つ引き出しておきます。 粒子の体積平均濃度
$$ \langle c_s \rangle (t) = \frac{1}{\tfrac{4}{3}\pi R_s^3} \int_0^{R_s} c_s(r,t)\, 4\pi r^2\, dr = \frac{3}{R_s^3} \int_0^{R_s} c_s(r,t)\, r^2\, dr $$がどう時間変化するかは、拡散方程式を体積積分するだけで求まります。 途中の積分を省略せずに追います。
導出 — $d\langle c_s\rangle/dt = -3j/(F R_s)$
平均濃度の定義を $t$ で微分します。積分範囲は時間によらないので、 微分と積分の順序を交換できます:
$$ \frac{d\langle c_s \rangle}{dt} = \frac{3}{R_s^3} \int_0^{R_s} \frac{\partial c_s}{\partial t}\, r^2\, dr $$被積分関数の $\partial c_s/\partial t$ に拡散方程式 (2.3) を代入します:
$$ \frac{d\langle c_s \rangle}{dt} = \frac{3}{R_s^3} \int_0^{R_s} \frac{1}{r^2}\frac{\partial}{\partial r}\!\left(D_s r^2 \frac{\partial c_s}{\partial r}\right) r^2\, dr = \frac{3}{R_s^3} \int_0^{R_s} \frac{\partial}{\partial r}\!\left(D_s r^2 \frac{\partial c_s}{\partial r}\right) dr $$$r^2$ がちょうど打ち消し合い、被積分関数が完全微分(何かの $r$ 微分)になりました。
完全微分の積分は端点の値の差です(微積分学の基本定理):
$$ \int_0^{R_s} \frac{\partial}{\partial r}\!\left(D_s r^2 \frac{\partial c_s}{\partial r}\right) dr = \left[ D_s r^2 \frac{\partial c_s}{\partial r} \right]_{r=0}^{r=R_s} = D_s R_s^2 \left.\frac{\partial c_s}{\partial r}\right|_{r=R_s} - \underbrace{\left(D_s\, r^2 \frac{\partial c_s}{\partial r}\right)\Big|_{r=0}}_{=\,0} $$中心の項は $r^2 = 0$ と対称条件 (2.4) の両方によりゼロです。
表面の項に境界条件 (2.4) を使います。 $-D_s\,\partial c_s/\partial r|_{R_s} = j/F$ より $D_s\,\partial c_s/\partial r|_{R_s} = -j/F$ なので:
$$ \left[ D_s r^2 \frac{\partial c_s}{\partial r} \right]_{0}^{R_s} = R_s^2 \cdot \left(-\frac{j}{F}\right) $$(1) に戻して整理すると:
$D_s$ が消えたことに注目してください。 平均濃度は拡散の速さによらず、流した電流だけで決まります (電荷の帳簿 = クーロンカウンティング)。 放電時、負極は $j^- > 0$ なので $\langle c_s^- \rangle$ は減り(Li が抜け)、 正極は $j^+ < 0$ なので $\langle c_s^+ \rangle$ は増えます(Li が溜まる)。
物理的な意味 — 「表面と平均の差」が拡散律速の現れ
電圧を決めるのは表面濃度 $c_{s,\mathrm{surf}}$ (OCP も交換電流密度も表面の状態で決まる)ですが、 容量の帳簿を握っているのは平均濃度 $\langle c_s\rangle$ です。 拡散が十分速ければ($D_s$ 大、$R_s$ 小)粒子内はほぼ一様で $c_{s,\mathrm{surf}} \approx \langle c_s\rangle$。 拡散が遅いと、放電中の負極では表面だけ先に Li が枯れ ($c_{s,\mathrm{surf}} < \langle c_s\rangle$)、 正極では表面だけ先に満杯になります ($c_{s,\mathrm{surf}} > \langle c_s\rangle$)。 中身(平均)はまだ余裕があるのに表面が先に限界に達して電圧が落ちる — これが高レートで容量が減って見える主因の 1 つで、 図2.2 のシミュレータで直接観察できます。
補足: 表面と平均の差はどのくらい開くか(準定常の見積もり)
一定の $j$ を流し続けると、$\tau_s = R_s^2/D_s$ [s] 程度の時間ののち、 粒子内の濃度分布は「形を保ったまま全体が沈んでいく」準定常状態になります。 このとき (2.5) より粒子内のどこでも $\partial c_s/\partial t = -3j/(F R_s)$(一様)なので、 (2.3) に代入して
$$ \frac{1}{r^2}\frac{d}{d r}\!\left(D_s r^2 \frac{d c_s}{d r}\right) = -\frac{3j}{F R_s} \;\Longrightarrow\; D_s r^2 \frac{d c_s}{d r} = -\frac{j r^3}{F R_s} \;\Longrightarrow\; \frac{d c_s}{d r} = -\frac{j\, r}{F R_s D_s} $$(1 回目の積分定数は中心の対称条件からゼロ)。もう一度積分すると $c_s(r) = A - \dfrac{j r^2}{2 F R_s D_s}$(放物線分布)。 表面値と体積平均を取って差を作ると、定数 $A$ が消えて
$$ \langle c_s \rangle - c_{s,\mathrm{surf}} = \frac{j\,R_s^2}{2FR_sD_s} - \frac{3}{R_s^3}\!\int_0^{R_s}\! \frac{j\,r^4}{2FR_sD_s}\,dr = \frac{j R_s}{2FD_s} - \frac{3 j R_s}{10 F D_s} = \frac{j R_s}{5 F D_s} \tag{2.6} $$LG M50 の 1C では、負極:$\tau_s^- = 17$ 分、 $\Delta c = 548$ mol/m³($\Delta\theta \approx 0.017$)と小さい一方、 正極:$\tau_s^+ = 114$ 分、$\Delta c = 4560$ mol/m³ ($\Delta\theta \approx 0.072$)とかなり大きくなります。 この電池の固相拡散のボトルネックは正極粒子です。 図2.2 で正極(赤)のプロファイルの傾きが大きいことを確認してください。 なお式 (2.6) はシミュレータの検証にも使えます(数値解と 0.1% 以内で一致します)。
2.5 Butler–Volmer の逆変換 — $\eta$ を $j$ から求める
DFN では $j$ と $\eta$ が互いに絡む非線形方程式でしたが、 SPM では $j^\pm$ が式 (2.1)(2.2) で先に決まってしまうので、 Butler–Volmer 式は「$\eta$ を求めるための式」に役割が変わります。 幸い $\alpha_a = \alpha_c = 0.5$ のとき、この逆変換は閉じた形で書けます。
導出 — $\exp - \exp = 2\sinh$ と逆変換
(DFN-5) に $\alpha_a = \alpha_c = 0.5$ を代入します:
$$ j = i_0\left[\exp\!\left(\frac{F\eta}{2RT}\right) - \exp\!\left(-\frac{F\eta}{2RT}\right)\right] $$2 つの指数の引数が、符号だけ違う同じ量になりました。
見通しを良くするため $z = \dfrac{F\eta}{2RT}$(無次元過電圧)と置きます。 双曲線正弦関数の定義は
$$ \sinh z = \frac{e^{z} - e^{-z}}{2} \quad\Longleftrightarrow\quad e^{z} - e^{-z} = 2\sinh z $$まさに (1) の角括弧の形です。
したがって Butler–Volmer 式は 1 つの $\sinh$ にまとまります:
$\sinh$ は実数全体で単調増加(その導関数 $\cosh z \ge 1 > 0$)なので、 逆関数 $\mathrm{asinh}$ が一意に存在します。(2.7) を $\eta$ について解くと:
$\mathrm{asinh}\,x = \ln\!\left(x + \sqrt{x^2 + 1}\right)$ なので、
対数と平方根だけで計算できます(NumPy では np.arcsinh、
JavaScript では Math.asinh)。
交換電流密度 $i_0$ [A/m²] は表面濃度に依存します
(params.js の i0_fun と同じ式。$c_e = c_{e0}$ 固定):
$k^-$ = 6.716×10⁻¹² m²·⁵/(mol⁰·⁵·s)、$k^+$ = 3.545×10⁻¹¹ m²·⁵/(mol⁰·⁵·s) です。 形に注目してください:$i_0$ は $c_{s,\mathrm{surf}} \to 0$(表面に Li がない=酸化できない)でも $c_{s,\mathrm{surf}} \to c_{s,\max}$(表面が満杯=還元できない)でもゼロに落ちます。 $i_0 \to 0$ のとき (2.8) の $\mathrm{asinh}$ の引数が発散し $|\eta| \to \infty$、つまり表面の枯渇・飽和は過電圧の暴走として電圧に現れます。 これが図2.2 で見る「高レートで電圧が急落する」メカニズムの正体です。
満充電(100% SOC)の LG M50 に 1C を流した瞬間の値を入れてみます:
- 負極:$\theta_n = 0.9014$ → $i_0^- = 0.202$ A/m²。 $\dfrac{j^-}{2i_0^-} = \dfrac{1.49}{0.404} = 3.68$ → $\eta^- = 51.4\,\mathrm{mV} \times \mathrm{asinh}(3.68) = +103$ mV
- 正極:$\theta_p = 0.27$ → $i_0^+ = 3.03$ A/m²。 $\dfrac{j^+}{2i_0^+} = -0.278$ → $\eta^+ = -14$ mV
同じ 1C でも、反応が遅い負極(黒鉛)の過電圧は正極の 7 倍あります。 このセルの反応抵抗のボトルネックは負極、 拡散のボトルネックは正極(§2.4)という非対称な分担になっています。
補足: 小電流極限と大電流極限($\mathrm{asinh}$ の 2 つの顔)
$|x| \ll 1$ では $\mathrm{asinh}\,x \approx x$ なので、(2.8) は線形化できます:
$$ \eta \approx \frac{2RT}{F}\cdot\frac{j}{2i_0} = \frac{RT}{F}\frac{j}{i_0} \qquad (|j| \ll 2 i_0) $$これは「電荷移動抵抗」$R_{ct} = \dfrac{RT}{F i_0}$ [Ω·m²] を通るオームの法則です。 逆に $|x| \gg 1$ では $\mathrm{asinh}\,x \approx \mathrm{sgn}(x)\ln(2|x|)$ となり、 $\eta \approx \pm\dfrac{2RT}{F}\ln\dfrac{|j|}{i_0}$ — 電流を 10 倍にしても過電圧は一定量(118 mV @ 25 ℃)しか増えない Tafel(ターフェル)則になります。 上の 1C の例では負極が $x = 3.68$ で既に Tafel 領域、正極は $x = -0.28$ でほぼ線形領域です。
2.6 端子電圧の組み立て — OCV・動作窓・容量の換算
最後のパーツは端子電圧 $V$ [V] です。定義は $V = \phi_s(L) - \phi_s(0)$(正極集電体の固相電位 − 負極集電体の固相電位)でした。 過電圧の定義 $\eta = \phi_s - \phi_e - U(\theta)$ を各電極で $\phi_s = \phi_e + U + \eta$ と書き直します。 §2.2 より $\phi_s$ は各電極内で一様、$\phi_e$ は全域で一様(定数)なので:
$$ V = \phi_s\big|_{\text{正極}} - \phi_s\big|_{\text{負極}} = \left[\phi_e + U_p(\theta_p^{\mathrm{surf}}) + \eta^+\right] - \left[\phi_e + U_n(\theta_n^{\mathrm{surf}}) + \eta^-\right] $$定数 $\phi_e$ が差し引きで消えて($\phi_e$ を測る基準がどこでも良い理由がこれです)、 SPM の電圧式が得られます:
$U_n, U_p$ [V] は各電極の開回路電位(OCP)、 $\theta^{\mathrm{surf}} = c_{s,\mathrm{surf}}/c_{s,\max}$ [−] は表面の化学量論です。 平均でなく表面の値を使う点が重要です(§2.4)。
導出 — 放電時、2 つの過電圧はどちらも電圧を下げる
符号を 1 つずつ追います。放電($I > 0$)のとき:
- 負極:$j^- = +I/(a^-L_n) > 0$ → (2.8) の $\mathrm{asinh}$ は奇関数で単調増加なので $\eta^- > 0$ → (2.10) で $[U_n + \eta^-]$ は引かれる側が大きくなる → $V$ は下がる。
- 正極:$j^+ = -I/(a^+L_p) < 0$ → $\eta^+ < 0$ → $[U_p + \eta^+]$ が小さくなる → $V$ は下がる。
つまり放電時は $\eta^- > 0$、$\eta^+ < 0$ で、どちらも端子電圧を OCV より下げる方向に働きます。 これは熱力学の要請どおりです:電池から仕事を取り出すとき、 端子電圧は必ず開回路電圧より低くなり、差額は熱として散逸します。 充電($I < 0$)ではすべての符号が反転し、$V >$ OCV となります。 「過電圧はいつでも損」— 符号規約が正しく組めているかを確かめる良い検算です。
OCV 曲線と動作窓
電流を流さなければ($I = 0$ → $j^\pm = 0$ → $\eta^\pm = 0$、
十分待てば表面=平均)、(2.10) は開回路電圧(OCV)になります:
$V_{\mathrm{OCV}} = U_p(\theta_p) - U_n(\theta_n)$。
ここで $U_n(\theta)$、$U_p(\theta)$ は params.js の
ocpN/ocpP(Chen et al. 2020 の実測フィット)です。
黒鉛の $U_n$ は 0.1–0.2 V 付近に平坦部(ステージ構造と呼ばれる Li の秩序配列に対応)を持ち、
$\theta \to 0$ で急上昇します。NMC811 の $U_p$ は 3.5–4.3 V をなだらかに変化します。
重要なのは、各電極は $\theta$ の全域 $[0, 1]$ を使わないことです。 セルの充放電は端子電圧の上下限(このセルでは 4.2 V / 2.5 V)で区切られ、 それに対応する $\theta$ の範囲(動作窓)は:
| 0% SOC($\theta_{100\%}$ から放電しきった状態) | 100% SOC(満充電) | |
|---|---|---|
| 負極 $\theta_n$ | $\theta_n^{0\%} = 0.0279$(ほぼ空) | $\theta_n^{100\%} = 0.9014$(ほぼ満杯) |
| 正極 $\theta_p$ | $\theta_p^{0\%} = 0.9084$(Li で満杯) | $\theta_p^{100\%} = 0.2700$(Li が抜けた状態) |
| $V_{\mathrm{OCV}}$ | $3.561 - 1.064 = 2.498$ V | $4.273 - 0.092 = 4.181$ V |
SOC(State of Charge、充電率)[−] と $\theta$ の対応は、 この端点間の線形補間で定義します:
$$ \theta_n(\mathrm{SOC}) = \theta_n^{0\%} + \mathrm{SOC}\cdot(\theta_n^{100\%} - \theta_n^{0\%}), \qquad \theta_p(\mathrm{SOC}) = \theta_p^{0\%} + \mathrm{SOC}\cdot(\theta_p^{100\%} - \theta_p^{0\%}) \tag{2.11} $$SOC が上がると負極には Li が入り($\theta_n$ 増)、正極からは抜けます($\theta_p$ 減) — 2 つの $\theta$ は常に逆方向に動きます。図2.1 で実際に動かして確かめてください。
SOC スライダーを動かすと、式 (2.11) で $\theta_n$(青)・$\theta_p$(赤)が決まり、 OCP 曲線上のマーカーが移動します。端子側の OCV は 2 曲線の値の差です。 薄く塗った帯が各電極の動作窓。 見どころ: (1) 負極マーカーと正極マーカーは常に逆方向に動く。 (2) SOC を 0% に近づけると、$U_p$ の低下より $U_n$ の急上昇が効いて OCV が 2.5 V まで落ちる。 (3) 黒鉛の平坦部のせいで、OCV カーブの「段差」はほぼ負極由来。
セル容量と θ の換算 — 化学量論の帳簿付け
「θ が 0.9 から 0.03 まで動く」ことと「セルから 5 Ah 取り出せる」ことを結びつけます。 電極(面積 $A$ [m²]、厚さ $L^\pm$ [m]、活物質体積分率 $\varepsilon_s^\pm$ [−])に 入っている Li の物質量は $n_{\mathrm{Li}}^\pm = \varepsilon_s^\pm L^\pm A\, c_{s,\max}^\pm\, \theta^\pm$ [mol]。 $\theta$ が動作窓を端から端まで動くときに出入りする電荷が、その電極の容量です:
$$ Q^\pm = \frac{F\, \varepsilon_s^\pm L^\pm A\, c_{s,\max}^\pm\, \left|\theta^{\pm}_{100\%} - \theta^{\pm}_{0\%}\right|}{3600} \quad [\mathrm{Ah}] \tag{2.12} $$LG M50 の値($A = 0.1027$ m²)を入れると:
- 負極:$Q^- = \dfrac{96485 \times 0.75 \times 85.2\,\mathrm{μm} \times 0.1027 \times 33133 \times 0.8735}{3600} = 5.09$ Ah
- 正極:$Q^+ = \dfrac{96485 \times 0.665 \times 75.6\,\mathrm{μm} \times 0.1027 \times 63104 \times 0.6384}{3600} = 5.58$ Ah
公称容量 5.0 Ah にいちばん近いのは負極の窓で、
このセルの放電は負極側の窓で頭打ちになる(負極律速)設計です。
また、1C 電流密度が $I_{1C} = \dfrac{5.0\ \mathrm{Ah}}{0.1027\ \mathrm{m^2}} = 48.7$ A/m²
という params.js の定義もここから来ています。
平均化学量論の時間変化は、(2.5) を $c_{s,\max}$ で割れば
$d\langle\theta\rangle/dt = -3j/(F R_s c_{s,\max})$ となり、
定電流なら $\langle\theta\rangle$ は時間の 1 次関数です
— 容量 [Ah] と $\langle\theta\rangle$ は完全に比例します。
注意 — 帳簿の細かい食い違い
表の 4 端点($\theta^{0\%}, \theta^{100\%}$)は完全 DFN の準静的な電圧窓 2.5–4.2 V から決められた文献値で、丸めや同定誤差を含みます。 実際、(2.12) の $Q^-$ = 5.09 Ah と $Q^+$ = 5.58 Ah が示すとおり 両電極の窓は同じ電荷量に対応していません(約 9% のずれ)。 厳密な電荷保存で帳簿を付けると、100% SOC から 5.09 Ah 放電したとき $\theta_n$ は窓の下端 0.028 に達しますが、$\theta_p$ は 0.85 程度までしか上がりません。 本教材では (2.11) の線形補間を「SOC の定義」として使い、 シミュレーションの初期値には $\theta^{100\%}$ を採用します。 放電の終わり(2.5 V 到達)は主に負極の $U_n$ の急上昇で決まるため、 この食い違いが電圧曲線に与える影響はわずかです。
2.7 数値解法(最小限)— シェルに分割する
SPM で数値計算が必要なのは球拡散 (2.3) だけです。 $r$ 方向に連続な関数 $c_s(r,t)$ をそのまま計算機に載せることはできないので、 $r$ 方向を離散化します。 ここでは実装の直感だけをつかみ、理論(離散化の精度・安定性・剛性)はフェーズ4に譲ります。
有限体積法(FVM)の直感 — タマネギの皮の保存則
粒子を $N_r$ 枚の同心シェル(タマネギの皮)に分割します。 シェル $i$($i = 0, \dots, N_r - 1$)は半径 $r_i = i\,\Delta r$ から $r_{i+1} = (i+1)\Delta r$ の球殻で、$\Delta r = R_s/N_r$。 各シェルについて「Li の増減 = 内側の面から入る流れ − 外側の面から出る流れ」 という保存則をそのまま書きます:
$$ \underbrace{V_i \frac{d c_i}{dt}}_{\text{シェル内の Li 増加率}} = \underbrace{A_{i+1}\, D_s \frac{c_{i+1} - c_i}{\Delta r}}_{\text{外側の面からの流入}} - \underbrace{A_{i}\, D_s \frac{c_{i} - c_{i-1}}{\Delta r}}_{\text{内側の面への流出}} \tag{2.13} $$ $$ V_i = \frac{4\pi}{3}\left(r_{i+1}^3 - r_i^3\right)\ [\mathrm{m^3}], \qquad A_i = 4\pi r_i^2\ [\mathrm{m^2}] $$$c_i$ [mol/m³] はシェル $i$ の平均濃度、面を通るフラックスは フィックの法則 $-D_s\,\partial c/\partial r$ を隣接シェルの濃度差で近似したものです。 境界条件も同じ言葉で書けます: 最内シェルは内側の面積が $A_0 = 0$ なので流入項が自然に消え(対称条件)、 最外シェルの外側の面には拡散フラックスの代わりに 反応流束 $-\dfrac{j}{F} A_{N_r}$ [mol/s] を与えます(境界条件 (2.4))。
物理的な意味 — FVM は「保存則を壊さない」離散化
式 (2.13) を全シェルについて足すと、隣接面のフラックスが対で打ち消し合い (望遠鏡和)、残るのは表面の反応流束だけ: $\sum_i V_i\, \dot c_i = -\dfrac{j}{F}A_{N_r}$。 これは §2.4 の厳密な保存則 (2.5) の離散版そのものです。 つまり FVM は、どんなに粗い分割でも Li の総量を機械精度で保存します (実際、この章の実装では丸め誤差 $10^{-14}$ 程度で (2.5) と一致します)。 容量の帳簿が狂わないことは電池モデルでは死活的に重要で、 FVM が電池シミュレーションの標準になっている理由です。
method of lines — 空間だけ離散化して ODE に落とす
(2.13) は $N_r$ 本の常微分方程式(ODE)の系 $\dfrac{d\mathbf{c}}{dt} = \mathbf{A}\mathbf{c} + \mathbf{b}$ です ($\mathbf{A}$:三重対角行列、$\mathbf{b}$:表面流束の項)。 このように「空間を先に離散化して、時間方向は ODE ソルバに任せる」戦略を method of lines(線の方法)と呼びます。 時間積分のやり方は 2 通り用意しました:
- Python 実装(§2.8):
scipy.integrate.solve_ivp(陰的 BDF 法)に丸投げします。拡散方程式の ODE 系は「硬い(stiff)」 — 速い成分と遅い成分が混在する — ため、陽解法だと時間刻みを極端に 小さくしないと発散します。陰的ソルバを選ぶのが定石です(理由はフェーズ4で)。 - ブラウザ実装(図2.2):Crank–Nicolson 法(半陰的、2 次精度) + Thomas 法(三重対角ソルバ)で自前で解いています。 1 ステップが三重対角連立 1 回で済むため、スライダーを動かすたびに 全放電を再計算しても 50 ms 以内に収まります。
2.8 実装 — インタラクティブ SPM と Python コード
方程式系(§2.4)を実際に動かします。まずはシミュレータで SPM の挙動を体感してください。 設定は定電流放電:初期状態 100% SOC($\theta_n = 0.9014$, $\theta_p = 0.27$)、 下限電圧 2.5 V で打ち切りです。
スライダーを動かすと全放電を再計算します($N_r = 30$、時間 500 ステップ、 Crank–Nicolson + Thomas 法)。 左 (a):電圧 vs 放電容量。点線は平衡 OCV(ゆっくり流した極限)。 右 (b):両代表粒子の濃度プロファイル $c_s(r)/c_{s,\max}$(実線)と 体積平均 $\langle c_s\rangle/c_{s,\max}$(破線)。 「▶ 再生」で放電の時間発展をアニメーション、時間スライダーで任意の時刻へ移動できます。 見どころ: (1) 0.2C 以下では電圧曲線が OCV にほぼ張り付き、プロファイルはほぼ平ら。 (2) C レートを上げると実線(表面)と破線(平均)の差が開く — これが §2.4 の拡散律速。特に正極(赤)で顕著。 (3) 3C 以上では正極表面が先に飽和($\theta_p^{\mathrm{surf}} \to 1$)して $i_0^+ \to 0$、電圧が崖のように落ちて、平均濃度に余裕を残したまま放電が終わる (= 容量が減って見える)。 (4) $D_s$ を 0.1 倍 / 粒子半径を 3 倍にすると 1C でも同じ現象が起きる — 律速を決めるのは無次元量 $\tau_s = R_s^2/D_s$ と放電時間の比。
いくつか試してほしい実験と、結果の読み方:
- 0.1C:電圧曲線は OCV 点線とほぼ重なり、容量は窓いっぱいの約 5.1 Ah。 過電圧も表面・平均の差もほぼゼロ。「電池の熱力学だけ」が見えている状態です。
- 1C(既定):曲線全体が OCV から 0.1–0.15 V 下に平行移動 (主に負極の反応過電圧 $\eta^- \approx +0.1$ V)し、容量は約 4.96 Ah。 正極プロファイルには目に見える勾配が立ちます。
- 5C:初期電圧から大きく下がり、約 3.5 Ah で急落。 終了時の読み出しで $\theta_p$ の表面が 1 近く、平均が 0.7 程度 — 「中身は空いているのに表面が満杯」の典型例です。
- $D_s$ 0.1 倍(1C):5C と同様の早期打ち切りが起きます。 レートを上げることと拡散を遅くすることは、粒子から見ると同じことです。
Python 実装(実行可能)
同じ SPM を、§2.7 の方針(FVM で $N_r = 20$ シェル + solve_ivp)で
ゼロから実装したコードです。パラメータは js/params.js と同一の値を
ハードコードしてあり、「▶ ブラウザで実行」でこのページ内で走ります
(初回は Pyodide のダウンロードで数十秒かかります)。
そのままコピーすればローカルの Jupyter でも動きます
(末尾のコメントに matplotlib 版の描画コードがあります)。
# =====================================================================
# 単粒子モデル(SPM)の完全実装 — LG M50 セル(Chen et al. 2020)1C 放電
# 必要ライブラリ: numpy, scipy(ローカル Jupyter でもそのまま動きます)
# =====================================================================
import numpy as np
from scipy.integrate import solve_ivp
# ---- 物理定数・セルパラメータ(js/params.js と同じ値) ----
F, R, T = 96485.33212, 8.314462618, 298.15 # C/mol, J/(mol K), K
A_cell = 0.1027 # 電極面積 [m^2]
I_1C = 5.0 / A_cell # 1C 電流密度 [A/m^2] ≈ 48.69
ce0 = 1000.0 # 電解液塩濃度 [mol/m^3](SPM では定数)
# 電極パラメータ: [負極 n, 正極 p]
L = np.array([85.2e-6, 75.6e-6]) # 厚さ [m]
Rs = np.array([5.86e-6, 5.22e-6]) # 粒子半径 [m]
eps_s = np.array([0.75, 0.665]) # 活物質体積分率 [-]
Ds = np.array([3.3e-14, 4.0e-15]) # 固相拡散係数 [m^2/s]
cs_max = np.array([33133.0, 63104.0]) # 最大 Li 濃度 [mol/m^3]
k_rate = np.array([6.716e-12, 3.545e-11]) # 反応速度定数 [m^2.5/(mol^0.5 s)]
th_100 = np.array([0.9014, 0.2700]) # θ @100% SOC(放電開始点)
a_s = 3 * eps_s / Rs # 比界面積 a = 3ε_s/R_s [1/m]
def ocpN(t): # 黒鉛負極の OCP [V](Chen 2020 フィット)
return (1.9793 * np.exp(-39.3631 * t) + 0.2482
- 0.0909 * np.tanh(29.8538 * (t - 0.1234))
- 0.04478 * np.tanh(14.9159 * (t - 0.2769))
- 0.0205 * np.tanh(30.4444 * (t - 0.6103)))
def ocpP(t): # NMC811 正極の OCP [V]
return (-0.8090 * t + 4.4875
- 0.0428 * np.tanh(18.5138 * (t - 0.5542))
- 17.7326 * np.tanh(15.7890 * (t - 0.3117))
+ 17.5842 * np.tanh(15.9308 * (t - 0.3120)))
def i0_fun(k, ce, cs, csm): # 交換電流密度 [A/m^2]
return k * F * np.sqrt(ce) * np.sqrt(cs) * np.sqrt(csm - cs)
# ---- 放電条件と一様反応電流密度(2.3 節の式) ----
Crate = 1.0
I = Crate * I_1C # 放電を正 [A/m^2]
j = np.array([+I / (a_s[0] * L[0]), # 負極: j > 0(Li が出る)
-I / (a_s[1] * L[1])]) # 正極: j < 0(Li が入る)
# ---- r 方向の有限体積(FVM)離散化: 各電極 Nr シェル ----
Nr = 20
dr = Rs / Nr # シェル幅 [m]
iarr = np.arange(Nr)
# シェル体積 V_i ∝ (r_{i+1}^3 - r_i^3)/3、面係数 G_i ∝ D_s r_{i+1}^2 / dr
# (共通因子 4π は分子分母で打ち消えるので省略)
def fvm_matrix(e): # 電極 e(0=n, 1=p)の拡散行列 A(dc/dt = A c + b)
Vsh = ((iarr + 1) ** 3 - iarr ** 3) * dr[e] ** 3 / 3.0
G = Ds[e] * ((iarr[:-1] + 1) * dr[e]) ** 2 / dr[e]
A = np.zeros((Nr, Nr))
for i in range(Nr):
if i > 0:
A[i, i - 1] += G[i - 1] / Vsh[i]
A[i, i] -= G[i - 1] / Vsh[i]
if i + 1 < Nr:
A[i, i + 1] += G[i] / Vsh[i]
A[i, i] -= G[i] / Vsh[i]
b = np.zeros(Nr)
b[-1] = -(j[e] / F) * Rs[e] ** 2 / Vsh[-1] # 表面フラックス項(境界条件)
return A, b
A_n, b_n = fvm_matrix(0)
A_p, b_p = fvm_matrix(1)
J_full = np.zeros((2 * Nr, 2 * Nr)) # 定数ヤコビアン(BDF 用)
J_full[:Nr, :Nr], J_full[Nr:, Nr:] = A_n, A_p
b_full = np.concatenate([b_n, b_p])
def rhs(t, y): # dy/dt = A y + b(線形!)
return J_full @ y + b_full
def voltage(y): # 状態 → 端子電圧 [V]
cs_surf = np.array([y[Nr - 1], y[2 * Nr - 1]]) - j * dr / (2 * F * Ds)
cs_surf = np.clip(cs_surf, 1e-3, cs_max - 1e-3) # 数値ガード
th = cs_surf / cs_max
i0 = i0_fun(k_rate, ce0, cs_surf, cs_max)
eta = (2 * R * T / F) * np.arcsinh(j / (2 * i0)) # BV の逆変換(2.5 節)
return (ocpP(th[1]) + eta[1]) - (ocpN(th[0]) + eta[0])
def cutoff(t, y): # V = 2.5 V で積分打ち切り
return voltage(y) - 2.5
cutoff.terminal = True
cutoff.direction = -1
y0 = np.concatenate([np.full(Nr, th_100[0] * cs_max[0]),
np.full(Nr, th_100[1] * cs_max[1])])
t_max = 1.2 * 3600 / Crate
sol = solve_ivp(rhs, (0, t_max), y0, method="BDF", jac=lambda t, y: J_full,
events=cutoff, t_eval=np.linspace(0, t_max, 400), rtol=1e-6)
# 打ち切り時刻の点を末尾に追加
t_arr = np.append(sol.t, sol.t_events[0])
y_arr = np.hstack([sol.y, sol.y_events[0].T])
V_arr = np.array([voltage(y_arr[:, i]) for i in range(y_arr.shape[1])])
cap = I * A_cell * t_arr / 3600.0 # 放電容量 [Ah]
print(f"1C 放電: 打ち切り時刻 t = {t_arr[-1]:.1f} s ({t_arr[-1]/60:.1f} 分)")
print(f"放電容量 = {cap[-1]:.3f} Ah(公称 5.0 Ah)")
print(f"電圧範囲: {V_arr.min():.3f} V 〜 {V_arr.max():.3f} V")
th_sN = (y_arr[Nr-1, -1] - j[0]*dr[0]/(2*F*Ds[0])) / cs_max[0]
th_sP = (y_arr[2*Nr-1, -1] - j[1]*dr[1]/(2*F*Ds[1])) / cs_max[1]
print(f"終了時の表面化学量論: θ_n,surf = {th_sN:.3f}, θ_p,surf = {th_sP:.3f}")
# Plotly 描画(このページ用)。Jupyter では下の matplotlib 版を使ってください
plot_spec = {
"traces": [{"x": cap.tolist(), "y": V_arr.tolist(),
"name": "SPM 1C", "mode": "lines"}],
"layout": {"title": {"text": "SPM 1C 放電曲線(LG M50)"},
"xaxis": {"title": {"text": "放電容量 [Ah]"}},
"yaxis": {"title": {"text": "端子電圧 V [V]"}}},
}
# --- matplotlib 版(Jupyter 用) ---
# import matplotlib.pyplot as plt
# plt.plot(cap, V_arr)
# plt.xlabel("放電容量 [Ah]"); plt.ylabel("端子電圧 V [V]")
# plt.title("SPM 1C 放電曲線"); plt.grid(True); plt.show()
コードの読みどころと期待される出力:
- 構造が方程式系と 1 対 1:
$j^\pm$ の計算(§2.3)→
fvm_matrixが式 (2.13)(§2.7)→voltageが BV 逆変換 (2.8) と電圧式 (2.10)(§2.5–2.6)。 教科書の式とコードの行が対応していることを確認してください。 - 系が線形:
rhsはJ_full @ y + b_fullだけ。 定数ヤコビアンをsolve_ivpに渡しているので BDF 法が高速に走ります。 - イベント検出:
cutoff関数の符号が変わった時刻を ソルバが自動で見つけ、そこで積分を打ち切ります(terminal = True)。 - 出力の目安:放電容量 ≈ 4.955 Ah、電圧範囲 2.500–4.038 V、 終了時 $\theta_n^{\mathrm{surf}} \approx 0.035$(負極表面がほぼ枯れて終了)。 図2.2(Crank–Nicolson、$N_r = 30$)の 1C の結果 4.96 Ah と 0.2% 以内で一致します — 別々に実装した 2 つの解法が一致するのは良い検算です。
2.9 SPM の限界 — どこから使えなくなるか
SPM の誤差は、§2.1 で捨てた「電解液の物理」がそのまま返ってきます。 完全 DFN(フェーズ5で計算します)と比べると、LG M50 では概ね次のようになります:
| C レート | SPM の電圧誤差(対 DFN) | 状況 |
|---|---|---|
| 〜0.5C | 数 mV〜20 mV | 実用上ほぼ完全一致。SOC 推定・劣化研究のベースに使える |
| 1C | 数十 mV(放電後半で拡大) | 曲線の形は正しいが、全体に高めに出る。容量はやや過大評価 |
| 2–3C | 100 mV 超 | 電解液の濃度分極が支配的になり、電圧も容量も定量的に外れる |
| それ以上 | — | DFN では電解液の局所枯渇($c_e \to 0$)が起き得るが、SPM はその兆候すら出せない |
なぜずれるのかを §2.1 の見積もりで説明できます。 SPM が無視した電圧損失は主に 2 つ、いずれも電解液由来です(総称して電解液分極):
- 液相オーム損: $\Delta\phi_e \sim \dfrac{I L}{2\kappa^{\mathrm{eff}}}$。 1C で電極・セパレータ合計 約 30 mV。レートに比例して増えます。
- 濃度分極:$\Delta c_e \sim 570$ mol/m³ × (I/I₁C) の濃度勾配が (DFN-4) の第 2 項を通じて作る電位差 $\dfrac{2RT}{F}(1 - t_+^0)\ln\dfrac{c_e(\text{正極側})}{c_e(\text{負極側})}$。 1C で約 20 mV ですが、$\Delta c_e$ が $c_{e0}$ に近づく 2C 以上では 対数が効いて急速に成長します。 さらに $c_e$ の低下は $\kappa$ と $i_0$ 自体も下げるため、損失は雪だるま式に増えます。
合計すると 1C で 50 mV 程度 — これが上の表の誤差の正体です。 加えて高レートでは $j(x)$ の非一様性(仮定 (ii) の破れ)により、 セパレータ付近の粒子が先に働いて先に疲れる「反応の偏り」が生じますが、 SPM はこれも表現できません。
まとめ — フェーズ3への橋渡し
SPM の弱点は「電解液を捨てたこと」に尽きます。 では、電解液の式 (DFN-2) だけを復活させ、 $c_e(x,t)$ の分布から液相の電位損失を補正項として電圧式 (2.10) に 足し込んだらどうなるでしょうか。 それが次章の SPMe(SPM with electrolyte)です。 偏微分方程式は 3 本(球 2 + 電解液 1)に増えるだけで、 1–2C までの精度が劇的に改善します。 「どの物理を捨て、どの物理を拾うか」というモデル階層の考え方を、 SPM → SPMe → DFN の 3 段で体験していきます。
理解度チェック
理解度チェック(5 問)
-
LG M50 セル($a^+ L_p = 28.9$)を 2C($I = 97.4$ A/m²)で放電するとき、 正極の反応電流密度 $j^+$ を符号込みで求めよ。 また充電(2C、$I = -97.4$ A/m²)ではどうなるか。
解答
式 (2.2) より $j^+ = -I/(a^+ L_p) = -97.4/28.9 = -3.37$ A/m²。 負号は還元(Li が粒子に入る)を表し、放電時の正極の役割と整合します。 充電では $I < 0$ なので $j^+ = +3.37$ A/m² と符号が反転し、 正極粒子から Li が抜けます(酸化)。
-
平均濃度の式 (2.5) $d\langle c_s\rangle/dt = -3j/(FR_s)$ には 拡散係数 $D_s$ が現れない。なぜか。 では $D_s$ はどこに効くのか、図2.2 の観察と結びつけて説明せよ。
解答
(2.5) は拡散方程式の体積積分から出る保存則で、 「粒子に出入りする Li の総量 = 表面流束 $j/F$ × 表面積」だけで決まります。 拡散は粒子内部で Li をどう分配するかを決めるだけで、 総量の帳簿には関与しません。 $D_s$ が効くのは表面濃度と平均濃度の差 (準定常で $\Delta c = jR_s/(5FD_s)$、式 (2.6))です。 図2.2 で $D_s$ 倍率を下げると、破線(平均)の動きは変わらないのに 実線の表面端だけが深く沈み込み、電圧が早く落ちることが確認できます。
-
充電時($I < 0$)の $j^-, j^+, \eta^-, \eta^+$ の符号をすべて述べ、 端子電圧が OCV より高くなることを式 (2.10) から示せ。
解答
$I < 0$ より式 (2.1)(2.2) から $j^- < 0$(負極に Li が入る=還元)、 $j^+ > 0$(正極から Li が出る=酸化)。 $\mathrm{asinh}$ は奇関数なので式 (2.8) から $\eta^- < 0$、$\eta^+ > 0$。 式 (2.10) に入れると、$[U_p + \eta^+]$ は増え、引かれる項 $[U_n + \eta^-]$ は減るので $V = V_{\mathrm{OCV}} + \eta^+ - \eta^- > V_{\mathrm{OCV}}$。 充電器は OCV より高い電圧を押し付けてエネルギーを注ぎ込む、という直感と一致します。
-
$|j| \ll 2 i_0$ のとき、式 (2.8) が $\eta \approx \dfrac{RT}{F}\dfrac{j}{i_0}$ と線形化できることを、 $\mathrm{asinh}$ のテイラー展開($\mathrm{asinh}\,x = x - x^3/6 + \cdots$)から示せ。 この線形係数 $R_{ct} = RT/(F i_0)$ を LG M50 の負極(100% SOC、 $i_0^- = 0.202$ A/m²)について数値で求めよ。
解答
$x = j/(2i_0)$ とおくと $|x| \ll 1$ で $\mathrm{asinh}\,x \approx x$。よって $\eta \approx \dfrac{2RT}{F}\cdot\dfrac{j}{2i_0} = \dfrac{RT}{F}\dfrac{j}{i_0} = R_{ct}\, j$。 数値は $R_{ct} = \dfrac{0.0257\ \mathrm{V}}{0.202\ \mathrm{A/m^2}} = 0.127$ Ω·m² (界面 1 m² あたり)。 セル面積あたりに直すには反応面積の増幅率 $a^-L_n = 32.7$ で割って $0.127/32.7 = 3.9\times10^{-3}$ Ω·m² — 1C(48.7 A/m²)を掛けると約 190 mV…ではなく、 この動作点では $x = 3.68$ で線形近似の適用範囲外なので、 正しい値は式 (2.8) の 103 mV になります(§2.5)。 線形化の適用条件を確認する良い例です。
-
図2.2 で 5C 放電すると、電圧が 2.5 V に達する前に 「正極表面の飽和」で計算が終わることがある。 このときセルの平均 SOC はまだ 3 割残っている。 (a) なぜ容量を取り出しきれないのか、 (b) 実測ではこの現象はもっと早いレートで現れる。SPM に欠けている何が原因か。
解答
(a) 電圧を決めるのは表面濃度です(式 (2.9)(2.10))。 正極内部への拡散が追いつかず表面だけ $c_{s,\max}$ に達すると、 $i_0^+ \to 0$ で $\eta^+ \to -\infty$ となり端子電圧が急落します。 内部(平均)に空きがあっても、Li を受け入れる窓口(表面)が塞がれば 放電は続けられません。これが拡散律速による容量損失です。 (b) 実セルではさらに電解液分極(液相オーム損・濃度分極、§2.9)が 重なり、同じ電圧下限には より低いレートで到達します。 電解液の塩濃度が局所的に枯れる効果も SPM にはありません。 これらを部分的に取り込むのが次章の SPMe です。
次章へ:SPM は「固体の物理だけの電池」でした。 フェーズ3では、捨てた電解液の物質保存 (DFN-2) を復活させて濃度分布 $c_e(x,t)$ を解き、 その分布が作る電位損失を電圧式に足し込む SPMe を導出します。 この章で作った球拡散ソルバはそのまま再利用します。