% Demonstration of a quantitative analysis application of curve fitting,
% where the peak height measured by curve fitting is used only to determine
% the concentration of the substance that created the peak by constructing
% a calibration curve. This demo shows that the peak shape is relatively
% unimportant, for a single isolated peak whose shape is constant
% and independent of concentration. If the wrong model shape is used, the
% peak heights measured by curve fitting will be inaccurate, but the error
% will be exactly the same for the unknown samples and the known
% calibration standards, so the error will cancel out and the measured
% concentrations will be accurate. Still, it's useful to use as accurate a
% model peak shape as possible, because the goodness of fit (percent
% fitting error or the R2) can be used as an indicator if something
% unexpected goes wrong during the analysis (such as an increase in the
% noise or the appearance of an interfering peak from a foreign substance).
t=[1:5:1000]; % Defines the "number of wavelengths"
Noise=.1;
FitPeakShape=1; % Try the "wrong" peakshape here (try 2,3,21,41)
sensitivity=10; % proportionality constant between concentration and peak height
% The number of measurements is defined by the length of amp
conc=[.1 .1 1 1 2 2 3 3 4 4 5 5]; % concentrations of standards
pos=500; % Position of peak on the x axis
wid=200; % Width (full width at half maximum) of the peak
NumPeaks=1;NumTrials=1;extra=0;start=0;autozero=1;fixedparameters=0;plots=1;bipolar=0;minwidth=.1;DELTA=1;clipheight=0;
% A = matrix containing one unit-amplitude peak in each of its rows
A = zeros(length(pos),length(t));
amp=(conc*sensitivity); % amp is directly proportional to conc.
% amp=(conc*sensitivity).^.9; % Nonlinear relationship between conc and amp
figure(1)
for k=1:length(amp)
A(k,:)=t/100+amp(k).*gaussian(t,pos,wid)+Noise.*randn(size(t)); % You can use any peak function here
[results(k,:),R2(k,:)]=peakfit([t;A(k,:)],0,0,NumPeaks,FitPeakShape,extra,NumTrials,start,autozero);
% [results(k,:),R2(k,:)]=peakfit([t;A(k,:)],0,0,NumPeaks,FitPeakShape,extra,NumTrials,start,autozero,fixedparameters,plots,bipolar,minwidth,DELTA,clipheight);
end
subplot(2,1,1);title('Curve fitting result for the last standard (using peakfit.m)')
MeanR2=mean(R2(:,2));
figure(2)
clf
plot(t,A)
xlabel('x')
ylabel('Signal Amplitude')
title('Superimposed signal peaks of all the standards')
figure(3)
clg
coef=plotit(conc,results(:,3),1);
title('Calibration curve based on peak heights measured by curve fitting')
MeasuredConc=(results(:,3) - coef(2))./coef(1);
xlabel('Concentrations of Standards')
ylabel('Measured peak heights')
figure(4)
plotit(conc,MeasuredConc,1);
title('Correlation of actual and measured concentrations, based on peak height')
xlabel('Actual concentrations')
ylabel('Measured concentrations')
figure(5)
clg
coef=plotit(conc,results(:,5),1);
title('Calibration curve based on peak areas measured by curve fitting')
ylabel('Measured peak areas')
xlabel('Concentrations of Standards')
% Using the peak area readings of the standards as unknown readings
MeasuredConc=(results(:,5) - coef(2))./coef(1);
figure(6)
plotit(conc,MeasuredConc,1);
title('Correlation of actual and measured concentrations, based on peak area')
xlabel('Actual concentrations')
ylabel('Measured concentrations')