Date: Mar 26, 2013 3:41 AM
Author: Torsten
Subject: Re: lsqcurvefit Problem

"Xiangtong He" <xiangton@buffalo.edu> wrote in message <kipr8e$nfq$1@newscl01ah.mathworks.com>...
> Hello,
>
> This is my code, but finally it comes to an error information as follows;
>
> function myFit
> %% create the first half of the data
> xdata = [50 530 6.3e3 1.1e4 1.56e4 2.65e4 3.22e4 5.375e4 1.17e5 2.2e5 5.5e5];
> ydata = [1.6 1.56 1.48 1.44 1.39 1.31 1.28 1.15 0.95 0.84 0.68]/1.6;
>
>
> %% call |LSQNONLIN|
> p = lsqcurvefit(@mycurve,[2e-7 6e6],[],[],xdata,ydata);
> m = p(1)
> n = p(2)
>
> %% plot the original data and fitted function in a figure
> plot(xdata,ydata,'bo')
> hold on
>
> fitted = (1./(2*xdata)+m*log2(xdata)).^-(1-(1-exp(-(xdata/(-p(2))).^0.3))/1.5).*(2*xdata).^-(1-(1-exp(-(xdata/(-p(2))).^0.3))/1.5);
> semilogx(xdata,fitted,'r')
> xlabel('x'); ylabel('y')
> legend('Data', 'Fit')
>
> %% function that reports the error
> function err = mycurve(parameter,real_x, real_y)
> fit = exp(parameter(1).*(real_x + parameter(2)));
> parameter(2);
> err = fit - real_y;
>
> % weight the error according to the |WEIGHT| vector
> %err_weighted = err.*weight;
> %err = err_weighted;
> end
>
> end
>
> ****ERROR INFORMATION:
>
> Warning: Imaginary parts of complex X and/or Y arguments ignored

> > In myFit at 17
> Warning: Length of lower bounds is > length(x); ignoring extra bounds.
> > In checkbounds at 27
> In lsqnsetup at 56
> In lsqcurvefit at 196
> In myFit at 8
> Warning: Length of upper bounds is > length(x); ignoring extra bounds.

> > In checkbounds at 37
> In lsqnsetup at 56
> In lsqcurvefit at 196
> In myFit at 8
> Exiting due to infeasibility: 2 lower bounds exceed the corresponding upper bounds.
>
> Can you help me work it out?
>
> Thank you


Take a look at the documentation at
http://www.mathworks.de/de/help/optim/ug/lsqcurvefit.html
on how to call lsqcurvefit.
The 5th and 6th argument are reserved for lower and upper bounds for the variables. In your call, the 5th and 6th argument are xdata and ydata.
If you want to pass xdata and ydata to mycurve, call lsqcurvefit as
p = lsqcurvefit(@(x,xdata)mycurve(x,xdata,ydata),[2e-7; 6e6],xdata,ydata);

Best wishes
Torsten.