Matlab对指定参数的曲线进行非线性拟合
Matlab擬合曲線的方式
Matlab擬合曲線的方式有很多種,有三次樣條插值、線性插值、多項式擬合等等。多項式擬合由于函數由f(x)=anxn+an?1xn?1+...+a1x+a0f(x)=a_nx^n+a_{n-1}x^{n-1}+...+a_1x+a_0f(x)=an?xn+an?1?xn?1+...+a1?x+a0?組成,若采用最小二乘法擬合,對于參數an,an?1,...,a1,a0a_n,a_{n-1},...,a_1,a_0an?,an?1?,...,a1?,a0?來說,方程組fn(x)=0f_n(x)=0fn?(x)=0是一個線性方程組,可以用Matlab求逆矩陣的方法,得到方程的最小二乘解。但如果參數構成的方程組并不是線性方程組,則不可以用矩陣的方法求得。使用樣條插值和線性插值固然可以,但是得不到需要的表達式,此時使用非線性擬合方法解決最為合適。
通常,我們在實驗前對模型都有一個假設,例如這是一個指數衰減的曲線,或者指數衰減振蕩的曲線,或者是一個周期振蕩的由若干個頻率的三角函數疊加組成的信號。此時我們只需要指定需要估計的參數,代入數據求解即可。以下就是一個點典型的例子。
步驟解讀
這個例子的數據是一個對一個慣性系統給定一個階躍輸入,對系統的輸出進行采集,并辨別這個系統。
(xdata,ydata)是一個一階系統階躍響應的采集數據,ydata是輸出值,xdata是時間戳。由于系統是階躍響應,我們假定系統的傳遞函數是KTps+1\frac{K}{T_ps+1}Tp?s+1K?,顯然需要辨別的兩個參數是K和TpT_pTp?。
該系統在階躍響應輸入下的始于表達式為c(t)=K(1?etTP)c(t)=K(1-\rm e^\frac{t}{T_P})c(t)=K(1?eTP?t?),因此需要建立的函數fun如下
是一個指定參數的函數,我們需要求解的參數就是x(1)和x(2),其中x返回值是一個二元參數向量,可直接調用fun函數求得y根據時間戳生成的辨識系統的計算值。并與實驗值ydata畫在一張圖進行比較。
clc close all plot(xdata,ydata);xlim([0,1]);hold on;%實際曲線繪圖 fun=@(x,xdata)(x(1)*(1-exp(-xdata/x(2))));%估計函數 x0=[1500,0.025];%初始估計值[x(1),x(2)] x=lsqcurvefit(fun,x0,xdata,ydata);%非線性函數擬合 y=fun(x,xdata);%代入估計的值,并獲得函數點 plot(xdata,y);xlim([0,1]);%繪制估計曲線 title(['[K,Tp]=',num2str(x)]);%標注估計的參數繪制的預估曲線如下:(藍色的是實驗數據,紅色的是擬合曲線)
可以發現,如果沿著實驗曲線的大致趨勢,擬合的指數逼近曲線如紅色線所示,可見辨識的參數較為準確。
總結
以上是生活随笔為你收集整理的Matlab对指定参数的曲线进行非线性拟合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle 练习题 20131017
- 下一篇: 第五章 计算机故障诊断与排除