(完整代碼和使用視頻見文末)
一、軟體及教程簡介
Matlab是美國MathWorks公司出品的商業數學軟體,用於數據分析、無線通信、深度學習、圖像處理與計算機視覺、信號處理、量化金融與風險管理、機器人,控制系統等領域。
由於Matlab將向量/矩陣作為基本的數據單位,在我們平時進行數據處理的時候更容易上手,軟體內集合的數學函數也基本可以滿足我們日常科研需要,日後不打算轉碼的話將其作為提高生產力的主要工具完全OK。
安裝教程、基礎語法與內容我們在網上很容易都能搜到,因此本公眾號不會贅述這些內容,而會更偏向於介紹一些個人編寫的實際應用(熱電方向),希望大家能夠在閱讀過程中同步手打一下相關代碼,熟悉每一行代碼的作用,這樣才能舉一反三,便於日後編寫自己需要的功能。
二、應用場景描述
我們知道,熱電優值的表達式是zT = S²σT /κ, 一般在研究熱電材料時,限於現有的測試條件,材料的電學性能(Seebeck係數S,電導率σ)和熱學性能(熱導率κ)會被分開測量,而測完的性能對應的測試溫度往往不會很完美地對齊,如果這時候需要計算zT,我們需要以其中一列溫度為基準,將熱電性能統一到這列溫度上,因此需要對測得數據需要擬合處理。
舉個慄子,現有p型Sn摻(Zr,Hf)CoSb的熱電性能如下
(DOI:10.1016/j.mtphys.2018.11.002)
得到其中Zr0.5Hf0.5CoSb0.8Sn0.2樣品的熱電性能(上圖天藍色三角形,下圖橙色圓形),摳點後得到下表:
其實此處由於兩臺儀器的測試程序中已經將測試溫度設定的較為統一了,基本上整百攝氏度的性能可以直接合併計算,那這裡假設兩邊溫度相差較大,接下來,我們學一下如何通過matlab,使用多項式擬合,將熱學性能的測試溫度與電學性能統一(Origin也可以,但根據個人體驗Matlab會方便很多)。
三、多項式擬合函數編寫
(函數和腳本完整代碼可直接翻到文末)
這裡我們寫一個函數文件用來進行多項式擬和,順便熟悉一下函數的用法,matlab中函數的定義以function開頭,以end結尾,第一行中,y對應這個函數的輸出變量,polydata是函數名稱,需要和函數文件的文件名統一,函數名後括號內的是使用這個函數所需要的自變量。
那這裡可以很清楚地看到這個函數的自變量有三,對應的意義在第二行的注釋裡也寫得很清楚了,那麼data對應的是列數為2(或大於2)的矩陣,第一列對應測試溫度,第二列對應性能,我們通過data(:,1)可以將data的第一列內容提取出來賦值給x0,賦值給y0也是一樣的操作。
這裡簡單一下矩陣的坐標,Matlab中通過矩陣名+小括號給出向量的坐標,逗號分隔各個坐標。例如,s=matrix(3,4)意味著matrix是一個矩陣的變量名,這一步操作將matrix矩陣中第3行第4列的數據賦值給s變量。":"代表任意值,因此matrix(1,:)代表matrix矩陣第一行的所有內容。
後面兩行就很簡單了,polyfit和polyval是matlab自帶的兩個數學函數,polyfit根據已有的自變量,函數值和多項式次數,進行擬合,最後給出擬合完的多項式函數各個次數自變量前的係數,如圖
大家在學習matlab時需要善用help和doc命令,在這兩個命令後跟你想了解的函數名就會自動跳出簡單的使用幫助或對應的幫助文檔。
polyval就是根據給出的多項式係數和自變量自動算出對應函數的值。
因此,我們編寫的這個polydata函數其實可以在一行內寫出:
y=polyval(polyfit(data(:,1),data(:,2),r),x)
這裡個人建議是在不熟練的時候不要急於減少編寫腳本的行數,將各個功能拆分,甚至拆寫到自編函數文件內,寫好注釋,方便運行出錯時debug,寫好每個函數文件後可以直接拿測試數據跑一下,看看是不是你想要的結果。
回到實際問題,現在我們編好了polydata函數,需要在腳本中用到它,那麼只需要在同一文件夾內新建一個腳本文件,在腳本中直接使用polydata即可
那麼我自己的腳本主要可以分為三部分,
(1)初始數據的輸入
這裡不得不說matlab比較方便的一點就是Excel的數據可以直接複製粘貼入腳本,兩邊加上方括號就可以賦值給矩陣名了,matlab 會自動通過空格和換行符進行行列的分割,別忘了在方括號的最後加個分號,這樣在運行腳本的時候不會將變量的賦值結果輸出在命令行窗口中。
那麼此處我們直接將上面獲取的熱學性能和電性能的溫度列賦值給data矩陣和T向量即可,這裡要注意的是我們將電性能最後一個溫度點去掉了,因為從Seebeck圖像看高溫處已經本徵激發,雙極擴散會使得熱導率逐漸上升,而我們熱導率只測到1123K,用擬合出來的函數去確定更高溫度的熱導率不太合適。因此我們要儘量確保擬合得到的數據在我們的測試溫度區間內。
(2)擬合數據的導出
只有一行,很簡單,就是通過我們編好的函數polydata,已有數據data,待擬合自變量T,多項式次數r來獲取擬合出來的應變量Output。在第一部分中,r不宜設置得過大或過小,不然容易出現欠擬合或過擬合的現象,可根據輸出結果自行調整。
(3)擬合前後數據對比
為了快速確定我們的擬合是準確的,使用plot函數作圖,(plot(x,y,'r'),x和y分別是用來畫圖的橫縱坐標,第三個數據表示顏色+標識類型)對比兩組數據是否基本重合,確保擬合結果不出錯。那麼這裡原始數據用紅色的+號表示,而擬合完的數據是藍色的折線圖,至於plot函數如何設置別的顏色,標識甚至大小,坐標軸範圍等,大家可以在命令行窗口輸入doc plot進行學習
本次示例腳本運行後畫出的圖片如下:
可以看到基本上還是比較貼合的,最後將這裡Output對應的數據(擬合完的熱導率,在工作區雙擊該變量,打開表格複製即可)粘貼回Excel或者Origin進行畫圖處理。
當然,你也可以將電性能預先輸入Matlab,然後將擬合得到的熱導率直接通過matlab算完PF,電子熱導,晶格熱導,zT等,最後統一將算完的數據輸出到畫圖軟體進行最後的繪圖,那這些部分我們之後再講~
四、小結
這是我第一次寫教程,可能比較散亂,望大家見諒,而本教程內提到的,希望大家看後能學會的大致內容如下:
變量的賦值,向量的輸入和分割;
函數的定義,函數文件的使用;
畫圖命令plot的簡單使用。
幫助命令help、doc的使用
完整代碼及視頻演示:
polydata.m:
dealdata.m:
兩個文件需要放在同一文件夾下,或者函數文件放在環境目錄內。
最後,祝大家學業有成,科研順利!