How can I fit data to a piecewise function, where the breakpoint of the function is also a parameter to be optimised?
Show older comments
I have data with x and y values. This data should conform to a function: an assymmetric parabola. Here, the parameters that define the shape of the parabola should be different on either side of the maximum point of the parabola i.e. the breakpoint is where the maximum value of y occurs.
I was hoping to use 'fit' and to define an anonymous function for my data. But I'm not able to work out how to define an anonymous, piecewise function, especially where the breakpoint is one of the parameters to be determined by the fitting procedure, as it is not immediately clear from the data itself where the maximum value of y should occur.
Any help would be appreciated.
Accepted Answer
More Answers (3)
Walter Roberson
on 29 Sep 2025
(a1*x.^2 + b1*x + c1) .* (x <= d) + (a2*x.^2 + b2*x + c2) .* (x > d)
Note that for this to work, the coefficients must be constrained to be finite
2 Comments
Paul
on 30 Sep 2025
Sounds like both sides of the function should have the same value at x = d, at least that's how interpret the question. If so, then I think the function would look something like
(a1*(x-d).^2 + b1*(x-d) + c) .* (x <= d) + (a2*(x-d).^2 + b2*(x-d) + c) .* (x > d)
Rahul
on 30 Sep 2025
You can also parametrize the model function directly in terms of the break point coordinates (xbreak, ybreak) and two curvature parameters -
F= @(a1,a2,xbreak,ybreak, x) modelFun(a1,a2,xbreak,ybreak, x);
xbreak=3; ybreak=5;
fplot( @(x) F(-2,-0.6,xbreak,ybreak,x), [1,5]);
xline(xbreak,'--')
fType = fittype(F);
function y=modelFun(a1,a2,xbreak,ybreak, x)
X=x-xbreak;
LHS=(X<=0);
RHS=~LHS;
y=X.^2;
y(LHS)=a1.*y(LHS) + ybreak;
y(RHS)=a2.*y(RHS) + ybreak;
end
Why ? Both parabola can intersect below their respective maxima, and nonetheless the point of intersection can be the maximum y-value of the piecewise function.
F=@(x) asymParabola(-2,1,0,-6,5,-20 ,x);
fplot(F,[-10,-1]);axis padded %example plot
function y=asymParabola(a1,b1,c1, a2, s, rightSlope, x)
%Requirements: a1<0, a2<0, s>=0, rightSlope<=0
d=-b1/(2*a1)-s;
c2=polyval([a1,b1,c1],d);
left=(x<=d);
right=~left;
xright=x(right);
y=x;
y(left)=polyval([a1,b1,c1],x(left));
y(right)=a2*(xright-d).^2 + rightSlope*(xright-d) +c2;
end
Categories
Find more on Get Started with Curve Fitting Toolbox in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

