Matlab自带的曲线拟合程序
这个函数的功能是能自动搜索参数的取值,从而使得方程的误差最小。
效果如下
代码如下
%% Optimal Fit of a Non-linear Function % This is a demonstration of the optimal fitting of a non-linear function to a % set of data. It uses FMINSEARCH, an implementation of the Nelder-Mead simplex % (direct search) algorithm, to minimize a nonlinear function of several % variables. % % Copyright 1984-2002 The MathWorks, Inc. % $Revision: 5.15 $ $Date: 2002/04/02 17:52:33 $ %% % First, create some sample data and plot it. % t = (0:.1:2)'; % y = [5.8955 3.5639 2.5173 1.9790 1.8990 1.3938 1.1359 1.0096 1.0343 ... % 0.8435 0.6856 0.6100 0.5392 0.3946 0.3903 0.5474 0.3459 0.1370 ... % 0.2211 0.1704 0.2636]'; function [coeff,estimated_lambda] = fitdemo(XData, YData) if nargin<1, XData = (0:.1:2)'; YData = [5.8955 3.5639 2.5173 1.9790 1.8990 1.3938 1.1359 1.0096 1.0343 ... 0.8435 0.6856 0.6100 0.5392 0.3946 0.3903 0.5474 0.3459 0.1370 ... 0.2211 0.1704 0.2636]'; clc; end if ( size(XData) ~= size(YData) ) error('The two input matrices have to be of the same sizes'); end plot(XData,YData,'ro'); hold on; h = plot(XData,YData,'b'); hold off; title('Input data'); if ( size(XData, 1) == 1 ) t = XData'; y = YData'; elseif(size(XData, 2) == 1) t = XData; y = YData; end %% % The goal is to fit the following function with two linear parameters and two % nonlinear parameters to the data: % % y = C(1)*exp(-lambda(1)*t) + C(2)*exp(-lambda(2)*t) % % To fit this function, we've create a function FITFUN. Given the nonlinear % parameter (lambda) and the data (t and y), FITFUN calculates the error in the % fit for this equation and updates the line (h). % type fitfun %% % Make a guess for initial estimate of lambda (start) and invoke FMINSEARCH. It % minimizes the error returned from FITFUN by adjusting lambda. It returns the % final value of lambda. start = [1;0]; options = optimset('TolX',0.1); estimated_lambda = fminsearch('fitfun',start,options,t,y,h); %estimated_lambda = [estimated_lambda guidata(gcf)]; coeff = guidata(h); % C1,C2 'estimated_lambda = estimated_lambda'; 'coeff = coeff';
要拟合的函数为
function err = fitfun(lambda,t,y,handle) %FITFUN Used by FITDEMO. % FITFUN(lambda,t,y,handle) returns the error between the data and the values % computed by the current function of lambda. % % FITFUN assumes a function of the form % % y = c(1)*exp(-lambda(1)*t) + ... + c(n)*exp(-lambda(n)*t) % % with n linear parameters and n nonlinear parameters. % Copyright 1984-2002 The MathWorks, Inc. % $Revision: 5.8 $ $Date: 2002/04/08 20:04:42 $ A = zeros(length(t),length(lambda)); for j = 1:length(lambda) A(:,j) = exp(-lambda(j)*t); end c = A\y; z = A*c; err = norm(z-y); set(gcf,'DoubleBuffer','on'); set(handle,'ydata',z) guidata(handle, c); drawnow pause(.04)
因为这种拟合方法用的比较少,所以特此总结出来,希望后来对自己的道路段的拟合会有用处!
2016-1-23 1059
你们的评论、反馈,及对你们有所用,是我整理材料和博文写作的最大的鼓励和唯一动力。欢迎讨论和关注!
没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。
没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。