MATLAB Answers

0

Slow convergence of lsqnonlin

Hi everyone,
I have a convergence problem with lsqnonlin and I hope that someone can help me speed it up.
Ok, so what do I have:
  • 18 different data sets with 8 data points each with each data point having a standard deviation
  • 18 different and really nasty objective functions that I build with the help of a for loop
  • 28 overall free parameters from which all have a lower bound and only one has an upper bound.
What I'm doing now:
  1. Generate initial conditions from log normal distribution
  2. Pass them to lsqnonlin and let lsqnonlin do its magic
  3. Save goodness of fit (not really chi^2 because I don't use weighted fitting)
  4. Repeat a lot of times and then choose the parameter set according to "chi^2" value
After diagnosing one of those many iteration, I see that it really takes long time for lsqnonlin to converge to a solution. And with long time I mean about 35 seconds for one iteration which is just not tolerable if you wanna do this 10000 times.
I hope I made myself clear and that anyone could hint me on ways to speed up the convergence. Of course I'll try to provide anything necessary for you to help me.
Thanks a lot in advance.
Pascal

  2 Comments

  1. How do you call lsqnonlin()
  2. What options are you using?
  3. Have you tried profiling your code?
Matt J 26 Mar 2013
By "one of those many iteration", you mean a single pass through steps 1-4 in your post?
In any case, the speed of convergence depends on the function being minimized. We need to see your objective and constraints to say anything about that.

Sign in to comment.

2 Answers

Answer by Pascal Schulthess on 4 Apr 2013
 Accepted Answer

Alright, I figured out how to speed up the calculation of the objective function immensely. By breaking it down into matrices and vectors I was able to come from 60 sec to 2.8 sec per 10000 objective function calls.

  0 Comments

Sign in to comment.



@Sean:
[pars, chi2] = lsqnonlin(@objFcn, iniConds, lb, ub, opts, xdata, ydata);
with
iniConds = lognrnd(mu, sigma, 1, nPar);
lb = zeros(size(iniConds));
ub = ones(size(iniConds))*Inf;
ub(23) = 1;
opts = optimset('MaxFunEvals', 10000, 'Display', 'off');
I haven't profiled my code yet, but I'm currently at it.
@Matt: Exactly. But "one of those iterations" I mean passing through points 1 to 3.

  0 Comments

Sign in to comment.