Script for fitting

From Horace
Jump to: navigation, search

%============= Fitting a single 1d cut with a generic peak =================

%Simplest case allows all parameters to be free
pars_in=[0.4,-0.7,0.1,0.5,-0.2,0.1,0.5,0.2,0.1,0.4,0.6,0.1,0.4,1.3,0.1];%vector of input parameters, in this case characterising some gaussian peaks

[wfit,fitdata]=fit_func(my_cut-0.3,@mgauss,pars_in);%note subtraction of 0.3 to account for background (see later for background fitting)

%The output wfit is an object that covers the same range as the data and is the resultant best fit.
%The output fitdata is a structure array giving information about the fit (parameters, errors, chi^2, correlation matrix, etc)

%Plot the result in a nice way (data is black circles + errorbars, fit is red line)
acolor black
plot(my_cut-0.3);%crude background subtraction
acolor red

%Keep the widths of all the peaks fixed, but allow heights and centres to vary;


pars_free=[1,1,0,1,1,0,1,1,0,1,1,0,1,1,0];%vector same size as that giving inputs, with 0 for parameter to be kept fixed, 1 for allowed to vary


%Now bind some of the positions to follow symmetry (i.e. position of peaks for Q<0 are  reflection of those at Q>0)


pars_bind={{2,11,0,-1},{5,8,0,-1}};%ensures symmetry about x=0; 2nd parameter is bound to 11th parameter in ratio -1, ditto the 5th and 8th parameters


%Repeat the above, but using some of the options


pars_bind={{2,11,0,-1},{5,8,0,-1}};%ensures symmetry about x=0

[wfit,fitdata]=fit_func(my_cut(1)-0.35,@multigauss,pars_in,pars_free,pars_bind,'list',2,'fit',[0.001 50 0.001]);

%This example of setting 'list' to 2 gives a very verbose output to the Matlab command window as the fit progresses.
%Setting 'fit' to [0.001 50 0.001] (from the default setting of fcp=[0.0001 30 0.0001]) changes respectively:
%    - The relative step length for calculation of partial derivatives
%    - The maximum number of iterations
%    - The stopping criterion, that is the relative change in chi-squared (i.e. stops if chisqr_new-chisqr_old < fcp(3)*chisqr_old)

%============== Fitting a single cut with an S(Q,w) model ======================

%The syntax, in terms of options, is the same as for fit_func. But this time the routine we use is called fit_sqw


[wfit,fitdata]=fit_sqw(my_cut-0.3,@my_sqw_model,pars,pfree,'list',1);%this time we choose a medium level of verbosity during the fit

%============= Fitting a cut with a foreground and background ==================

%We will use fit_sqw (S(Q,w) model for the cross-section) here, i.e. use fit_sqw. The same syntax applies for fit_func.

%We will fit a linear background model (in the format used for func_eval and fit_func; the function needs to be on the Matlab path like the model function)


%============= Fitting multiple cuts simultaneously with the same foreground but different backgrounds ===========

%Here we have an array of cuts (or slices). They are all fitted with the same foreground function and parameters, but the background
%for each cut is allowed to be different. This corresponds to the most realistic situation you will encounter in your data analysis

%Make an array of cuts:
for i=1:numel(my_en)

%If all of the backgrounds have the same form (e.g. they are all linear) but have different parameters, then this is easy,
%since we can just re-use the code from above:




%But suppose the backgrounds have different functional forms. Now we need to use cell arrays for the background function, parameters and pfree.
%In the example here we have a mixture of linear and quadratic backgrounds

bgpars={[1,0],[2,0],[2,1],[3,2,2],[3,0,1]};%use different initial guesses and different free/fixed parameters for the background