Filter löschen
Filter löschen

How do I fit two equations that explain two parts of a curve?

9 Ansichten (letzte 30 Tage)
mdjupin
mdjupin am 17 Feb. 2015
Kommentiert: mdjupin am 24 Feb. 2015
Hi,my equations are: y(t)={(a/b)*(1-exp(-b(x-x_start)),for x_start <= x < x_end %equ1 and {c*exp(-b(x-xend)),for x > x_end %equ2
Here I do not know a,b and c. The idea is that since both equations have b in common, I would like to know how fitting these equations I can get one single value for b. I already fitted these equations individually, but I obtained two values of b, which are different from each fit.
  1 Kommentar
John D'Errico
John D'Errico am 17 Feb. 2015
I predict that your next question will be why is my curvefit not continuous at the break point? I.e., at x_end, the pair of functions will not be continuous.

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Sean de Wolski
Sean de Wolski am 17 Feb. 2015
Break the data into two pieces and do the curve fit
xlow = x(x<x_end);
ylow = y*x<x_end);
xhigh = x(x>x_end); % Note you have nothing for x==x_end
yhigh = y(x>x_end);
Now do the curve fit - either with the Curve Fitting App, lsqcurvefit or fitnlm.
  7 Kommentare
Torsten
Torsten am 23 Feb. 2015
You programmed it as
function call
xdata=[...];
ydata=[...];
xstart=...;
xend=...;
p0=[1 1 1];
p = lsqnonlin(@(p)myfun(xdata,ydata,xstart,xend,p),p0);
function F = myfun(xdata,ydata,xstart,xend,p)
for i=1:length(xdata)
if (xdata(i) >= xstart) && (xdata(i) < xend)
F(i) = ydata(i)-(p(1)/p(2))*(1-exp(-p(2)(xdata(i)-xstart));
else
F(i)=ydata(i)-(p(3)*exp(-p(2)(xdata(i)-xend));
end
end
?
Best wishes
Torsten.
mdjupin
mdjupin am 24 Feb. 2015
Thanks Torsten, this does work. I would advise not to use more than two equations, because the fitting get harder.
Cheers.
mdjupin

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Joep
Joep am 17 Feb. 2015
This is very simple solution which works in some cases one thing you need to noticed is the 1-based indexing of matlab.
a=10; b=20; c=-1; d=-3;
for x=1:a
t(x)=x;
y(x)=c*x;
end
for x=a:b
t(x)=t;
y(x)=d*x.^2;
end
figure
plot(t,y)
  1 Kommentar
mdjupin
mdjupin am 17 Feb. 2015
Thanks Joep. Here I do not know a,b and c. The idea is that since both equations have b in common, I would like to know how fitting these equations I can get one single value for b. I already fitted these equations individually, but I obtained two values of b, which are different from each fit.

Melden Sie sich an, um zu kommentieren.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by