(本文來自專供干貨的“編輯之譚”,感謝譚編用治學的態度做內容)
4月25日,『編輯之譚』分享了兩種微分求導方法(平均求導法、交叉求導法),該文一出就受到了廣泛關注。
?
譚編首次提出的這兩種微分求導方法,可以對電池的充放電曲線數據進行處理,計算得到微分電容曲線數據,完美地繪制出電池的微分容量曲線,彌補了Origin繪圖軟件微分不成功的缺陷。
?
那么,這兩種微分方法到底
?
科不科學?嚴不嚴謹?可不可行?
?
有沒有修正其誤差的修正方法?
?
看看來自武漢大學的Crusher博士怎么用Matlab編程來驗證這些問題!
一勞永逸地搞定微分電容
Crusher
武漢大學博士生
能源材料是一個很熱的話題,而對于奮戰在一線的研究者們來說,循環伏安(CV)和線性伏安(LSV)測試幾乎必不可少。然而,在大量文獻中,CV曲線似乎并非必需的數據曲線,取而代之的是微分電容曲線。
不少同學參考這些文獻方法,試圖得到類似的微分容量曲線,但是,實際上會遇到很多困難。要么不知道怎么得到,要么在利用Origin繪圖軟件進行微分處理時,得到的一定是類似下圖的奇怪結果。
圖1? 采用Origin微分得到的微分容量曲線
滿屏的豎線,第一感覺往往是:頭大!
至于為什么會這樣,主要是由于儀器采點的原因,或者儀器精密度的限制,導致直接作微商的過程出現了很多0/0的不定型,而0/0的不定型在數學上既可以是0,也可以是無窮大或無窮小。
雖然,譚編提出的兩種方法比較完美地獲得了微分電容曲線,這兩種方法的科學性引起了我們質疑。筆者采用Matlab編程,從Excel數據文件中讀取充放電數據,一鍵處理并繪制出微分電容曲線。
采用譚編提出的平均求導(方法1)和交叉求導法(方法2),以及筆者綜合考慮這兩種方法的誤差而提出的均值法(方法3),即對兩種方法的計算結果再次求均值的方法,對比研究并驗證這3種方法對電池充放電曲線求解微分電容曲線的科學性、準確性、可行性。同時對磷酸鐵鋰單平臺、多平臺特征的充放電數據,以及多次循環數據進行了一鍵處理,驗證其可行性。
本文主要討論以下3個問題:
問題1:怎樣求微分電容?
問題2:微分電容到底是什么?
問題3:從數學上進一步深層探討求解微分電容方法的可信性和局限性。
我們編寫的Matlab腳本如下(左右滑動,可以閱讀完整代碼),可全選復制Matlab源代碼,也可留言或聯系譚編微信免費獲取。
?
1%Matlab源代碼
2clc
3clear?all
4A=xlsread(‘test?nfpcv.xlsx’);
5n=size(A,2)?
6A;
7figure(1)
8for?i=1:n/2
9????plot(A(:,2*i),A(:,2*i-1))
10????hold?on
11end
12for?j=1:n/4?
13????name(2*j-1,:)=[‘第’?num2str(j),‘次充電’];
14????name(2*j,:)=[‘第’?num2str(j),‘次放電’];
15????legend(name)?
16????title(‘充放電曲線’)
17end
18d=150;
19figure(2)
20for?i=1:length(A(:,1))-d
21????for?j=1:n/2
22????C(i,2*j-1)=(A(i,2*j-1)+A(i+d,2*j-1))/2;
23????C(i,2*j)=((A(i+d,2*j))-(A(i,2*j)))/((A(i+d,2*j-1))-(A(i,2*j-1)));??????
24????end
25end
26for?j=1:n/2
27????plot(C(:,2*j-1),C(:,2*j))
28????hold?on
29end
30for?j=1:n/4?
31????name1(2*j-1,:)=[‘第’?num2str(j),‘次充電微分電容’];
32????name1(2*j,:)=[‘第’?num2str(j),‘次放電微分電容’];
33????legend(name1)?
34????title(‘方法1:平均求導法’)
35end
36d1=150;
37figure(3)
38for?i=1:length(A(:,1))-d1
39????for?j=1:n/2
40????D(i,2*j-1)=A(i+d1/2,2*j-1);
41????D(i,2*j)=((A(i+d1,2*j))-(A(i,2*j)))/((A(i+d1,2*j-1))-(A(i,2*j-1)));??
42????end
43end
44for?j=1:n/2
45????plot(D(:,2*j-1),D(:,2*j))
46????hold?on
47end
48for?j=1:n/4??
49????name2(2*j-1,:)=[‘第’?num2str(j),‘次充電微分電容’];
50????name2(2*j,:)=[‘第’?num2str(j),‘次放電微分電容’];
51????legend(name2)?
52????title(‘方法2:交叉求導法’)
53end
%方法3?將兩者相加?
55?figure(4)
56for?i=1:min(length(A(:,1))-d,length(A(:,1))-d1)
57????for?j=1:n/2
58????E(i,2*j-1)=0.5*(C(i,2*j-1)+D(i,2*j-1));
59????E(i,2*j)=0.5*(C(i,2*j)+D(i,2*j));???
60????end
61end
62for?j=1:n/2
63????plot(E(:,2*j-1),E(:,2*j))
64????hold?on
65end
66for?j=1:n/4??
67????name3(2*j-1,:)=[‘第’?num2str(j),‘次放電微分電容’];
68????name3(2*j,:)=[‘第’?num2str(j),‘次充電微分電容’];
69????legend(name3)?
70????title(‘方法3:兩者方法取均值’)
71end
72figure(5)
73for?j=1:n/2?%?同時比較三種方法求出的第一周充放電曲線的微分電容
74????plot(C(:,2*j-1),C(:,2*j),‘g’)
75????hold?on
76????plot(D(:,2*j-1),D(:,2*j),‘b’)
77????hold?on
78????plot(E(:,2*j-1),E(:,2*j),‘m’)
79????legend(‘方法1’,‘方法2’,‘方法3’)
80????title(‘三種方法比較’)
81end
不需要懂電化學知識和數學原理,尤其矩陣運算方面的知識,只需要將你的數據拷入到excel表格中,按電壓-容量(或比容量,都可以,二者無所謂),有一條曲線就粘貼一次“電壓-容量”,有多條曲線就粘貼多次。多說無益,我們直接上圖吧。
?
圖2? 將充放電數據拷入Excel文件
為了驗證腳本的可信性,我們分峰形比較簡單和多對峰分別討論。
1.1?簡單峰(LiFePO4)?
LiFePO4?是一種成熟的電極材料,目前被比亞迪,寧德時代等各大電池廠商大量使用。磷酸鐵鋰有一個平坦的工作電壓平臺,但可逆容量不甚高,下圖是我們曾經做的一次摻雜,可見充放電平臺基本上保持不變。現在利用我們編寫的Matlab腳本程序,自動讀取該曲線的Excel數據文件,計算它的微分電容曲線。
?
圖3? 改性的磷酸鐵鋰的充放電曲線(研究對象)
利用我們編寫的Matlab腳本,對方法1、方法2、方法3進行了驗證,其結果如圖4所示。
?
圖4? 三種方法的微分容量曲線
(點擊圖片,可放大查閱)
可見,三種方法幾乎沒有明顯差別(放電的小峰正是由于摻雜引起的),這主要是步長d,d1都取得較小。如果得不到較好的結果,請直接嘗試修改不同的步長值。另外,如果步長較大時,推薦使用方法3,因為方法1和2會分別產生一個負的或正的誤差,方法3采用兩者均值,能在一定程度上可以消除數據處理帶來的誤差。
(這是一個廣告)
上述的驗證結果表明:我們編寫的Matlab腳本對簡單峰的識別是非常成功的,那么如果是多條曲線,而且是多個充放電平臺(多峰)曲線的復雜情況呢?
1.2 多峰多曲線
圖5是一種具有多個充放電平臺的充放電曲線,不用改腳本,直接將充放電的數據拷入到excel表格中,用Matlab讀入后,運行即可。
?
運行結果:
?
圖5? 具有多平臺的充放電曲線(研究對象)
圖6? 多平臺充放電曲線的微分求導結果
(點擊圖片,可放大查看)
對比可見,除了主要的峰形,3.2V等處的小峰也清晰可見,這有助于對充放電機理的深刻理解。所以該腳本對于多對峰、多條曲線的處理能力也是很不錯的。唯一要注意的是,如果d取得較大,可能會造成曲線中峰的起止位置發生左右漂移,人為地制造出極化,為此,可將第39行(即第5行,下面只是節選代碼)的d1除以2。
?
1d1=150;
2figure(3)
3for?i=1:length(A(:,1))-d1
4????for?j=1:n/2
5????D(i,2*j-1)=A(i+d1/2,2*j-1);
6????D(i,2*j)=((A(i+d1,2*j))-(A(i,2*j)))/((A(i+d1,2*j-1))-(A(i,2*j-1)));??
7????end
8end
說了這么多,如果某些同學習慣在origin中作圖,怎樣導出微分后的數據呢,只需加一條輸出語句‘xlswrite’即可,具體用法請找“度娘”(百度)。
我們提供了這個Matlab腳本,歡迎在本文下方留言,看大家的反響,如果有必要的話,后續譚編再出一個Python腳本。
如果你是個實用主義青年,只是在文章中單純地用一下,上面的內容就夠了,學到這一步就可以了,這個Matlab腳本足以應付此類曲線的數據處理。
但勤奮好學的你肯定不滿足于此,肯定想要理解微分電容底層的電化學知識,那么請往下看。
細心地人可能早就發現,dQ/dV~V的峰形跟cv的是一樣的,但具體為什么可能有些人并不理解,講得稍微深刻一點的地方,一般是這么介紹的:
?
(公式采用【編輯之談】公眾號的【upub編輯器】)
?
后面呢?沒了。那為什么微分電容和CV的結果二者一致呢?
?
事情得從一個原始的誰都知道,但絕大多數沒怎么理解的東西說起,這個東西叫:平衡電勢。
什么是平衡電勢,百度上的定義是這樣的:
這段話大家都覺得很有道理,也都讀得很明白。那還是這個問題,(用人話講)平衡電勢到底是什么?
平衡電池指的是在某種狀態下,一個物質(設為M)不從外回路得到/失去電子,變成自己的還原/氧化態(也就是M堅持做自己)的情況下,材料自由能的外在體現。
如果外部條件變化,這種平衡就會被打破,這正好就是貫通熱力學和動力學的橋梁:
(公式采用【編輯之談】公眾號的【upub編輯器】)
為什么這么說呢?如果有外力,比如出現另外一個比它的氧化態還強的氧化劑,或比還原態還原性還強的還原劑,或者直接充放電(本質還是強行從材料奪電子或給電子)。
更形象點說,當外部氧化劑(設為O)的電位比M的高時,M就會被O奪走電子(熱力學上說是這樣,但具體能不能實現還要看這個過程有沒有其他阻力,所以就有了所謂動力學的問題),這時候是不做功的.
但如果將二者隔開(設法隔開),并在中間架一根導線,就能讓電子從外部流動,這就是成了電池。?
但如果是人為地緩慢的提高電勢,而不是直接給一個強的氧化劑去奪取電子,會怎么樣呢?
開始時,電位降低,電子奪取不下來,外電路電流很小(從而電量,即容量也很小,q=it)。
當電位提高到到平衡電勢時并稍加一個過電位克服極化(這可能又是一個誰都知道但大多數人理解得一般的概念,以后有機會開專題講)的阻力,這時候M就會快速地變成它的氧化態,劇烈地向外給出電子,放電過程則正好相反。
如果這個電子出得去、回得來,那就可以做成二次電池反復利用;如果出得去回不來,那就只能做成一次干電池。
有了上面的概念,我們再來理解為什么微分電容和CV是一回事呢?
上面提到,人為地提高電勢到平衡電位以上,會劇烈地奪取M上的電子,對外顯示的就是電流/容量。而認為提高電勢,即
(1)以一個橫定的速度直接提高電勢(CV);
(2)以一個橫定的速度灌入電流(電勢不是勻速上升)來實現,這就是恒電流充放電曲線。當然也可以既非恒電流也非恒電勢,但不便于研究問題,用的不多。
如果是(1),當電勢低于平衡電勢時,M不會受影響,不會失去自身的電子。當電勢到達平衡電勢時,這是由于外力的存在,M體系內的能量發生變化,電子被外回路奪取,對外顯示,就是出現了峰。如果走1圈,那就是循環伏安CV,只走半圈,那就是線性伏安LSV。所以本質上說,CV中出現峰值,是說材料在這個電位處被打破了平衡。至于出現多個峰,即可能由于不同電對中心(如Fe和Mn)的平衡電勢本就不一樣,也可能由于同一個電對(比如Fe)在材料中處的晶體位置不一樣,這個位置影響了它的平衡電勢。[1]
如果是(2),向M不斷灌入電流時,電位也在發生變化,如果低于平衡電勢,灌入的電流相當于直接給了一個導體正電荷,但它無法吸納,就會使得的電位迅速變化,這就是充放電曲線中的類似于直線的部分(如圖7中被藍色框內的部分)。但當電勢繼續升高,接近第一個平衡電勢,就會出現正電荷被吸收,導致電壓升高得較慢,如第一個圈。如果第二個平衡電勢處的M特別多,就會出現給多少正電荷都能吸收(M處于吃正電荷吃不飽的狀態),就會使得電勢基本維持了一個平臺,而這時候,還是在向外回路劇烈給電子。
?
圖 7? 充放電曲線的特征分析
到這里就可以看出:不管是CV還是重放電曲線,充電到達平衡電勢并超過它時,都會向外輸出大量電子,電子最直觀的體現就是電流增加,所以在CV曲線中會出現一個峰值,而在充放電曲線中會出現一個平臺,二者的本質是完全一致的。做一個簡單的微分變化:
?
(公式采用【編輯之談】公眾號的【upub編輯器】)
?
平衡電勢負極處,會伴隨著一個很大的電流I。
?
還有一種理解方式是:將上面的圖形逆時針旋轉90°(如下),即做成容量-電壓曲線,你們發現了什么??正是Q-V?曲線在每個V?處的斜率,而平臺處正是曲線斜率最大的地方!
?
圖 8? 充放電曲線上斜率的物理意義
到這里,小編將手把手地幫你徹底了解了微分電容是怎么一回事,從而做到庫里有糧,心里不慌,以不變應萬變。如果還有不理解的地方歡迎在本文末尾留言提問。
?
如果你是個標準的化學學霸而對數學不感興趣,那么到這里也就可以了,但是作為祖國新時代的大學生,我想你會忍不住看第3個問題。
答案是:不嚴謹,但是……。
?
導數和微分直接的關系是什么?變化量和微分之間的關系又是什么?
?
我們先看導數定義:
其中要求Δx趨于0,而這在我們采的數據點中是不成立的。導數也可以這樣定義:
?
圖9? 微分的定義及其幾何意義
可見,導數是微分的比值。而微分與變化量之間的關系為:
?
圖10? 微分與變化量之間的關系
變化量Δy等于微分dy以及和一個比dy更高階的無窮小的和,所以dy只是Δy的主要部分。而在我們的dQ/dV 曲線的求法中,我們直接以ΔQ代替了dQ,這是不嚴謹的。
同時還有另一個地方也有問題:因為避免出現豎線(即出現很多0/0的不定型),我們對曲線上的點都做了一定的處理,比如跨步長取點。
這樣實際上求出來的是兩個點之間割線的斜率,而不是某一個點處的斜率。
那怎樣完美的求微分電容曲線呢?理想的答案是有一臺非常非常精密的充放電儀(目前一般實驗室用的都在微安級別),做出十分光滑的充放電曲線,直接對該曲線嚴格按數學方法求導,便是真正的微分電容曲線。
這可能是“你想”而不是“理想”的狀態吧?!
盡管如此,該文還是為計算微分電容曲線提供了可行的方法,在一般的數據處理中,已經足夠了。
【參考文獻】
[1] X. Pu, H. Wang,T. Yuan, S. Cao, S. Liu, L. Xu, H. Yang, X. Ai, Z. Chen, Y. Cao, Energy Stor.Mater. (2019)?DOI 10.1016/j.ensm.2019.1002.1017.
本文提出的這3種微分求導方法,可以針對任何曲線,計算其微分曲線,可以從微分曲線中找到非常細微的變化。例如,從熱重(TG)曲線數據,通過計算微分曲線得到相變溫度、結晶水失水反應溫度、脫水反應溫度、分解反應溫度、恒重溫度等等。
?
大家可以嘗試驗證一下,從TG曲線數據計算其微分曲線,并與實驗測得的一次微分DTG曲線對比,研究是否吻合?如果是,那我們可以不用做DTG曲線了!
有興趣的網友,歡迎利用這兩種方法,對您所遇到的任何實驗數據曲線進行微分處理,驗證一下譚編提出的這兩種微分求導方法的可行性、普適性。
原創文章,作者:菜菜歐尼醬,如若轉載,請注明來源華算科技,注明出處:http://www.zzhhcy.com/index.php/2023/11/17/1b7b286537/