用Matlab计算不同SOC下锂离子电池宽带阻抗谱的完整指南

发布时间:2026/10/19 6:13:31
用Matlab计算不同SOC下锂离子电池宽带阻抗谱的完整指南 刚接触锂离子电池电化学阻抗谱Electrochemical Impedance SpectroscopyEIS的时候我总以为只要有台电化学工作站把电池夹上去扫一遍频率就能拿到一条漂亮的Nyquist图。后来真正开始用Matlab自己计算不同充电状态SOC下的宽带阻抗谱才发现问题远没有这么简单参数的SOC依赖性怎么定频率范围怎么选等效电路怎么搭每一步都直接影响谱图的形状和后续参数提取的准确性。这篇内容我就围绕“如何用Matlab计算不同SOC下锂离子电池的宽带EIS”这条主线展开。适合刚接触电池建模的研究生、做电池管理系统BMS算法开发的工程师以及所有想搞清楚“阻抗谱背后到底发生了什么”的同行。我会把模型选择、参数处理、代码实现、结果解读和常见坑都过一遍最后给出一套可以直接复现的算例。1. 为什么SOC不同阻抗谱就不同 —— 先建立物理图像很多人拿到EIS数据后第一件事就是套等效电路、拟合参数但对“为什么不同SOC下谱图会长得不一样”这件事缺乏物理层面的理解。这样做的后果是拟合出来的参数可能在数学上很漂亮物理上却完全说不过去。所以我建议先花点时间把机理捋清楚。1.1 阻抗谱里藏着哪些电化学过程锂离子电池的阻抗谱在Nyquist图上通常呈现“高中频区一个或两个压扁的半圆 低频区一条近似45度的斜线”的结构。每个特征区间对应不同的电化学过程高频区通常几千赫兹到几十千赫兹主要体现欧姆阻抗包括电解液离子电导、集流体接触电阻、隔膜阻抗等。这个部分在图上表现为实轴上的截距频率再高也没有感性或容性特征。中频区几十赫兹到几千赫兹对应电荷转移过程。锂离子在电极/电解液界面发生电化学反应产生电荷转移电阻Rct同时界面双电层电容Cdl与Rct并联形成半圆。低频区几赫兹以下对应锂离子在活性颗粒内部的固态扩散过程也就是Warburg阻抗。半无限扩散条件下阻抗虚部与实部斜率接近1在Nyquist图上呈现约45度的直线段。这里有个很关键的点实际电池中负极SEI膜、正极界面、负极界面的时间常数可能部分重叠所以图谱上的半圆往往不是标准的半圆而是被“压扁”的圆弧。这也是为什么很多人在仿真中会引入常相位角元件CPE而不是纯电容。1.2 充电状态如何改变各个过程的时间常数不同SOC下正负极材料的嵌锂浓度不同界面状态也不同。以石墨负极为例在不同嵌锂阶段锂离子在颗粒内部的扩散系数会变化电荷转移反应的交换电流密度也会随表面浓度变化。这些微观变化最终反映到宏观阻抗参数上欧姆阻抗R0对SOC的依赖相对较弱但也不是完全不变。电解液电导率随温度变化明显随SOC变化较小但在某些体系中集流体与活性材料的接触状态会随体积膨胀收缩而改变导致R0有轻微波动。电荷转移电阻Rct对SOC非常敏感。在中低SOC区间反应活性较高Rct较小接近满充或空电时由于表面锂浓度接近极限反应驱动力下降Rct会明显上升。这也是很多时候你会在SOC很低或很高时看到半圆急剧变大的原因。双电层电容Cdl一般变化不大因为双电层结构主要由界面几何面积和电解液性质决定但活性颗粒表面状态变化可能带来10%到30%的波动。Warburg系数与固相扩散系数直接相关而固相扩散系数本身随嵌锂浓度变化所以Warburg段的位置和长度也会随SOC改变。这些参数变化规律不是凭空设定的而是来自大量实验数据拟合后的统计结果。实际项目中如果你手头有不同SOC下的实测EIS数据建议先做一次完整拟合得到参数- SOC曲线再把这些曲线作为仿真输入。如果只是做机理演示参考典型文献参数也够用。2. 算阻抗谱前的模型准备 —— 等效电路参数的SOC依赖明确了物理图像之后下一步就是把它翻译成数学模型。这一节我会讲清楚为什么选择等效电路模型以及参数随SOC的依赖应该怎么处理。2.1 等效电路选型与阻抗表达式推导计算不同SOC下的宽带EIS最常用的做法是建立等效电路模型ECM。对于大多数锂离子电池我习惯用带Warburg元件的二阶RC等效电路结构如下一个欧姆电阻R0代表电解液和接触电阻两个RC并联环节串联用来近似正极界面和负极界面或者SEI 电荷转移两个过程的叠加一个Warburg阻抗Zw放在电路末端模拟低频段的固相扩散。这个结构的阻抗表达式是Z_total R0 Z_RC1 Z_RC2 Z_W其中每一个RC并联环节的阻抗为Z_RC Rct / (1 j * ω * Rct * Cdl)这里ω 2πf是角频率j是虚数单位。Warburg阻抗在频域的形式为Z_W σ / sqrt(jω)σ是Warburg系数单位是Ω·s^(-1/2)。注意严格来说Warburg阻抗有“半无限扩散”和“有限扩散”两种形式有限扩散模型还包含特征扩散厚度项。对于锂电池低频行为有限扩散更真实但参数更多计算也更复杂。我建议先在半无限扩散模型下调通再根据需求扩展。为什么不直接用一个复杂的电化学模型因为EIS计算的核心目标是直观看到不同SOC下的谱图形态变化等效电路模型足够表达主要特征而且后续做参数拟合时耦合度低、稳定性好。电化学模型比如P2D模型虽然更接近物理本质但涉及几十个参数反演计算的病态性问题非常突出不适合作为入门和快速迭代的工具。2.2 参数随SOC变化的规律与来源参数随SOC的变化我建议用插值表或者分段函数表示而不是给每个SOC写死一组常数。原因很简单你最终可能需要计算SOC0.15、0.35这样的中间值如果只存了0.1、0.3、0.5这些离散点没有插值逻辑就没法输出。Matlab里可以用interp1做线性插值也可以用spline做平滑插值。实际参数变化不是线性的尤其在SOC极低和极高区域会出现拐点所以spline往往更贴近实测趋势。参数值从哪来三个途径实测拟合这是最可靠的方式。把电池放在恒温箱里设定不同SOC静置足够时间后测量EIS然后用拟合工具提取参数。文献参考值很多论文会给出典型商用电池的Rct、Cdl、Warburg系数范围。可以参考这些范围做合理设定但要注明数据来源的电池体系和温度条件。经验估算没有实验条件时可以根据活性材料特性做估算。比如石墨负极Rct一般在10 mΩ·m²到50 mΩ·m²相对电极面积换算成单体级别需要知道极片面积。我自己的经验是参数值精度不需要太高因为EIS仿真主要用于趋势分析和算法验证只要数量级正确、SOC依赖趋势合理计算出的谱图就有参考价值。但要特别注意参数的一致性不要让Rct随SOC的变化曲线出现非物理的抖动否则画出来的谱图会很奇怪。下表是我在模拟项目中用过的某商用NCM/石墨电池在不同SOC下的等效电路参数相对值仅做趋势演示实际值需按电池规格换算SOCR0 (mΩ)Rct1 (mΩ)Cdl1 (F)Rct2 (mΩ)Cdl2 (F)σ (mΩ·s^(−1/2))0.11.201.500.802.801.2020.00.31.000.801.201.802.0012.00.50.800.601.601.202.808.00.70.700.501.801.003.207.00.90.600.402.000.803.606.0注意Rct1和Rct2分别对应两个RC环节一个是SEI/接触相关一个是电荷转移相关。实际拟合时这两个环节在频域上可能非常接近区分度不高但作为仿真输入完全没问题。3. Matlab实现 —— 从频点扫描到阻抗谱输出模型和参数都定了接下来就是写代码。这一节我直接给出核心实现思路和完整代码块你可以复制后按自己的参数改。3.1 代码结构与核心计算函数我习惯把EIS计算拆成两个模块一个是参数定义模块一个是阻抗计算函数。这样做的好处是后续如果你想做参数扫掠或优化只需要改参数部分计算逻辑完全不用动。阻抗计算的核心函数很简单function Z eis_calc(f, R0, Rct, Cdl, sigma) % 计算等效电路总阻抗 % 输入: % f - 频率向量 (Hz) % R0 - 欧姆电阻 (ohm) % Rct - 电荷转移电阻向量例如 [Rct1, Rct2] (ohm) % Cdl - 双电层电容向量例如 [Cdl1, Cdl2] (F) % sigma - Warburg系数 (ohm/sqrt(rad/s) 或 ohm/sqrt(Hz)) % 输出: % Z - 复阻抗向量 (ohm) w 2*pi*f; Z R0 * ones(size(f)); for k 1:length(Rct) Z Z Rct(k) ./ (1 1i * w * Rct(k) * Cdl(k)); end % Warburg 阻抗注意频率单位换算 if nargin 4 sigma 0 Zw sigma ./ sqrt(1i * w); Z Z Zw; end end这里有个非常容易踩的细节Warburg阻抗σ的单位依赖ω的单位。如果你用σ/(sqrt(jω))那么σ的单位是Ω·rad^(-1/2)·s^(1/2)需要和文献中给出的数值一致。有些文献用Ω·Hz^(-1/2)换算时要乘以sqrt(2π)的换算系数。我建议统一用rad/s也就是代码里的w 2pif。3.2 参数表如何组织不同SOC下的参数我推荐用矩阵或者结构体数组保存。矩阵方式的优点是绘图循环方便缺点是参数含义不够直观。结构体数组则更清晰适合参数多的场景。下面给出矩阵方式的完整示例clear; clc; close all; % 频率扫描范围10 mHz ~ 10 kHz每十倍频程50个点 f logspace(-2, 4, 300); % 不同SOC下的等效电路参数 SOC_list [0.1, 0.3, 0.5, 0.7, 0.9]; % 每行: [R0, Rct1, Cdl1, Rct2, Cdl2, sigma] params [ 0.0012, 0.0015, 0.8, 0.0028, 1.2, 0.020; 0.0010, 0.0008, 1.2, 0.0018, 2.0, 0.012; 0.0008, 0.0006, 1.6, 0.0012, 2.8, 0.008; 0.0007, 0.0005, 1.8, 0.0010, 3.2, 0.007; 0.0006, 0.0004, 2.0, 0.0008, 3.6, 0.006; ]; % 预分配变量 Z_all zeros(length(SOC_list), length(f)); % 循环计算 for k 1:length(SOC_list) R0 params(k, 1); Rct [params(k, 2), params(k, 4)]; Cdl [params(k, 3), params(k, 5)]; sigma params(k, 6); Z_all(k, :) eis_calc(f, R0, Rct, Cdl, sigma); end这里参数表里的电阻单位是欧姆电容单位是法拉Warburg系数单位是Ω·rad^(-1/2)·s^(1/2)。如果你手头参数是mΩ记得除以1000否则计算出来的阻抗会凭空大1000倍Nyquist图直接画飞。3.3 绘图和导出结果的细节算完阻抗后最直接的展示方式是Nyquist图和Bode图。Nyquist图能直观看到半圆直径和45度扩散线Bode图则能清楚展示不同频率段的阻抗幅值和相位变化。我通常把两种图放在同一个figure的两个子图里。% 绘制不同SOC下的Nyquist图 figure; colors lines(length(SOC_list)); for k 1:length(SOC_list) Z Z_all(k, :); plot(real(Z)*1000, -imag(Z)*1000, o-, Color, colors(k,:), ... LineWidth, 1.2, MarkerSize, 4, DisplayName, sprintf(SOC%.1f, SOC_list(k))); hold on; end grid on; xlabel(Re(Z) / mΩ); ylabel(-Im(Z) / mΩ); title(不同SOC下锂离子电池Nyquist图); legend(Location, best); axis equal; % 保持纵横比一致便于观察半圆形状这个axis equal很关键。如果没有这句Matlab会自动缩放坐标轴半圆可能看起来像椭圆掩盖了真实的谱图形态。我见过不少初学者的图明明计算是对的就因为坐标比例问题半圆被拉成一条扁平的弧线白白制造了误解。Bode图的画法类似只是横坐标用频率、纵坐标分别用幅值和相位。幅值可以用abs(Z)相位用angle(Z)*180/pi。数据导出方面我建议保存四个字段频率、SOC、实部、虚部。用writematrix或者保存成mat文件都行。要注意的是不同SOC的数据长度相同可以直接堆叠成矩阵方便后续导入其他工具做进一步分析。4. 完整算例 —— 跑一遍看看结果长什么样光说不练假把式。这一节我带你完整跑一遍上面的代码看看输出结果是什么形态以及怎么解读这些形态。4.1 算例配置与预期结果算例使用第二节的参数表频率范围从10 mHz到10 kHz共300个频点。这样设置的理由是10 kHz以上通常只有欧姆阻抗没有太多界面信息10 mHz以下则接近准稳态EIS测量耗时很长仿真意义也不大。跑完计算后你可以先打印几个频点下的阻抗值检查数量级是否正确。比如SOC0.5时在1 kHz附近的阻抗应该大约等于R0加上两个RC环节的高频极限值即0.0008 0.0006 0.0012 0.0026 Ω换算成mΩ就是2.6 mΩ。如果算出来差一个数量级基本就是参数单位出了问题。Nyquist图的预期形态是高频端左侧从实轴约0.6 mΩ处开始经过一个压扁的半圆后进入扩散段扩散段呈一条约45度的斜线向上延伸。不同SOC的曲线会呈现明显差异SOC0.1时的半圆直径最大因为此时Rct1Rct2最大SOC0.9时的半圆最小。4.2 结果表解读为了方便对比我把计算出的特征阻抗值整理成表SOC高频截距 Re(Z) (mΩ)首个半圆直径 (mΩ)10 mHz处总阻抗幅值 (mΩ)0.11.201.502.804.30约8.500.31.000.801.802.60约5.400.50.800.601.201.80约4.000.70.700.501.001.50约3.400.90.600.400.801.20约2.90注意表中10 mHz处的总阻抗幅值包含了Warburg项的贡献不是简单的RC环节叠加。从趋势上看SOC越高总阻抗越低这与大部分商用三元锂电池的实测趋势一致。但也存在例外某些磷酸铁锂电池在中高SOC区间阻抗变化不大快到满充时因为两相变过程阻抗反而出现平台甚至上升。所以趋势线是电池体系相关的别把一个体系的结果硬套到另一个体系上。Bode图方面你会在中频段看到一个明显的相位峰峰值频率对应Rct和Cdl的转折频率。SOC变化时这个峰值频率也会移动。你可以用这个特征快速判断电池处于哪个SOC区间这在实际BMS的SOH估算中有应用前景。5. 常见踩坑点 —— 计算和实测中都可能遇到的问题代码跑通只是第一步真正有价值的是知道哪里容易出错以及出错后怎么排查。下面这几个坑是我自己踩过的分享出来帮你省点时间。5.1 频点数量与Nyquist图光滑度的平衡频点数量太少Nyquist图会变成折线图半圆看起来有多边形感频点太多计算量增加而且某些频段的特征点会被密集的数据掩盖。我一般用logspace每十倍频程50到100个点总频点数200到500之间。这里有一个容易被忽视的问题Nyquist图的点密度在高频和低频段会有差异。因为频率是对数分布的高频段每根相邻线之间的实部间隔较小低频段间隔较大。如果你画出的是散点图低频段会显得稀疏。解决方案是画成连线图plot而不是scatter或者用线性频率分布加上对数加密的混合策略。5.2 对异常参数的处理有时候参数表中的值取自不同来源会出现数量级冲突。比如Rct取的是mΩCdl取的是mF混在同一个式子中计算。这种情况下计算出来阻抗虚部可能变成噪声。我建议在代码里加一个参数合理性检查% 参数合理性检查 if any(params(:, 2:3) 0) || any(params(:, 4:5) 0) error(RC参数必须为非负值); end if any(params(:, 1) 0) error(欧姆电阻不能为负); end参数为负在物理上没有意义仿真中出现负数往往说明数据采集或整理环节出了错误。加入检查能帮你在计算前就拦截问题而不是等图形出来后再猜。5.3 频率范围与Warburg段的失真Warburg阻抗在非常低的频率下会逐渐偏离45度角因为实际电池的扩散层厚度有限低频时锂离子能穿透整个颗粒半无限扩散假设失效。如果你把仿真频率降到1 mHz以下计算出的Warburg段仍然是一条笔直的45度线这实际上是不真实的。实测低频段往往会出现向实轴弯曲的趋势也就是有限扩散的特征。如果想模拟得更真实可以把Warburg阻抗替换为有限扩散形式Z_W σ / sqrt(jω) · tanh(sqrt(jω/ω_d))这里ω_d是一个特征扩散频率与扩散时间和扩散厚度相关。低频时tanh项会让虚部逐渐趋于零阻抗曲线向下弯曲更贴近实测。代价是多了一个参数需要你根据实验数据额外拟合。作为入门阶段半无限扩散完全够用但你要知道它的局限在哪里。6. 从谱图到参数反推 —— 计算之外的应用方向很多读者拿到计算好的阻抗谱后会问“然后呢”我的回答是计算谱的价值不仅在于看趋势更在于验证和指导实测数据的处理。用已知参数的仿真谱去测试你的拟合算法是开发EIS参数提取工具时非常高效的做法。6.1 用最小二乘法反推参数仿真谱是理想数据没有噪声这时你可以写一个简单的拟合脚本用最小二乘拟合出原始参数验证拟合程序是否能正确收敛。Matlab的lsqnonlin或者fminsearch都能做这件事。我的习惯做法是先生成一组已知参数的EIS数据给数据加入少量高斯噪声模拟实测环境用拟合算法从带噪数据中反推参数对比反推值和真实值评估算法的精度和稳定性。这样一套流程下来你对拟合算法的信任度会大大提升。之后再来应对真实电池数据你就能判断哪些偏差来自算法哪些偏差来自模型本身的简化。一个小技巧拟合时对电阻和电容参数用对数变换也就是让优化变量取log(R)而不是R。这样能保证优化过程中参数始终为正而且数值尺度更均匀收敛速度明显更快。6.2 与实测数据对比时要注意的模型偏差把仿真谱和实测谱放一起对比时你会发现几个常见偏差实测半圆比仿真半圆“压扁”得更明显这是因为电极表面粗糙和电流分布不均导致的双电层电容分散效应。解决办法是用CPE代替纯电容但计算复杂度会上升。实测高频段可能出现轻微感应弧位于第四象限这通常来自电缆和测量夹具的寄生电感不是电池本身的特性。仿真中是不需要建模的但在分析实测数据时要先剔除这段。实测低频段因为测量时间长、电池自放电和温度漂移数据点可能很散。仿真数据则永远“干净”所以对比时别期望完全吻合重点看趋势是否一致。写在最后的心情与补充我最初做这个项目的时候觉得EIS仿真不过是一个复数运算公式套进去的事真正动手才发现参数怎么定、频率怎么选、结果怎么解读每一个环节都有讲究。尤其是参数随SOC的变化规律没有实验数据做支撑仿真做得再漂亮也只是空中楼阁。所以如果你有条件强烈建议在做仿真之前先采一组不同SOC下的实测数据没有条件的话也一定要在论文或报告里注明参数来源和适用范围避免误导后续使用者。最后再分享一个我在实际项目中经常用的小技巧把计算好的不同SOC阻抗谱保存成一个四维数组频率×SOC×实部×虚部后续做BMS算法仿真时直接查表插值就能拿到任意SOC、任意频率下的阻抗值运行速度快得惊人。这个思路在做实时仿真时特别实用。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询