matlab 萬能實用的非線性曲線擬合方法

2021-08-22 19:06:29 字數 3668 閱讀 6941

在科學計算和工程應用中,經常會遇到需要擬合一系列的離散資料,最近找了很多相關的文章方法,在這裡進行總結一下其中

最完整、幾乎能解決所有離散引數非線性擬合的方法

第一步:得到散點資料

根據你的實際問題得到一系列的散點

例如:

x=[3.2,3.6,3.8,4,4.2,4.8,5,5.4,6.2,6.4,6.6,6.9,7.1]';%加上一撇表示對矩陣的轉置

y=[0.38,0.66,1,0.77,0.5,0.66,0.83,1,0.71,0.71,1,0.87,0.83]';

第二步:確定函式模型

根據上述的實際散點確定應該使用什麼樣的曲線,或者說是想要模擬的曲線

t=[3.2,3.6,3.8,4,4.2,4.8,5,5.4,6.2,6.4,6.6,6.9,7.1]';

tt=[0.38,0.66,1,0.77,0.5,0.66,0.83,1,0.71,0.71,1,0.87,0.83]';

plot(t,tt,'.');%得到散點圖

散點圖如下所示:

我們已知現存的幾種典型的(也是絕大多數情況下的函式模型)

選定乙個與散點圖像相匹配的函式模型,在此例中

我們選擇典型的s型曲線模型y= 1/(a+b*e^(-x)),其實此處的函式模型可以任意。

第三步:確定選用函式模型中的未知引數

首先了解一下

matlab

中的inline函式,inline是用來定義內聯函式的

比如說:

y=inline('sin(x)','x') %第乙個引數是表示式,第二個引數是函式變數

y(0) %計算sin(0)的值

y(pi) %計算sin(pi)的值

q=quad(y,0,1); %計算sin(x) 在0到1上的積分

之後,我們在**中進行函式的定義

x=[3.2,3.6,3.8,4,4.2,4.5,4.8,5,5.3,5.4,5.6,5.8,6,6.2,6.4,6.6,6.9,7.1]';

y=[0.38,0.66,1,0.77,0.5,0.33,0.66,0.83,0.33,1,0.33,0.5,0.33,0.71,0.71,1,0.87,0.83]';

myfunc = inline('1./(beta(1)+beta(2).*exp(-x))','beta','x');%三個引數分別為:函式模型(注意需要使用點除和點乘),待定係數,自變數

beta0 = [0.2,0.2]';%待定係數的預估值

beta = nlinfit(x,y,myfunc,beta0);%

其中,beta返回了非線性擬合之後的待定係數,beta(1)和beta(2)表示待定係數,可以為任意數量的擴充套件beta(n),也就說明了選擇函式模型的自由性,甚至可以有100個引數!

beta0

表示的是函式模型中待定係數的預估值,可以任意設定

matlab 

中的nlinfit(x,y,f,a)函式:用於擬合非線性表示式的函式

f:符號函式控制代碼,如果是以m檔案的形式呼叫的時候,別忘記加@.這裡需要注意,f函式的返回值是和y匹對的,即擬合引數的標準是(f-y)^2取最小值,具體看下面的例子

a:最開始預估的值(預擬合的未知引數的估計值)。如上面的問題如果我們預估a為1,b為2,則a=[1 2]

x:我們已經獲知的x的值

y:我們已經獲知的x對應的y的值(

這部分不懂的在matlab中help命令進行了解

)求解出beta的大小

:beta(1) = 1.1562  beta(2) = 15.1875;

畫圖:使用plot()函式

t=[3.2,3.6,3.8,4,4.2,4.8,5,5.4,6.2,6.4,6.6,6.9,7.1]';

tt=[0.38,0.66,1,0.77,0.5,0.66,0.83,1,0.71,0.71,1,0.87,0.83]';

plot(t,tt,'.');

hold on%保證同時顯示

結果:是不是很棒!~,另外可以自行加上對應的橫縱座標內容,這裡就不多說了。

總結一下matlab非線性擬合散點圖的過程:

得到散點資料=>確定函式模型=>求解函式模型的待定係數=>得到擬合函式的具體形式=>畫出擬合影象

用過matlab的擬合、優化和統計等工具箱的網友,會經常遇到下面幾個名詞:

sse(和方差、誤差平方和):the sum of squares due to error

mse(均方差、方差):mean squared error

rmse(均方根、標準差):root mean squared error

r-square(確定係數):coefficient of determination

adjusted r-square:degree-of-freedom adjusted coefficient of determination

下面我對以上幾個名詞進行詳細的解釋下,相信能給大家帶來一定的幫助!!

一、sse(和方差)

該統計引數計算的是擬合資料和原始資料對應點的誤差的平方和,計算公式如下

sse越接近於0,說明模型選擇和擬合更好,資料**也越成功。接下來的mse和rmse因為和sse是同出一宗,所以效果一樣

二、mse(均方差)

該統計引數是**資料和原始資料對應點誤差的平方和的均值,也就是sse/n,和sse沒有太大的區別,計算公式如下

三、rmse(均方根)

該統計引數,也叫回歸系統的擬合標準差,是mse的平方根,就算公式如下

在這之前,我們所有的誤差引數都是基於**值(y_hat)和原始值(y)之間的誤差(即點對點)。從下面開始是所有的誤差都是相對原始資料平均值(y_ba)而展開的(即點對全)!!!

四、r-square(確定係數)

在講確定係數之前,我們需要介紹另外兩個引數ssr和sst,因為確定係數就是由它們兩個決定的

(1)ssr:sum

of squares of the regression,即**資料與原始資料均值之差的平方和,公式如下

(2)sst:total sum of squares,即原始資料和均值之差的平方和,公式如下

細心的網友會發現,sst=sse+ssr,呵呵只是乙個有趣的問題。而我們的「確定係數」是定義為ssr和sst的比值,故

其實「確定係數」是通過資料的變化來表徵乙個擬合的好壞。由上面的表示式可以知道「確定係數」的正常取值範圍為[0

1],越接近1,表明方程的變數對y的解釋能力越強,這個模型對資料擬合的也較好。

matlab 萬能實用的非線性曲線擬合方法

網路 在科學計算和工程應用中,經常會遇到需要擬合一系列的離散資料,最近找了很多相關的文章方法,在這裡進行總結一下其中 最完整 幾乎能解決所有離散引數非線性擬合的方法 第一步 得到散點資料 根據你的實際問題得到一系列的散點 例如 x 3.2,3.6,3.8,4,4.2,4.8,5,5.4,6.2,6....

實用PHP技巧 萬能Cache

web程式設計師最常使用的資料庫封裝方式就是dao,其實和馬丁大爺在poeaa中所說的表資料入口差不多 01 class articledao 02 07 08 public function findbytitle title 09 12 如上所示,是乙個最簡單的dao例子,為了提高效率,很多時候...

mysql萬能 Mysql的萬能優化方法

在命令列執行 1.檢視優化器狀態 show variable like optimizer trace 2.會話級別臨時開啟 set session optimizer trace enabled on end markers in json on 3.設定優化器追蹤的記憶體大小 set optim...