往往在實際問題中都存在exp(x)、lnx、sinx等多種函數組合的非線性經驗公式。
對此我們就可以通過lsqcurvefit函數進行求解,該函數的方法被稱為非線性最小二乘,損失函數一樣,只不過類似於優化算法,給定參數初始值,然後優化參數,非線性最小二乘模型如下,即目標函數。
lsqcurvefit函數擬合格式
格式
x = lsqcurvefit(fun,a0,xdata,ydata)
x = lsqcurvefit(fun,a0,xdata,ydata,lb,ub)
x = lsqcurvefit(fun,a0,xdata,ydata,lb,ub,options)
[x,resnorm] = lsqcurvefit(…)
[x,resnorm,residual] = lsqcurvefit(…)
[x,resnorm,residual,exitflag] = lsqcurvefit(…)
[x,resnorm,residual,exitflag,output] = lsqcurvefit(…)
[x,resnorm,residual,exitflag,output,lambda]= lsqcurvefit(…)
[x,resnorm,residual,exitflag,output,lambda,jacobian] =lsqcurvefit(…)
參數說明:
在lsqcurvefit函數中,有trust-region-reflective和levenberg-marquardt兩種算法可以求解參數,其中默認採用信賴域(trust-region-reflective)算法。
a0為初始解向量, 因為求解是一個迭代的過程,需要先給定一個初始參數,再逐步修改參數的過程。所以要對a0初始化,一般而言,可以隨機,但是經驗上取與解接近的值會提高計算速度。
xdata,ydata為滿足關係ydata=F(a, xdata)的數據;
lb、ub為解向量的下界和上界lb≤a≤ub,若沒有指定界,則lb=[ ],ub=[ ];
options為指定的優化參數;
fun為待擬合函數,計算x處擬合函數值,其定義為 function F = myfun(a,xdata)
resnorm=sum ((fun(a,xdata)-ydata).^2),即在a處殘差的平方和;
residual=fun(a,xdata)-ydata,即在x處的殘差;
exitflag為終止迭代的條件;
output為輸出的優化信息;
lambda為解x處的Lagrange乘子;
jacobian為解x處擬合函數fun的jacobian矩陣。
f:符號函數句柄,如果是以m文件的形式調用的時候,別忘記加@.這裡需要注意,f函數的返回值是和y匹對的,即擬合參數的標準是(f-y)^2取最小值,具體看下面的例子
實例1:
clc;clear%清除變量y=[100.3 101.1 102.1 101.1 101.6 104.4 102.5 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); %確定待定係數a0=x;%以計算出的x為初值,循環迭代1000次enddisp(x);%輸出係數yy = fun1(x,xdata);%利用已經擬合好的模型預測y值len=[1:20];len1 = fun1(x,len);%預測走勢result=[y;yy]%實際值與預測值error=abs(y-yy);%誤差bfb=error./y%相對誤差errorsum=sum(error)/length(y)%平均誤差bfbsum=sum(bfb)/length(y)%平均相對誤差figure(1)plot(xdata,y,'r-',xdata,yy,'b-')legend('實際值','擬合值')title('實際值與預測值的比較','fontsize',15)ylabel('Y','fontsize',15)xlabel('X','fontsize',15)%axis([1 10 1 200]);%坐標範圍%set(gca,『xtick』,[1 2 …10]);%X軸設定%set(gca,『ytick』,[1 20 40 …200]);%Y軸設定figure(2)plot(len,len1,'r-')legend('擬合曲線')title('擬合曲線圖','fontsize',15)ylabel('Y','fontsize',15)xlabel('X','fontsize',15)function y = fun1(a, x);y = a(1) + a(2)*x + a(3)*x.^2 + a(4)*x.^3 + a(5)*x.^4;end結果:
實例2:
程序:
clc;clear all;close all;xdata = ... [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3];ydata = ... [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];fun = @(x,xdata)x(1)*exp(x(2)*xdata);x0 = [100,-1];x = lsqcurvefit(fun,x0,xdata,ydata)times = linspace(xdata(1),xdata(end));plot(xdata,ydata,'ko',times,fun(x,times),'b-')legend('Data','Fitted exponential')title('Data and Fitted Curve')結果:
實例3:
用MATLAB程序擬合Logistic函數:
程序:
clearclcxdata=0:10:180;ydata=[0 0 0.45 2.7 5.4 5.7 10.5 10.8 9.6 12.15 16.65 18.15 19.05 28.2 29.1 21.1 19.95 22.05 25.2];%% 指定非線性函數擬合曲線X0=[100 10 0.2];[parameter,resnorm]=lsqcurvefit(@fun,X0,xdata,ydata); %指定擬合曲線A=parameter(1);B=parameter(2);C=parameter(3);fprintf('擬合Logistic曲線的參數A為:%.8f,B為:%.8f,C為:%.8f', A, B, C);fit_y=fun(parameter,xdata);figure(1)plot(xdata, ydata, 'r*');hold onplot(xdata,fit_y,'b-');xlabel('t');ylabel('y');legend('觀測數據點','擬合曲線', 'Location', 'northwest');saveas(gcf,sprintf('Logistic曲線.jpg'),'bmp');%% Logistic函數% y=A/(1+B*exp(-C*t))function f=fun(X,t)f=X(1)./(1+X(2).*exp(-X(3).*(t)));end結果:
MATLAB內容往期回顧:
MATLAB中繪製三維圖形
MATLAB的輸入輸出input函數
matlab詳細介紹畫柱形圖
matlab中矩陣的入門知識
matlab中legend函數的用法
matlab繪圖--線性規劃圖解法示意
Matlab 進度條的製作
Matlab對fig文件導出數據
Matlab中plot函數全功能解析
Matlab的fmincon函數求解非線性規劃
MATLAB線性規劃函數求解線性規劃
MATLAB求解混合整數線性規劃
電子書推薦(一)《MATLAB在數學建模中的應用》
matlab GUI實現導入txt文件(含字符和數據的文本)
matlab 畫圖——誤差條圖errorbar函數(含視頻講解)
matlab多項式(定義、四則計算、求根)
Matlab中繪製不同坐標的圖形
Matlab 多項式擬合函數關係
層次分析法(AHP)在MATLAB中的應用
END
本文部分內容來源於網絡,僅供參考學習,如內容、圖片有任何版權問題,請聯繫處理,24小時內刪除。