锂电池在充放电过程中的失效问题,很多都跟应力有关:颗粒开裂、电极粉化、容量衰减,根源往往不在电化学,而在力学。做电池仿真的人迟早会碰到一个问题——活性颗粒内部的锂离子浓度分布不均匀,导致颗粒体积膨胀不均匀,从而产生内应力。这个扩散诱导应力,光靠实验测不好测,靠解析解只能处理理想化球形颗粒,复杂工况基本算不动。所以我把这套基于Comsol的活性颗粒尺度应力应变模型完整梳理了一遍,从物理原理、方程建立到参数设置和排查技巧,希望能帮你少走弯路。
这套模型解决的核心问题,是把“电化学-扩散-力学”三个物理过程耦合在一起,在颗粒尺度上还原锂离子浓度梯度和应力场的分布情况。它主要面向三类人:做锂电池机理研究的工程师、做电池寿命预测与失效分析的同行,以及正在学习多物理场仿真、想找一个经典耦合案例练手的学生。如果你只是想看最终结论,网上论文很多;但如果你想自己上手把模型跑通,这篇文章应该能给你省下不少摸索时间。
1. 为什么要做活性颗粒尺度的应力模型
1.1 从电芯、电极到颗粒的三层尺度
锂电池的多物理场仿真可以按空间尺度分成好几层。电芯尺度关注的是温度场、电流密度分布和SOC不均,特征尺寸在厘米到米的量级;电极尺度关注的是多孔电极内部的液相浓度、电势分布,特征尺寸在百微米到毫米量级;而活性颗粒尺度关注的则是单个颗粒内部的锂浓度、应力状态,特征尺寸通常在微米量级。
很多容量衰减的根因,恰恰发生在最小尺度的颗粒上。负极石墨颗粒在嵌锂过程中体积膨胀可以达到10%左右,硅负极更是夸张,理论体积膨胀超过300%,颗粒内部会产生极大的应力梯度,超过断裂强度之后颗粒就裂了。颗粒开裂意味着新的固液界面暴露出来,SEI膜反复生长、电解液持续消耗、活性物质损失,这些在电芯尺度看到的现象,源头在颗粒尺度。
所以,如果你想研究“为什么这个电池衰减这么快”“为什么快充几次之后容量跳水”,只建一个电芯尺度的均质化模型是不够的,那里面没有力学信息。必须下沉到颗粒尺度,把扩散诱导应力算出来,才能解释失效的物理机制。
1.2 扩散诱导应力到底是什么
扩散诱导应力的通俗理解是这样的:锂离子嵌入到颗粒内部,相当于往一个固定体积的“房间”里不断塞人。如果塞得均匀,房间均匀膨胀,不会产生太大应力;但如果外面的人先挤进去、里面的还没来得及挪动,就会形成“外面挤、里面空”的浓度梯度。浓度高的区域膨胀得多,浓度低的区域膨胀得少,相邻区域之间互相约束,应力就产生了。
从力学角度看,这个过程和热应力非常像。热应力是温度分布不均匀引起热膨胀不均匀,扩散应力是浓度分布不均匀引起“化学膨胀”不均匀。所以很多人在Comsol里模拟扩散诱导应力时,直接用固体的“热膨胀”节点来等效浓度膨胀——这种类比在数学上是完全成立的,只要把温差换成浓度差、热膨胀系数换成偏摩尔体积相关的系数就行。
颗粒表面的应力状态和中心往往是相反的。嵌锂过程中,表面锂浓度高、膨胀大,中心锂浓度低、膨胀小,表面受的是压应力,中心受的是拉应力;脱锂过程反过来。而最大拉应力出现在哪里、什么时候接近材料的断裂强度,这些都是模型可以回答的问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 物理本质:扩散—应力耦合方程与关键材料参数
2.1 核心方程与变量定义
先理清这个模型包含的物理场。
第一个场是浓度场。球对称颗粒内部的锂离子扩散方程是:
∂c/∂t = (1/r²) × ∂/∂r (r² × D × ∂c/∂r)
其中c是锂浓度(单位mol/m³),D是扩散系数(单位m²/s),r是距离颗粒中心的径向距离。这个方程表述的是一个从边界向中心扩散的过程,前提是颗粒是球形、浓度场球对称,这也是目前绝大多数文献采用的近似。
第二个场是位移/应力场。基于弹性力学的小变形假设,本构方程写成:
σ = C : (ε − ε_c)
其中ε_c是浓度引起的非弹性应变(化学应变),表达式为:
ε_c = (Ω/3)(c − c₀)I
这里Ω是偏摩尔体积(单位m³/mol),表示每嵌入1mol锂离子引起的体积变化;c₀是初始锂浓度;I是单位张量。这个公式和热应变ε_th = α(T − T_ref)的形式完全一样,只是把热膨胀系数α换成了Ω/3,把温度差换成了浓度差。
在Comsol里,你可以直接使用固体力学模块的“热膨胀”节点,把温度变量替换成浓度变量c,等价地施加浓度膨胀。这是最容易实现的方式,但要注意单位换算:热膨胀系数的单位是1/K,而Ω/3的单位是m³/mol,所以不能直接把Ω/3填到热膨胀系数栏里,而是要把浓度c的单位从mol/m³变成一个等效的“无单位量”或直接在表达式中用c[mol/m³]的形式处理。我更推荐的做法是在热膨胀节点的“膨胀系数”栏里填 (Omega/3)*(c-c0) 这样的整体表达式,而不是拆成系数×变量。
2.2 材料参数的确定与量级
模型算得准不准,参数是关键。以下是我在建模时常用的典型参数范围。
| 参数 | 符号 | 典型值 | 备注 |
|---|---|---|---|
| 颗粒半径 | R | 5–15 μm | NMC正极常见5-10μm,石墨负极8-15μm |
| 扩散系数 | D | 1e-15–1e-13 m²/s | 正极通常比负极低 |
| 杨氏模量 | E | 100–200 GPa(正极),10–30 GPa(石墨) | 注意硅只有80GPa左右 |
| 泊松比 | ν | 0.2–0.3 | 陶瓷材料取0.2,石墨取0.3 |
| 偏摩尔体积 | Ω | 3.0–4.5e-6 m³/mol | 石墨约3.2e-6,NMC约3.5e-6 |
| 初始浓度 | c₀ | 0–5000 mol/m³ | 取决于SOC |
| 最大浓度 | c_max | 25000–32000 mol/m³ | 材料固有属性 |
扩散系数的影响特别大。在室温下,NMC正极的锂扩散系数在1e-14到1e-15 m²/s量级,这意味着对于一个10微米的颗粒,扩散特征时间τ = R²/D大约在10到100秒量级,脉冲电流充放电时浓度梯度很容易拉大,应力集中就明显。很多文献中之所以用较大的扩散系数,其实是为了在短时间内跑完模拟,这种做法在趋势研究上没问题,但如果要定量预测应力,必须用真实扩散系数。
还有一个关键点:浓度上限c_max决定了颗粒的嵌锂饱和程度。SOC不应当简单地设置为c=c_max,而是要预设一个最大浓度变化量Δc_max,然后通过电流倍率C-rate来控制表面的锂离子通量:
J = i / F = (C-rate × c_max × R) / (3F × t_charge)
这里F是法拉第常数,C-rate是充放电倍率,t_charge是充电时间。这个通量就是浓度场表面的边界条件。
3. 基于Comsol的建模实操全流程
3.1 几何与单位设定
在Comsol中新建模型时,空间维度选择“二维轴对称”是最稳妥的。球形颗粒的截面是一个半圆,二维轴对称意味着这个半圆绕对称轴旋转360度得到完整球体。相比直接建三维模型,二维轴对称省掉了一个方向的自由度,计算速度大大提高,而物理结果完全等价。
几何结构就是最简单的四分之一圆或半圆。如果画半圆,旋转后是完整球;如果画四分之一圆,需要配合对称边界条件。我这里推荐直接画半圆,然后利用二维轴对称的默认条件,在对称轴上自动施加轴向约束,模型更直观。
几何画好后,检查一下单位。Comsol默认几何单位是米,如果你习惯用微米,可以在“几何”节点的“单位”设置中改为μm,但不建议这样做——后续在物理场和表达式中,单位混用是初学者最容易踩坑的地方。我的建议是:所有几何尺寸都用微米输入,但物理场中的单位全部用国际单位制,即长度用m、浓度用mol/m³、应力用Pa。Comsol会自动处理几何和物理场的单位换算,只要你输入时标注清楚单位。
3.2 物理场选择与耦合方式
在“添加物理场”中,需要同时加入两个物理场接口:“固体力学(solid)”和“稀物质传递(tds)”。
耦合方式是整个模型的核心。前面讲过,浓度场通过体积应变影响应力场,而应力场对浓度场的影响(即应力对扩散的促进作用,比如拉应力区更容易嵌锂)在这个模型中通常忽略不计。忽略的原因是:应力对扩散的耦合项在常温常压下量级很小,对最终应力结果的影响通常在1%以内,计算成本却会显著增加。所以在大多数文献中,都采用单向耦合——先算浓度场,再看应力场。
在“固体力学”中添加“热膨胀”子节点,把输入温度改为浓度c。具体操作:在“热膨胀”节点的“膨胀系数”栏中填写表达式 (Omega/3)*(c-c0),并在“膨胀参考温度”栏中填写0——因为表达式里已经包含了参考浓度c₀,相当于我们手动做了“浓度差”。很多人在这里卡住:如果在“膨胀系数”栏里只填Omega/3,而把“膨胀参考温度”填成c0,Comsol会因为单位不匹配而报错,或者结果根本不对。所以最好的做法是把整个浓度差乘进去。
3.3 边界条件与初始值设置
浓度场(稀物质传递)的边界条件设置如下:
-
颗粒中心(r=0):对称边界,即通量为0,这是二维轴对称模型的默认特征,不需要手动加。
-
颗粒表面(r=R):通量边界,通量大小等于前面计算的J = i/F。在Comsol中,稀物质传递模块有一个“通量”边界条件,可以在其中输入通量表达式。注意这个通量的符号:锂离子嵌入颗粒内部,表面通量方向指向颗粒内部,按Comsol的外法线定义,应该是负值。
-
初始浓度:整个域设为c₀,通常取0或一个正值表示初始嵌锂状态。
固体力学模块的边界条件更为简单:
- 颗粒中心:因为对称性,径向位移为0。在二维轴对称中,只需要在对称轴上施加“滚支”边界条件(即法向位移为0)。
- 颗粒表面:自由边界,不施加任何力,因为颗粒在电解液中没有机械约束,可以自由膨胀。
这里有一个容易忽略的细节:颗粒表面是自由的,但如果做的是“颗粒嵌入在电极骨架中”的模型,表面应该有约束,这时需要在表面施加弹簧边界或指定位移。基础单颗粒模型通常不加这个约束,计算得到的应力是“无约束膨胀”下的应力,它反映了浓度梯度本身产生的应力。
3.4 网格划分与求解器设置
网格划分上,浓度梯度主要出现在表面附近,所以表面边界层的网格必须加密。我通常的做法是使用“边界层”网格:在颗粒表面添加5到10层边界层,第一层厚度设为R/1000,增长率1.2到1.3。核心区域使用自由三角形网格或映射网格(如果是1D模型则用边界层网格),全局最大单元尺寸设为R/20。
在求解器设置上,这是一个典型的瞬态扩散-力学问题,时间尺度跨度比较大。我用过两类求解器:
- 如果你关注充放电过程的完整时间演变,可以用“瞬态”求解器,时间步设置为从0到充电总时间,初始步长取总时间的1/100,最大步长取总时间的1/20。时间步进方法用BDF,阶数2,这样可以兼顾稳定性和精度。
- 如果你只想看某个特定时刻的应力分布,可以先算一个稳态解,或者用“辅助扫描”扫不同SOC状态。
有一个实操经验:如果模型一直不收敛,先检查是不是扩散系数太小导致浓度场的时间步长太短。此时可以启用“自适应时间步长”功能,并在求解器配置中把“允许非线性”设置为“自动”,把“最大迭代次数”提高到25左右。
3.5 后处理:如何提取有价值的力学量
算完之后,大多数人第一反应是看应力云图,但云图不够直观,我建议通过“一维绘图组”来提取沿径向的应力分布。在结果节点中,创建一个“一维绘图组”,设置“线图”沿颗粒半径从中心到表面画一条线,纵轴分别显示:
- 径向应力σ_rr:反映垂直于径向截面上的正应力。
- 切向应力σ_θθ(环向应力):反映沿周向的应力分量,这是颗粒中最容易出现拉应力的方向。
最重要的指标是最大主应力和最大剪切应力。在“表面图”的表达式栏中输入 solid.mises可以得到Von Mises应力,但要注意:对于陶瓷类的颗粒材料,脆性断裂更适合用最大主应力准则来判断,所以我会额外输出 solid.sp1(最大主应力),并追踪它在整个时间序列中的最大值。
另外,建议在“派生值”中用“体平均”计算颗粒整体的平均应力和体积应变,并用“全局计算”监控颗粒表面最大的应力值随时间的变化。这样可以直接导出“最大应力-时间”曲线,用来判断在哪个时间点出现了应力峰。
4. 典型模拟结果与参数化分析
4.1 初始算例:恒流嵌锂的应力演变
以一个10 μm半径的NMC正极颗粒为例,扩散系数取5e-15 m²/s,杨氏模量120 GPa,泊松比0.3,偏摩尔体积3.5e-6 m³/mol,以1C倍率从空电态充到满电态,充电时间3600秒。
浓度场的结果符合预期:充电初期,表面浓度快速上升,中心浓度暂时滞后,形成显著浓度梯度;随着时间推移,锂离子逐渐扩散进入颗粒内部,浓度梯度逐渐减小,最终趋于均匀。
应力场的演变呈现一个有趣的现象:最大拉应力并不出现在充电结束的时候,而是出现在充电初期某个时间点。原因是:初期表面浓度和中心浓度差别最大,浓度梯度最陡,化学应变差异最大,应力自然处于峰值;到了后期浓度均匀化,虽然整体体积膨胀变大,但梯度驱动力下降,应力反而降低。这个结论直接否定了“充到越满越容易开裂”的朴素认知——实际上最容易开裂的时刻是充放电曲线的中段,前提是材料断裂强度在这个区间被超过。
这个结论对实际电池管理有价值:如果你识别出了某个电池最容易开裂的工作区间,可以通过调整充电策略(比如在这个区间降低电流)来避免应力峰值,这就是模型指导充放电策略优化的一种方式。
4.2 倍率与颗粒尺寸对最大应力的影响
通过参数化扫描,可以快速得到不同倍率和颗粒半径下的最大应力。我做过一组对照实验:
在固定颗粒半径时,把C-rate从0.5C、1C、2C、4C逐级升高。结果是:倍率越高,表面锂通量越大,浓度梯度越陡,最大应力几乎线性增长。4C充电时的最大应力大约是1C充电时的2.5到3倍,这个趋势和文献中硅负极、石墨负极的实验观察一致。
在固定倍率时,把颗粒半径从5μm、8μm、10μm、15μm逐级增大。结果是:最大应力随半径增大而增大,且近似呈平方关系。原因也很好理解:扩散时间常数τ=R²/D,半径越大,锂离子越不容易扩散到颗粒内部,浓度梯度越大。这从数学上直接支持了“纳米化颗粒缓解应力开裂”的工艺路线——硅负极做纳米化,不只是为了缩短扩散路径提升倍率性能,同时对降低扩散诱导应力也至关重要。
这个参数化扫描在Comsol里实现起来非常方便。在“研究”节点的“参数扫描”中,把半径R或C-rate设为扫描参数,设置好扫描范围,求解器会自动批量计算。每扫一轮,导出一组“最大应力-时间”曲线,可以直接在原点或Excel里拉对比,图表做出来投稿或者写报告都很出彩。
4.3 颗粒形状效应的延伸讨论
很多做实际电极的工程师会问:真实颗粒不是规则球形,模型简化成球形还有意义吗?我的回答是:球形模型的意义不在于还原每一个颗粒的真实形状,而在于建立“颗粒尺寸-扩散-应力”之间最简洁的定量关系。真实颗粒形状带来的应力集中系数,通常可以通过乘以一个形状因子来修正,而这个形状因子可以从椭球或壳层模型另行标定。
Comsol里处理非球形颗粒也很成熟:可以建二维轴对称的椭球、圆柱、或者多面体,也可以用“凹多边形”构造不规则截面。核心的物理设置不用变,只是几何和网格需要调整。我个人建议,如果想系统研究形状效应,先跑球形模型建立基线,再逐步替换成椭球、截断八面体等形状,不要一上来就做三维真实颗粒的随机堆积,那个计算成本会非常夸张。
5. 常见问题与排查技巧实录
5.1 模型不收敛,怎么定位问题
这是建模过程中最常遇到的情况。我整理了遇到过的几类典型问题,以及对应的排查方法。
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 求解器在初始时间步就报错 | 耦合条件定义有误 | 先单独计算浓度场,确认浓度正常后再开启固体力学耦合 |
| 浓度场出现负值 | 通量符号写反 | 检查表面的“通量”边界条件的符号,外法线朝向颗粒外侧,嵌入时应为负 |
| 应力值数量级异常(如1e12 Pa) | 单位混用,浓度单位不一致 | 检查c、c0、Ω的单位,确认mol/m³与m³/mol的组合 |
| 应力云图对称性破坏 | 网格不对称或边界条件不对称 | 检查几何是否为半圆、边界层网格是否均匀 |
| 跨物理场耦合缺失 | 热膨胀节点里填了温度而不是浓度 | 确认膨胀系数表达式中使用的是tds中的c,而不是默认的T |
排查这类问题有一个固定思路:先拆后合。也就是把模型拆成纯扩散问题和纯力学问题分别验证。纯扩散问题可以查看浓度云图,看是否符合扩散规律;纯力学问题可以给一个固定的浓度分布(比如用阶跃函数设置一半区域浓度高、一半低),看应力是否对称分布。两步分别确认正确之后,再耦合回去,问题通常就浮出水面了。
5.2 应力结果“小了”或“大了”怎么判断
很多初学者看到应力结果在几十MPa到几百MPa之间,不知道这个量级对不对。这里给一个量级判断的依据:铝箔的屈服强度大约在100MPa量级,陶瓷态的正极材料断裂强度在百MPa量级,石墨的断裂强度在30-60MPa。如果你的石墨负极模型在正常1C倍率下算出了300MPa的应力,那要么是参数单位错了(比如把MPa当Pa输入),要么是边界条件施加了额外的约束。硅负极的情况特殊,应力上千MPa也可能出现,因为硅本身的体积膨胀极大,但要注意此时小变形假设可能已经不成立,需要切换到大变形或引入塑性模型。
如果应力结果“小了”,先检查是否忘了减去初始浓度c₀。如果边界条件中用的是绝对浓度而不是浓度差,当初始浓度本身就是几千mol/m³时,应力值会显著偏大。反之,如果忘记设置初始浓度,从0开始算,应力又会偏小。这个错误很隐蔽,我踩过一次,整整排查了一天。
5.3 两个进阶问题的处理参考
关于网格移动。有些文献会提到用移动网格处理颗粒边界移动的问题——因为颗粒膨胀后半径变大,边界位置不再是固定的。但在这个模型中,我建议不要用移动网格:一是扩散诱导的体积变化通常小于10%,小变形假设下固定网格的误差可以忽略;二是移动网格会让网格畸变,容易导致不收敛。如果你真的需要追踪颗粒半径的变化,可以在后处理中通过体积应变计算等效半径变化,而不必动网格。
关于参数耦合。如果你想考虑应力对扩散的影响,需要在稀物质传递中添加一个额外的通量源项,形式通常是 −(ΩcD/RT)∇σ_h,其中σ_h是静水应力。这个耦合项让方程变成双向耦合,求解难度会明显上升,初期不建议加。先跑通单向耦合模型,再逐步加复杂度,这个方法论在所有多物理场建模中都适用。
写在最后的一个实操建议
我个人在实际操作中的体会是:建这个模型最大的难点不在操作,而在于搞清楚你到底想问什么问题。如果只想看应力分布趋势,单向耦合+固定网格+球形颗粒已经足够了;如果你想研究颗粒开裂之后的应力释放机制,那就要引入裂纹或内聚力模型;如果关注循环寿命,就要考虑应力和SEI膜生长的联合作用。模型复杂度永远服务于科学问题,先跑通最简单的版本,再一步步加物理细节,这条路最稳。
最后再分享一个小技巧:做好这个模型之后,建议把全局参数(R、D、Omega、E、C-rate等)全部定义在“参数”节点中,养成参数化建模的习惯。这样后续做参数扫描就不用反复改边界条件,直接在参数节点改数据,两分钟就能跑完一组对比。很多同行把这套模型跑通了之后,会把它作为电极寿命模型的子模块嵌入更大尺度的计算框架里,如果你有这方面的计划,从一开始就要注意接口变量命名规范,避免后面返工。
