constrained fitting using lsqcurvefit / fmincon
1 Ansicht (letzte 30 Tage)
Ältere Kommentare anzeigen
I have a set of data points (data_x, data_y). I need to fit a model function into this data. Model is a function of 5 parameters, and I have defined it like that:
function F = model(x,xdata)
fraction1 = x(4);
fraction2 = x(5);
fraction3 = 1-x(4)-x(5);
F=1-(fraction1.*(exp(-abs(xdata)./x(1)))+(fraction2.*(exp(-abs(xdata)./x(2))))+(fraction3.*(exp(-abs(xdata)./x(3)))));
parameters x(4) and x(5) are used to define three fractions (as %), so their sum MUST be 1. To fit this curve I was using lsqcurvefit, like that:
%%initial conditions
a0 = [guess1 guess2 guess3 0.3 0.3];
%%bounds
lb = [0 0 0 0 0 ];
ub = [inf inf inf 1 1];
%%Fitting options
curvefitoptions = optimset( 'Display', 'iter' );
%%Fit
a = lsqcurvefit(@model,a0,x,y,lb,ub,curvefitoptions);
The thing is that don't know how to add constraints, to keep the sum of fractions = 1. I know that lsqcurvefit is not the best solution for this problem, but I have no idea how to feed fmincon with these data to finally find my parameters. Many thanks for help!
0 Kommentare
Antworten (1)
Alan Weiss
am 29 Nov. 2012
fmincon can satisfy your conditions, which are, I believe:
0 <= x(4) <= 1
0 <= x(5) <= 1
0 <= 1 - x(4) - x(5) <= 1, which, when combined with the previous, is the same as
x(4) + x(5) <= 1
Create the following bounds and matrices:
lb = zeros(5,1);
ub = [inf;inf;inf;1;1];
A = [0,0,0,1,1]; % for Ax <= b
b = 1; % for Ax <= b
After you put xdata and ydata in your workspace, your objective function can be
@(x)sum((model(x,xdata) - ydata).^2)
Use a reasonable fmincon algorithm, such as interior-point or sqp.
Good luck,
Alan Weiss
MATLAB mathematical toolbox documentation
0 Kommentare
Siehe auch
Kategorien
Mehr zu Get Started with Curve Fitting Toolbox finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!