Why does lsqcurvefit to function with if statement take many iterations to converge and stays close to starting values?
    조회 수: 2 (최근 30일)
  
       이전 댓글 표시
    
Ive got this data I want to fit a function to:

The y axis mean is sometimes around 0, sometimes around 10^6 and the spike in the middle is about 4*10^2 higher or lower than the mean. The x-axis goes from 0 to 1. I want to fit a single sawtooth curve to it for which I made this function in my GUI:
    function s = explicitsinglesawtooth(fitvars, t)
    offset = fitvars(1);
    fi = fitvars(2);
    p = fitvars(3);
    a = fitvars(4);
    for ii=1:length(t)
        if t(ii) > fi && t(ii) <= fi+p
            s(ii) = offset+a*(t(ii)-fi)/p;
        else
            s(ii) = offset;
        end
    end
    s = s';
(I think I can make this function nicer, however for just now Im not bothered yet by it being slow, because the current problem is bugging me more)
This I then fit with lsqcurvefit like so:
    lbound = [-Inf -Inf -Inf -Inf];
    ubound = [Inf Inf Inf Inf];
    startvals = [mean(ydat)0.2 0.2 std(ydat)];
    [fitted resnorm residual exitflag] = lsqcurvefit(@explicitsinglesawtooth, startvals, xdat, ydat, lbound, ubound, options);
This however changes almost nothing from my starting guess the first 400 function evaluations. I dont really understand why the increments per evaluation are so little. I expected my function to evaluate slowly because I did not write it down nicely, but that is something different.
So to recap: my question is why it takes so many iterations, not why one iteration takes a long time
Thanks for any help.
댓글 수: 0
채택된 답변
  Matt J
      
      
 2013년 12월 10일
        You aren't pre-allocating s prior to the for-loop. I'd guess that's the reason for the slow behavior.
Aside from this, though, I'm worried about differentiability issues. Your F(x,xdata) does not look like a differentiable function of x.
I'm also worried about the division by p when nothing is being done to bound p away from zero.
추가 답변 (1개)
  Matt J
      
      
 2013년 12월 11일
        This might be a better alternative,
Your saw-tooth is equivalent to a 3-knot first order spline fit.
댓글 수: 0
참고 항목
카테고리
				Help Center 및 File Exchange에서 Get Started with Curve Fitting Toolbox에 대해 자세히 알아보기
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

