simultaneous fitting of two plots with two functions

I have two sets of dependent variable column vectors (y1, y2) for a set of independent variable column vectors (x). I want to fit the (x, y1) plot with the function f1(ca. f1 = (a + (b-a)*(1 + c*x^d))) and the (x, y2) plot with the function f2(ca. f2 = (b-a)*c*x^d)) simultaneously. Could anyone please help?
Many thanks, in advance! Arun

2 Comments

What do you mean by simultaneous? Based on your equations, the transformation from x to y_1 is independent of y_2 and likewise x -> y_2 is independent of y_1. So you can just fit the two functions separately.
The parameters a, b, c and d are to be same for both the fits. If I fit separately, it will not guarantee same values of the parameters for both the fits. Anyway, thank you.

Sign in to comment.

 Accepted Answer

Use "lsqcurvefit" with the data set xdata = (x,x),ydata = (y1,y2).
Best wishes
Torsten.

5 Comments

Hi Torsten, In fact I new that lsqcurvefit would work. But when I do it, it ends with an error: the function values and the ydata are not of same size. Most probably I am messing with the function set-up.
I was trying as follow:
xdata=[x(:1); x(:1)];
ydata=[y1(:1); y2(:1)]; % FYI, all x(:1), y1(:1) and y2(:1) are of same size.
fun=@(x,xdata) f1(x,a,b,c,d); f2(x,a,b,c,d);
x0=[- - - -];
x=lsqcurvefit(fun,xO,xdata, ydata);
Though I am not able to find out, I am definitely making a mess somewhere. Could you please point out?
Thanks and regards, Arun
xdata=[x(:,1); x(:,1)];
ydata=[y1(:,1); y2(:,1)];
fun=@(x,xdata) [f1(xdata(1:numel(xdata)/2),x(1),x(2),x(3),x(4)); f2(xdata(1:numel(xdata)/2),x(1),x(2),x(3),x(4))];
x0=[- - - -];
x=lsqcurvefit(fun,x0,xdata,ydata);
where f1(...),f2(...) must be column vectors each of the same size as xdata(1:numel(xdata)/2).
Best wishes
Torsten.
Hi Torsten, Thanks a lot for your help! Could you please help me out from the associated following problem?
As I mentioned earlier, for the set of independent vectors x1, there are two sets of vectors, y1 and y2. So essentially, I should be able to fit them separately, ca. (x1 vs y1) and (x1 vs y2) plots. When I use APP in MATLAB, it works fine with the following custom equation:
y=f(x1)=m1+((m2-m1)*(1+(((2*pi*x1*m3)^(1-m4))*sin(m4*pi/2)))/(1+(2*((2*pi*x1*m3)^(1-m4)*sin(m4*pi/2)))+((2*pi*x1*m3)^((2-(2*m4))))))
But, it does not work in CommandWindow when I use the same equation in the function:
fun=@(m,x1) (m(1)+((m(2)-m(1)).*(1+(((2.*pi.*x1.*m(3)).^(1-m(4))).*sin(m(4).*pi/2)))/(1+(2.*((2.*pi.*x1.*m(3)).^(1-m(4)).*sin(m(4).*pi/2)))+((2.*pi.*x1.*m(3)).^((2-(2.*m(4))))))));
The error is a bit surprising to me! Both the x1 and y1 are 24x1 matrices (column vectors). While, the fun is returning a 24x24 matrix, with all identical elements.
Suppose, if I use, m0=[1.1; 17; 1.85; 0.54]; % these are the parameters obtained from the best fit using APP with the above custom equation; fun(m0,x1) returns a 24x24 matrix with all identical elements. Could you please suggest where I am going wrong ?
Kind regards, Arun
... .*pi/2)))./(1+(2.* ...
instead of
... .*pi/2)))/(1+(2.* ...
Best wishes
Torsten.
That's great! Thanks a lot, Torsten!
Kind regards, Arun

Sign in to comment.

More Answers (1)

xdata=[x(:,1); x(:,1)];
ydata=[y1(:,1); y2(:,1)];
fun=@(x,xdata) [f1(xdata(1:numel(xdata)/2),x(1),x(2),x(3),x(4)); f2(xdata(1:numel(xdata)/2),x(1),x(2),x(3),x(4))];
x0=[- - - -];
x=lsqcurvefit(fun,x0,xdata,ydata);
where f1(...),f2(...) must be column vectors each of the same size as x.

Products

Release

R2018a

Community Treasure Hunt

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

Start Hunting!