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 个评论

  1. How do you call lsqnonlin()
  2. What options are you using?
  3. Have you tried profiling your code?
Matt J
Matt J 2013-3-26
编辑:Matt J 2013-3-26
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.

请先登录,再进行评论。

 采纳的回答

0 个投票

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.

更多回答(1 个)

@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.

类别

帮助中心File Exchange 中查找有关 Get Started with Optimization Toolbox 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by