Nonlinear fit of segmented curve
5 views (last 30 days)
Show older comments
How would I go about getting a nonlinear least-squares fit of a segmented curve? In this case, I have a short, linear, lag period followed by a logistic growth phase (typical of bacterial growth in culture).
Thus, for x < T0, y = Y0; for x >= T0, y = Y0 + (Plateau-Y0)*(1 - exp(-K*(X-X0)).
I need least squares estimates for each of the parameters: T0, Y0, Plateau, and K
I've attempted to use a custom function in the curve fitting toolbox, but cannot figure out how to allow for the two curves.
Thanks!
0 Comments
Accepted Answer
Teja Muppirala
on 5 Dec 2012
It is no problem to fit piecewise curves in MATLAB using the Curve Fitting Toolbox. You can deal with piecewise functions by multiplying each piece by its respective domain. For example:
rng(0); %Just fixing the random number generator for initial conditions
X = (0:0.01:10)';
% True Values
Y0_true = 3;
PLATEAU_true = 5;
K_true = 1;
X0_true = 4;
Y = [Y0_true] * (X <= X0_true) + [Y0_true + (PLATEAU_true-Y0_true)*(1 - exp(-K_true*(X-X0_true)))].* (X > X0_true);
Y = Y + 0.1*randn(size(Y));
plot(X,Y);
ftobj = fittype('[Y0] * (x <= X0) + [Y0 + (PLATEAU-Y0)*(1 - exp(-K*(x-X0)))].* (x > X0)');
cfobj = fit(X,Y,ftobj,'startpoint',rand(4,1))
hold on;
plot(X,cfobj(X),'r','linewidth',2);
5 Comments
Jonathan Gößwein
on 14 Oct 2022
The problem are the startpoints, rand(4,1) does not work indeed, but with an appropriate selection the method works (e.g. the true values).
More Answers (2)
John Petersen
on 4 Dec 2012
Not sure how you would do that, but you could try using a sigmoid function which will get you close, relatively speaking. Something like, for example,
y2 = Y0 + (Plateau-Y0)./(1 + exp(-K*(X-X0)));
laoya
on 14 May 2013
Hi Teja Muppirala,
I am also interested in this topic. Now my problem is: if the express of curves are not expressed explicitly, but should be calculated by functions, how to use this function?
Thanks, Tang Laoya
0 Comments
See Also
Categories
Find more on Linear and Nonlinear Regression in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!