ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

基于Matlab的锂离子电池宽频EIS阻抗谱计算与拟合实践

基于Matlab的锂离子电池宽频EIS阻抗谱计算与拟合实践

锂离子电池的阻抗特性,说白了就是电池在充放电过程中内部电荷传递、离子扩散、界面膜形成等一系列物理化学过程的综合体现。之前做项目时,我花了不少时间在某一充电状态下测一条完整的宽频阻抗谱,测完还要手工分段拟合,一个数据点一个数据点地挑,效率非常低。后来我把这套流程整理成了一套基于Matlab的计算脚本,核心是:在不同充电状态(State of Charge, SOC)下,自动完成宽带电化学阻抗谱(EIS)的数值计算与拟合。这篇博文就把整个研究思路、原理、实现步骤和踩过的坑写清楚,希望对正在做电池建模、BMS算法或老化诊断的同行有帮助。

1. 为什么要在不同充电状态下测量阻抗谱

锂电池的阻抗不是一个固定值。同一个电芯,在10%电量和80%电量下,测出来的Nyquist图差异非常大。原因在于,不同SOC对应着不同的电极材料嵌锂浓度、不同的电解液界面状态、甚至不同的温度分布,这些都会直接影响电荷传递电阻和扩散阻抗。

1.1 SOC对阻抗影响的物理本质

负极石墨材料的嵌锂过程分阶段进行。低SOC时,石墨负极表面锂离子浓度低,界面电荷传递反应速率慢,所以电荷传递电阻偏大;随着SOC升高,负极嵌锂量增加,反应活性增强,中段SOC区间的电荷传递电阻通常最小。正极材料(比如三元或磷酸铁锂)也有类似规律,而且正极的相变过程会在特定SOC附近导致阻抗特性突变。

除了电极本身,SEI膜(固体电解质界面膜)的阻抗、电解液中的离子电导率也会随SOC变化。特别是低温或高倍率条件下,同一个电芯在不同SOC下的阻抗差异会更加明显。这也是为什么BMS在做状态估计时,不能简单用一条固定的阻抗曲线去描述电池的动态特性。

1.2 宽频阻抗谱的特殊价值

传统EIS测试通常只覆盖10kHz到10mHz左右的频率范围,但宽频EIS会把频率下限扩展到μHz级别,或者把上限推到MHz级别。低频段主要反映锂离子在活性颗粒内部的固相扩散过程,这对判断电池的老化状态、析锂风险非常关键;高频段则能解析接触阻抗和电解液电阻的细微变化。把全频段的阻抗数据整合起来,才能更完整地描述电池内部各过程的动力学参数。

从工程角度讲,不同SOC下的宽频阻抗谱数据是电化学模型参数辨识的基础。比如基于pseudo-two-dimensional(P2D)模型的参数校准、等效电路模型的参数辨识、甚至基于阻抗谱的快速SOH估计,都依赖于这套数据。

2. 实验设计与数据获取:宽频EIS不是简单扫个频率

要计算不同SOC下的宽频阻抗谱,首先得有一套可靠的实验方案。这里我用的对象是商用18650三元电芯,标称容量2.5Ah,测试温度为25摄氏度恒温环境。

2.1 硬件配置与测试流程

EIS测量通常用电化学工作站完成,但宽带阻抗谱对设备要求比较高。我选择的方案是:电化学工作站配大电流放大器,频率范围从10mHz到100kHz,每个频率点至少采集5个周期取平均。整个测试流程按下面几步走:

  1. 先用标准1C恒流恒压(CC-CV)流程把电池充满,静置2小时让电池内部达到平衡态。
  2. 以0.5C电流放电到目标SOC,比如每10%设一个测试点,从100%、90%、80%……一直测到10%。
  3. 每到一个SOC点,静置1小时以上,确保开路电压稳定、浓度梯度充分弛豫。
  4. 依次施加正弦激励信号,振幅设为电池电压的5mV左右,避免大信号激励引起非线性效应。
  5. 完整采集阻抗谱后,再把电池继续放电到下一个SOC点。

有个细节需要注意:放电到中间SOC点时,电压下降速度比较快,如果静置时间不够,测出来的阻抗谱中低频段会带明显的漂移。我做过对照实验,静置30分钟和静置2小时测出来的低频扩散弧差别很大,后者的重复性明显更好。

2.2 数据有效性校验

电化学阻抗谱测量有个基本校验规则,叫做Kramers-Kronig(KK)检验。意思是说,对于一个稳定的线性时不变系统,实部和虚部之间存在确定性的积分关系。如果实验测出来的数据不满足KK关系,说明系统不稳定,数据不可信。

我最初测的几个SOC点,低频段KK检验残差特别大,检查了很久才发现是夹具接触不良导致的高频抖动。换成压力夹具并重新打磨极耳接触面之后,残差降到了0.5%以内。建议大家在做正式拟合之前,先把所有阻抗数据过一遍KK检验,这是最基本的数据质量门槛。多数商用EIS软件自带这个功能,Matlab里也可以用自定义积分核函数实现。

2.3 多SOC下的典型阻抗图谱特征

把所有SOC点的Nyquist图叠在一起可以看到非常明显的变化趋势。低SOC区域(10%-30%),高频区半圆明显更大,说明电荷传递电阻偏大;中SOC区域(40%-70%),半圆直径缩到最小,整体阻抗最低;高SOC区域(80%-100%),半圆又逐渐增大。低频扩散支线在低SOC时倾斜角更接近45度慢扩散特征,高SOC时则更偏向纯电容行为。

这些图谱特征直接对应着电池内部的微观过程变化。拟合的时候如果只用一个固定拓扑的等效电路去套所有SOC点,一定会出问题,因为不同SOC区间主导的物理过程发生了变化。

3. 等效电路模型与参数辨识:从ZView走向Matlab自动化

等效电路模型(ECM)是锂离子电池EIS分析的经典工具。常见的拓扑有一阶RC、二阶RC、含Warburg元件的扩散模型等。针对宽频EIS数据,我推荐使用R + (R//CPE) + (R//CPE) + W这种结构,也有人会把高频感应支路加进去,但一般情况下用不到。

3.1 为什么用CPE而不是纯电容

实测的EIS半圆圆心通常不在实轴上,而是下沉到实轴下方,这说明电极界面存在弥散效应,用理想电容无法描述。于是引入常相位角元件CPE,其阻抗表达式为:

Z_CPE = 1 / (Y0 * (j*w)^n)

其中n的取值范围是0到1。n=1时CPE退化为理想电容,n=0时退化为纯电阻。n值偏离1的程度可以反映电极表面的粗糙度、孔隙率和电流分布不均匀性。在拟合中,n通常作为自由参数参与优化,初始值设在0.8到0.95之间比较合理。

用CPE替换纯电容以后,拟合残差能显著下降。特别是覆盖宽频范围时,纯电容模型在高频段和低频段的拟合偏差会叠加,CPE能够用更少的参数达到同样的拟合精度。

3.2 参数辨识的目标函数与权重

阻抗拟合适用的目标函数是最小化加权实部和虚部残差的平方和。但要注意,宽频EIS数据的实部与虚部数值跨了多个量级,高频段阻抗值可能只有几十毫欧,低频段扩散阻值可能到几百毫欧。如果不加权,最终拟合会偏向大数值区域。

我用的加权方式是每个频率点的权重取该点阻抗模值的倒数,等效于在相对误差层面进行拟合。这样可以保证全频段的数据点对拟合结果都有贡献,而不会让低频大阻值点主导整个优化过程。

3.3 Matlab实现的核心流程

这部分直接给核心框架,完整的脚本结构包括:数据导入、初始参数设置、加权最小二乘优化、结果输出与绘图。优化函数用的是Matlab自带的lsqnonlin,然后配上自己写的阻抗模型函数。

function Z = eis_model(w, P) % P参数顺序: R0, R1, Y01, n1, R2, Y02, n2, Yw R0 = P(1); R1 = P(2); Y01 = P(3); n1 = P(4); R2 = P(5); Y02 = P(6); n2 = P(7); Yw = P(8); Z_CPE1 = 1 ./ (Y01 * (1j*w).^n1); Z_CPE2 = 1 ./ (Y02 * (1j*w).^n2); Z_W = 1 ./ (Yw * sqrt(1j*w)); % 简化的Warburg阻抗 Z = R0 + 1 ./ (1./R1 + 1./Z_CPE1) + ... 1 ./ (1./R2 + 1./Z_CPE2) + Z_W; end

初始参数不能乱给。R0可以从最高频点的实部读出来,R1和R2可以按半圆直径粗略估计,Y0的初始值用半圆顶点频率反推。如果初始值偏离太远,lsqnonlin很容易收敛到局部极小值。我建议多组初始值并行拟合,然后比较目标函数值,选择全局最优结果。

4. 宽频阻抗谱的计算逻辑与Matlab代码实现

这一节是全文实操性最强的部分,我直接拆开来讲。

4.1 频率轴的生成与激励信号参数

宽频EIS数据计算的首要问题是频率轴划分。我采用对数均匀分布:10mHz到100kHz范围内按每十倍频程20个点的密度生成频率向量。低频点需要更长的稳定时间,实际测试时为了保证信噪比,单点测量时长超过2秒,整条谱测下来大约需要40分钟。

f_min = 1e-2; % 10 mHz f_max = 1e5; % 100 kHz points_per_decade = 20; decades = log10(f_max) - log10(f_min); f = logspace(log10(f_min), log10(f_max), round(decades * points_per_decade)); w = 2 * pi * f;

计算阻抗响应时,激励信号幅度按线性系统处理,直接由传递函数计算。实际使用中,为了让计算更贴近实测,可以把激励信号和响应信号分别加噪声再作FFT取阻抗,但直接在频域计算更快。我的做法是前者用于验证模型,后者用于生成合成训练数据。

4.2 多SOC批量计算的组织方式

每个SOC点对应一组独立参数,所以需要把所有SOC点的数据存放在一个结构体数组里。每个SOC计算完成后,把拟合参数、残差、拟合曲线和实测数据一起存储。

SOC_points = [100 90 80 70 60 50 40 30 20 10]; results = struct('SOC', {}, 'params', {}, 'Z_fit', {}, 'Z_exp', {}, 'residual', {}); for k = 1:length(SOC_points) soc = SOC_points(k); [Z_exp, f] = load_eis_data(soc); % 读取实验数据 w = 2 * pi * f; P_init = initialize_params(soc); % 基于SOC设定初始值 P_fit = lsqnonlin(@(P) obj_fun(P, w, Z_exp), P_init, lb, ub, options); Z_fit = eis_model(w, P_fit); results(k).SOC = soc; results(k).params = P_fit; results(k).Z_fit = Z_fit; results(k).Z_exp = Z_exp; results(k).residual = (real(Z_fit) - real(Z_exp)) ./ abs(Z_exp) + ... 1j * (imag(Z_fit) - imag(Z_exp)) ./ abs(Z_exp); end

这段逻辑非常关键,因为不同SOC点的初始参数差异很大,完全可以在initialize_params函数里加入SOC相关的经验公式,这样能大幅降低拟合收敛失败率。

4.3 显示与输出

拟合完成之后,需要用可视化检查每个SOC点的拟合质量。我最常用的图是Nyquist图和Bode图,每条拟合曲线和实测点用不同符号标记。批量处理时,把所有SOC点放在一张图上对比,颜色用colormap映射SOC值,非常直观。

figure; colors = jet(length(results)); hold on; for k = 1:length(results) plot(real(results(k).Z_exp), -imag(results(k).Z_exp), 'o', ... 'Color', colors(k,:), 'MarkerSize', 5); plot(real(results(k).Z_fit), -imag(results(k).Z_fit), '-', ... 'Color', colors(k,:), 'LineWidth', 1.2); end xlabel('Z'' (ohm)'); ylabel('-Z'''' (ohm)'); title('不同SOC下的宽频EIS实测与拟合对比');

还有一个容易忽略的点:拟合参数随SOC的连续变化曲线。把R1、R2、Y01、n1等参数对SOC作图,可以直接看出参数随SOC的变化规律,用于后续建模时参数插值。这个图比单条阻抗谱的信息量更大,值得仔细做。

5. 拟合结果的物理解读与参数规律

计算完成后的数据处理远不止画图,参数背后有着非常具体的物理含义。

5.1 电荷传递电阻随SOC的非线性变化

我在这一组三元电芯数据里,R2(对应中低频段半圆的电荷传递电阻)在SOC 50%附近出现最小值,大约实测阻抗值的一半不到;SOC 10%时R2增大到最低点的四倍左右。这种变化趋势可以用正负极活性物质嵌锂量的变化来理解。

负极石墨在低SOC时处于单相态,锂离子嵌入需要克服较大的能垒;到中段SOC进入两相共存区域,反应活性提高;高SOC阶段接近满嵌态,界面锂离子浓度接近饱和,传质推动力下降,电荷传递电阻回升。正极材料的层状结构也会有类似的嵌锂状态变化,但转折点位置不同。正是这种多因素耦合,构成了阻抗随SOC变化的复杂规律。

5.2 CPE参数的物理对应

CPE指数n1和n2的拟合值在0.82到0.95之间波动。有趣的是,n值在中段SOC区域更接近1,说明该状态下的电极界面更像理想电容,表面反应均匀性更好;低SOC和高SOC时n值下降,反映界面反应不均匀或者存在局部浓差极化。

Y0值随SOC变化趋势与R的规律相反。考虑到CPE在物理上可以等效为分布参数网络,这个现象本质上反映了界面双电层结构在不同嵌锂状态下的差异。拟合参数之间存在耦合关系,在建模时不能独立看待。

5.3 扩散阻抗(Warburg)的处理

宽频EIS的低频段扩散支线通常不是严格的45度直线,而是出现一定的弯曲。这说明固相扩散过程并不能用理想半无限大扩散模型描述,更加精确的处理方式是用有限长度扩散元件(如Finitelength Warburg)。不过引入该元件会多出两个参数,拟合复杂度显著增加。

我的处理策略是:先只对低于1Hz的数据点单独做局部拟合,估算扩散相关的等效参数,再代入全频段全局拟合。这样全频段拟合的收敛性会好很多,扩散参数的物理意义也更明确。

6. 批量计算流程与实验复现细节

本节把从原始阻抗数据到最终图表输出的完整流程走一遍,方便直接复现。

6.1 数据处理链路总览

整条链路由五个阶段组成:原始数据导入、数据清洗与KK校验、初始参数估计、分段或全局拟合、结果存储与可视化。每个阶段对应一段独立代码,这样便于单独调试。

6.2 参数上下限设置要注意的坑

lsqnonlin里面的参数边界对于拟合成功至关重要。我用到的典型边界如下:

参数下限上限说明
R0 (ohm)0.0050.05欧姆电阻不会差太多
R1 (ohm)0.00050.05高频半圆,SEI膜相关
Y01 (S·s^n)1e-60.1CPE导纳值
n10.51.0CPE指数物理范围
R2 (ohm)0.0010.5中频电荷传递电阻
Y02 (S·s^n)1e-60.1同Y01
n20.51.0同n1
Yw (S·s^0.5)1e-610Warburg导纳,下限别设太高

边界设得太宽会导致优化器在无物理意义区域搜索;设得太窄又会漏掉真解。特别是n值,物理上不会超过1,但有些优化器在接近1时会缓慢爬行,此时可以把n的上限设为0.999,避免在边界处出现数值奇异。

6.3 自动化绘图与成果导出

批量计算完成后,我通常会生成三张图:全SOC对比Nyquist图、参数随SOC变化图、残差热力图。残差热力图的横轴是频率、纵轴是SOC,颜色表示拟合相对误差,这样能一眼找出拟合质量较差的区域。低频段和中频段的拟合残差通常偏大,这是所有分布式参数模型的共性现象,需要用权重调节来优化。

7. 过程中踩过的坑与优化经验

这里整理一下我在实际复现中最常遇到的问题,每一条都是花过时间调试出来的。

7.1 高频感抗伪迹

有些电芯在高频段会出现下半平面凸起,看起来像感抗。这个现象通常不是电池本身的特性,而是测试线缆和夹具的寄生电感效应。如果测试中忽略了这个问题,拟合时就要额外增加一个电感元件,但这会掩盖真实的高频信息。解决方法是缩短测试线缆、使用四端子连接、并在校准阶段扣除短路补偿。

7.2 低频数据漂移与不稳定性

宽频EIS低频段耗时长,电池状态可能发生缓慢变化,导致复平面数据出现螺旋状漂移。我处理的办法是让电池在测量前充分静置,同时每个频率点的测量周期数随频率自适应调整。再不行就对低频数据做趋势校正,但需要非常谨慎,不能把真实扩散行为当成漂移剔除。

7.3 拟合收敛到局部最优

阻抗谱拟合是典型的多参数非线性问题,很容易掉进局部最优解。我解决这个问题有三板斧:一是多组初始值并行拟合;二是先用解析法估算零频极限和高频极限的阻抗值来约束R0和总电阻;三是用全局优化算法(比如pswarm或simulannealbnd)先跑一遍粗糙搜索,再把结果作为lsqnonlin的初始值。

这里有个很实用的技巧:把band图中两个半圆的"顶点频率"直接读出来,反推RC时间常数,用时间常数设置R和CPE的初始耦合关系。这样初始参数基本不会偏离全局最优太远。

7.4 Matlab版本兼容性

lsqnonlin在不同Matlab版本中的算法选项不完全一致。低版本里没有trust-region-reflective算法时,会自动切换为levenberg-marquardt,输出结构字段也不同。我在脚本里做了兼容处理,依据是matlab版本号判断是否使用optimoptions。

8. 代码扩展方向:从离线拟合到在线应用

完成不同SOC下的宽频EIS计算后,这套方法可以直接往几个方向扩展。

8.1 构建SOC与温度的阻抗参数地图

把测试温度扩展到0度、10度、25度、40度,每个温度下再测一组SOC扫描。最终形成一张以SOC和温度为输入的参数映射表。这个表可以直接嵌入BMS的老化诊断或者热管理策略中。查表比在线实时拟合快得多,且不需要额外的计算资源。

8.2 老化循环中的阻抗谱追踪

电池经过长时间循环后,各SOC点下的EIS特征会发生可辨识的变化。最明显的是SEI膜电阻随循环次数增大,电荷传递电阻的变化则受温度、倍率等因素影响。通过定期测量特定SOC点的宽频阻抗谱,并对拟合参数做趋势分析,可以建立老化的非破坏性评估指标。

我在项目里实测过:某电芯循环500次后,SOC 50%点的R1(SEI膜电阻)增大了约60%,R2增大约35%,n2下降了0.08。这些趋势指标远比单纯容量衰减曲线提供更多信息。

8.3 结合机器学习做自动诊断

如果数据量足够,可以把不同SOC、不同温度、不同老化状态下的阻抗谱数据整合成训练集,用神经网络或高斯过程回归建立阻抗谱到电池状态的映射。宽频EIS数据作为输入维度很高,可以先做等效电路参数压缩,再把参数作为特征输入模型。这样能显著降低模型规模,并保留物理意义。

另外说下一个小坑:直接用全频谱数据训练模型虽然精度上限高,但每次都要求测量完整宽频EIS,在线场景耗时太长。参数压缩后的模型对测量要求就低很多,只需测量几个特征频率点就能估算状态。

9. 常见问题小结(FAQ)

把大家常问的问题集中答复一下。

9.1 为什么高频段会出现负实部现象

个别电池在极高频下实部出现负值,本质上来自分布参数网络中的相位超前效应,或者是设备量程受限导致的数据失真。用这个数据做拟合时要特别小心,建议将明显失真的高频数据裁剪掉,裁剪频率点视夹具而定,一般在100kHz以后。

9.2 等效电路阶数选择R+RC+RC还是R+RC

只覆盖中频段或者频率范围不宽时,单RC模型就够用。但宽频EIS数据跨度大,至少需要两个RC回路才能分辨SEI膜过程与电荷传递过程。用三个RC在某些情况下更好,但参数增多后拟合不稳定性上升。我的经验是先用两个RC做全频段拟合,若残差超误差容忍,再考虑增加第三个RC。

9.3 能否用最小二乘拟合后的参数直接算DOD或SOC

拟合参数与SOC高度相关,理论上可以用查表法估计SOC,但这种方法的精度受温度、老化状态影响较大。更适合的用法是把这些参数作为辅助特征,融合到无迹卡尔曼滤波器或等效电路模型中。单靠阻抗谱来做SOC估计的鲁棒性还不够。

9.4 Matlab代码能否直接用于其他类型电池

代码主体可以复用,但等效电路拓扑和参数边界需要根据电池化学体系调整。比如磷酸铁锂正极的阻抗谱在低SOC区域会出现更明显的扩散支线,低温条件下和高温条件下的表面膜特征也不同。仿真的模型参数边界要重新标定,不能拿三元电芯的参数直接套用。

10. 个人实践体会与后续计划

这套宽频EIS计算脚本在目前的十几个SOC测试点上整体效果理想,Nyquist图的拟合残差基本控制在1%以内。最大的收获是形成了参数随SOC变化的全景图像,对后续基于模型的电池状态估计帮助很大。

我在实际操作中体会到,阻抗谱拟合不仅仅是一个数值优化问题,更是一个物理认知问题。当你看到拟合参数偏离物理预期时,先别急着调算法,回头检查一下实验数据、检查一下夹具接触、检查一下静置时间,往往问题的根源在数据端而不是算法端。

最后分享一个小技巧:处理批量SOC数据时,建议把每一条阻抗谱的拟合结果都单独存档,包含原始数据、拟合参数、残差和绘图参数,这样可以追溯后续分析中的每一个数值。我吃过亏,一开始只存拟合参数,后来想重新画某个SOC点的局部放大图,还得重新跑一遍数据导入,非常浪费时间。

后续我打算把温度变量加进来,把这套脚本扩展成SOC-温度二维扫描的自动化分析工具,并尝试结合深度学习做一个阻抗谱快速预测模块。到时候再来和大家分享。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进