matlab最小二乘法的非線性參數擬合_第1頁
matlab最小二乘法的非線性參數擬合_第2頁
matlab最小二乘法的非線性參數擬合_第3頁
已閱讀5頁,還剩3頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、matlab 最小二乘法的非線性參數擬合首先說一下匿名函數:在創建匿名函數時, Matlab 記錄了關于函數的信息, 當使用句柄調用該函數的時候, Matlab 不再進行搜索,而是立即執行該函數, 極大提高了效率。所以首選匿名函數。具體擬合時可以使用的方法如下: 1 曲線擬合工具箱 提供了很多擬合函數,使用簡單 非線性擬合 nlinfit 函數 clear all; x1='x2='x=x1 x2; y= ' f=(p,x)*p(1)*(1-1/p (2) )*(1-(1-x(:,1)./p (2)邛(2)A2.*(x(:,1)A(-1/p (2)-1)A(-p(2).

2、*x(:,1).(1/p (2).*x(:,2);p0=8 'opt=optimset('TolFun',1e-3,'TolX',1e-3);%p R=nlinfit(x,y,f,p0,opt)2 最小二乘法在曲線擬合中比較普遍。 擬合的模型主要有1. 直線型2. 多項式型3. 分數函數型4. 指數函數型5. 對數線性型6. 高斯函數型一般對于LS問題,通常利用反斜杠運算 “”、fminsearch或優化工具箱提供 的極小化函數求解。在 Matlab 中,曲線擬合工具箱也提供了曲線擬合的圖形界 面操作。在命令提示符后鍵入: cftool ,即可根據數據,

3、選擇適當的擬合模型。“”命令1. 假設要擬合的多項式是:y=a+b*x+c*x9.首先建立設計矩陣X:X=o nes(size(x) x xA2;執行:para=Xypara 中包含了三個參數: para(1)=a;para(2)=b;para(3)=c; 這種方法對于系數是線性的模型也適應。2. 假設要擬合: y=a+b*exp(x)+cx*exp(xA2)設計矩陣 X 為X=ones(size(x) exp(x) x.*exp(x.A2);para=Xy3. 多重回歸 (乘積回歸 )設要擬合:y=a+b*x+c*t,其中x和t是預測變量,y是響應變量。設計矩陣為X=ones(size(x)

4、 x t %注意 x,t 大小相等!para=Xypolyfit 函數polyfit 函數不需要輸入設計矩陣,在參數估計中, polyfit 會根據輸入的數據生成 設計矩陣。1. 假設要擬合的多項式是:y=a+b*x+c*xA2p=polyfit(x,y,2)然后可以使用 polyval 在 t 處預測:y_hat=polyval(p,t)polyfit 函數可以給出置信區間。p S=polyfit(x,y,2) %5中包含了標準差y_fit,delta = polyval(p,t,S) %按照擬合模型在 t 處預測在每個 t 處的 95%CI為:*delta, y_fit+*delta)2.

5、 指數模型也適應假設要擬合: y = a+b*exp(x)+c*exp(x.2)p=polyfit(x,log(y),2)fminsearch 函數fmin search是優化工具箱的極小化函數。LS問題的基本思想就是殘差的平方和(一 種范數,由此,LS產生了許多應用)最小,因此可以利用fminsearch函數進行曲 線擬合。假設要擬合: y = a+b*exp(x)+c*exp(x.2) 首先建立函數,可以通過 m 文件或函數句柄建立: x='y='f=(p,x) p(1)+p(2)*exp(x)+p(3)*exp(x.2) %注意向量化 :p(1)=a;p(2)=b;p(3

6、)=c; %可以根據需要選擇是否優化參數%opt=options()pO=o nes(3,1);%初值para=fminsearch(p) (y-f(p,x).A2,pO) %可以輸出 Hessian矩陣 res=y-f(para,x)%擬合殘差3. 多項式型 的一個例子1900-2000年的總人口情況的曲線擬合clear all;close all;%cftool 提供了可視化的曲線擬合!t=1900 1910 1920 1930 1940 1950 1960 1970 1980 1990 2000'y='%t太大,以t的幕作為基函數會導致設計矩陣尺度太差,列變量幾乎線性相依

7、。 變換為 -1 1上s=(t-1950)/50;%plot(s,y,'ro'); %回歸線: y=a+bx mx=mean(s);my=mean(y); sx=std(s);sy=std(y); r=corr(s,y);b=r*sy/sx; a=my-b*mx;rline=a+b.*s;figure; subplot(3,2,1 2) plot(s,y,'ro',s,rline,'k');% title(' 多項式擬合 '); set(gca,'XTick',s,'XTickLabel',spri

8、ntf('%d|',t);%hold on;n=4;PreYear=2010 2015 2020;%預測年份 tPreYear=(PreYear-1950)/50;Y=zeros(length(t),n); res=zeros(size(Y);delta=zeros(size(Y); PrePo=zeros(length(PreYear),n);Predelta=zeros(size(PrePo);for i=1:np S(i)=polyfit(s,y,i);Y(:,i) delta(:,i)=polyval(p,s,S(i);%合的 Y PrePo(:,i) Predelta

9、(:,i)=polyval(p,tPreYear,S(i);預測res(:,i)=y-Y(:,i);%殘差end% plot(s,Y);%2009a自動添加不同顏色% legend('data','regression line','1st poly','2nd poly','3rd poly','4th poly',2)% plot(tPreYear,PrePo,'>');% hold off% plot(Y,res,'o');%殘 差圖r=corr(s,Y)

10、.A2 %RA2%擬合誤差估計 CIYearAdd=t;PreYear'tYearAdd=s;tPreYear'CFtit=一階擬合','二階擬合','三階擬合','四階擬合'for col=1:nsubplot(3,2,col+2);plot(s,y,'ro',s,Y(:,col),'g-');%原 始數據和擬合數據legend('Original','Fitted',2);hold on;plot(s,Y(:,col)+2*delta(:,col),

11、9;r:');%95% CI plot(s,Y(:,col)-2*delta(:,col),'r:');plot(tPreYear,PrePo(:,col),'>');%預測值plot(tPreYear,PrePo(:,col)+2*Predelta(:,col);%預測 95% CI plot(tPreYear,PrePo(:,col)-2*Predelta(:,col);axis( 0 400); set(gca,'XTick',tYearAdd,'XTickLabel',sprintf('%d|'

12、;,YearAdd); title(CFtitcol);hold off;endfigure;%殘差圖for col=1:nsubplot(2,2,col);plot(Y(:,i),res(:,i),'o');end4 非線性的 應用例子 ( 多元情況 )要擬合 y=a*xMn1+b*x2"n2+c*x3"n3%注:只是作為應用,模型不一定正確!%x2=x3!y='x1=12'x2=1'x3=1'x=x1 x2 x3;f=(p,x) p(1)*x(:,1)Ap(2)+p(3)*x(:,2)Ap(4)+p(5)*x(:,3)Ap

13、(6);p0=ones(6,1);p=fmi nsearch(p)sum(y-f(p,x)42,pO)res=y-f(p,x);res2=res.A2 %失敗的模型Matlab 自定義函數自定義函數的途徑:M 文件函數 (M file function)在線函數 (Inline Function)匿名函數 (Anonymous Function)文件函數范例function c=myadd(a,b)%這里可以寫函數的使用說明,前面以 %開頭 %在工作區中, help myadd 將顯示此處的說明 c=a+b;%end %非必須的第一行 function 告訴 Matlab 這是一個函數, a,

14、b 是輸入, c 是輸出, myadd 是函 數名。以 m 文件定義的函數必須保存為函數名的形式,上例中,函數應保存為。 要使用 myadd 函數,該函數必須在 Matlab 的搜索路徑中。調用方式:在 Matlab 命令符后輸入 a=1;b=2;c=myadd(a,b)2.在線函數 (Inline Function)通常作為參數傳遞給另外一個函數。比如fminsearch, lsqcurvefit 等函數需要以函數作為參數。在線函數從字符串表達式創建函數,例如:f=in li ne('x.A2','x');創建了函數f(x)=xA20要計算f(3),在工作區輸入f(3)即可。f(2 3 4)計算在x=2 34 時的值f=inline('x+y','x','y')創建了二元函數f(x,y)=x+y,工作區輸入f(2,3)計算2+3,等同于f(f,2,3)。3.匿名函數 (Anonymous Function) 匿名函數使用函數句柄來表示匿名函數,定義形式為 函數句柄 =(變量名) 函數表達式例如:f=(x) x.A2定義了函數f(x)=xA2, f(2)計算在x=2處的值。匿名函數可以調用 Matlab 函數,也可以使用工作區中存在的變量,例如 a=2;f=(x) x.A

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論