Matlab教程(1)——多項式擬合

2022-02-07 電聲不語

收錄於話題 #Matlab 6個

(完整代碼和使用視頻見文末)

一、軟體及教程簡介

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:

兩個文件需要放在同一文件夾下,或者函數文件放在環境目錄內。

最後,祝大家學業有成,科研順利!


相關焦點

  • 應用matlab進行多項式擬合
    採用matlab軟體中的polyfit()函數進行多項式擬合,分別採用5階多項式和9階多項式進行擬合,並對擬合結果進行繪圖對比。程序如下:clc;clear all;x=[0.2 0.3 0.5 0.6 0.8 0.9 1.2 1.3 1.5 1.8];y=[1 2 3 5 6 7 6 5 4 1 ]; p5=polyfit(x
  • 4.算法類(1) --Matlab多項式曲線擬合預測新冠病毒感染人數
    疫情發生後,國內外很多研究學者都通過建模等方法分析了疫情可能導致的感染人數,下面分享一下通過Matlab的多項式曲線擬合預測新冠病毒感染人數趨勢,結果粗糙,僅僅作為學習。3、模型建立——多項式擬合3.1、多項式擬合原理和本文說明多項式擬合是用一個多項式展開去擬合包含數個分析格點的一小塊分析區域中的所有觀測點
  • 總結MATLAB的線性擬合和非線性擬合函數參數
    曲線擬合是一種函數逼近的方法。可以分為線形擬合和非線性擬合。曲線擬合的原理:對於y = f(x),通過構造一個函數g(x)取逼近未知函數f(x),使得誤差在某種意義下達到最小。一般使用多項式函數作為逼近函數,使用最小二乘法計算誤差最小。曲線擬合的實現方法:使用polyfit()函數,其功能為求得最小二乘擬合多項式係數。
  • Matlab擬合詳解
    多項式擬合 clearx=1:1:10;y=-
  • matlab最小二乘法數據擬合函數詳解
    Yj= a0 + a1 X (式1-1),其中:a0、a1 是任意實數。matlab中用最小二乘擬合的常用函數有polyfit(多項式擬合)、nlinfit(非線性擬合)以及regress(多元線性回歸)。自變量有2個或以上時,應變量一個,可以使用的有nlinfit和regress,線性時用regress,非線性時用nlinfit。
  • MATLAB非線性擬合函數nlinfit函數
    /log(x)+10000*rand(1,n);%假設這是實驗測得的數據a=[1 2];f=@(a,x)a(1)*sin(x).*exp(x)-a(2).原始數據','有擾動的數據擬合的結果數據','無擾動的數據擬合的結果數據');figure;plot(x,r,'r-+');xlabel('x');ylabel('殘差');function f=test(a,x)f=a(1)*sin(x).
  • 如何使用Matlab編程進行參數擬合
    1 前言之前幫瘋學網做過一個利用Matlab編程進行參數擬合 的教程,由於瘋學網好像倒閉了
  • MATLAB的lsqcurvefit函數擬合非線性式子中的未知參數
    102.1 103.9 103.9];xdata=1:length(y);a0=[1,3,7,5,7]; %初始估計值,隨便寫 這個是4次擬合 ,具體表達式可以隨便改options=optimset('Tolfun',1e-15); %方法設定for i=1:1000x=lsqcurvefit(@fun1,a0,xdata,y,[],[],options); %確定待定係數
  • MATLAB的拉格朗日插值
    在數值分析中,拉格朗日插值法是以法國十八世紀數學家約瑟夫·拉格朗日命名的一種多項式插值方法。許多實際問題中都用函數來表示某種內在聯繫或規律,而不少函數都只能通過實驗和觀測來了解。拉格朗日插值法可以找到一個多項式,其恰好在各個觀測的點取到觀測到的值。這樣的多項式稱為拉格朗日(插值)多項式。
  • 多項式擬合
    有零點
  • MATLAB數據擬合
    中數據擬合的原理是最小擬合的最小二乘原理,其中polyfit與polyval是最基本的擬合方法,除此之外,MATLAB還提供了更為直接簡單的數據擬合工具,cftool,下面舉一個例子,介紹這兩種數據擬合的方法。
  • matlab插值擬合(二)
    1 基於最小二乘法的多項式擬合函數:polyfitp = polyfit(x,y,n),待擬合的多項式為p(1)*x^n + p(2)*x^(n-1) +…+ p(n)*x + p(n+1),其中x是擬合數據的自變量,y是因變量,n是擬合多項式的階數,如當n為1時,即為一次線性擬合。
  • 二次多項式擬合曲線 - CSDN
    多項式擬合一次函數運行結果:100運行結果:[4.00355516 1.55927961]# 還可以用 poly1d 生成一個以傳入的 coeff 為參數的多項式函數:多項式擬合正弦函數最小二乘擬合運行結果:
  • Matlab:以編程方式擬合
    t = [0 0.3 0.8 1.1 1.6 2.3];y = [0.6 0.67 1.01 1.35 1.47 1.25];plot(t,y,'o')title('Plot of y Versus t')您可嘗試使用以下二次多項式函數對此數據進行建模:
  • Matlab基礎知識概述
    Workspace: 工作空間主要功能:現實與計算相關的變量名稱及其數值。可以在工作空間看到計算中間變量與結果的數值。圖1 Matlab界面2.2 Help幫助Matlab語法與函數眾多,必須熟練掌握matlab help幫助以便在使用時可以根據需要查詢matlab幫助文檔。
  • 數據擬合原理及MATLAB實現
    數據擬合有幾種不同的判別標準,即不同的損失函數,比如預測值與實際值偏差的絕對值之和、偏差的平方和最小(最小二乘法)等。2、多項式擬合將原始數據散點用多項式函數進行擬合,即為多項式擬合,進而通過最小二乘法求得多項式函數係數。
  • 利用np.polyfit實現多項式擬合
    本文記錄利用numpy.polyfit實現多項式係數的擬合以及利用numpy.polyder實現求導,並通過numpy.poly1d
  • 高考數學原創試題—多項式擬合
    泰勒展開式表明,具有n階導數的函數,可近似的由一個n次多項式表示,n取值越大,越接近於真實的函數,因此利用n階多項式可以對函數進行擬合,這種方法在近似計算等領域有著重要的應用。我們知道,一次函數的圖象是一條直線,因此是單調函數。
  • MATLAB曲線擬合及Fourier分析
    4.6.1  最小二乘原理及其曲線擬合算法設測得離散的n+1個節點的數據如下:構造一個如下的m次擬合多項式函數g(x)為 (m≤n):所謂曲線擬合的最小二乘原理,就是使上述擬合多項式在各數據點處的偏差的平方之和達最小。上式中的均為已知值,而式中的係數為個未知數,故可以將其看做是的函數,即。
  • 如何用Matlab擬合函數圖像——數據導入|圖像繪製|函數擬合|結果分析
    二、案例展示       數據:fluid.xlsx             步驟:1. Matlab—主頁—導入數據—fluid.xlsx                    2.選擇「數值矩陣」,然後點擊「導入所選內容」