Search code examples
matlabdata-fittingmodel-fittingpiecewise

Evaluate a vector in a piecewise function


I want to evaluate the vector xdata in a piecewise function like this:


dat=load('k2.txt');
xdata = dat(:,1);
ydata = dat(:,2);
n=length(xdata);
p0=[0.0821 6.6 0.4];
y(p0,xdata)

function y_hat = y(p,t)
    P=4.885;
    T0 = 134.27426;
    omega=2*pi/P;
    gamma1=0.3539 ;gamma2=0.2851;
    c1=0;c2=gamma1+2*gamma2;c3=0;c4=-gamma2;
    c0=1-c1-c2-c3-c4; 
    z= p(2).*((sin(omega.*(t-T0))).^2+((p(3)/p(2)).*cos(omega.*(t-T0))).^2).^(1/2);
    lambda1= 0; 
    lambda3=p(1).^2;

        if ((1-p(1)<z) & (z<1+p(1)))
            k1 = acos((1-p(1).^2 + z.^2)./(2*z));
            k0 = acos(((p(1)).^2+z.^2-1)./(2.*z.*p(1)));
            y_hat = 1-1./pi*(p(1).^2.*k0+k1-sqrt((4*z.^2-(1+z.^2-p(1).^2).^2)/4));

        end

        if (1+p(1)<=z)
            y_hat=1-lambda1; 

        end

        if (z<=1-p(1))
            y_hat=1-lambda3; 

        end
end

The problem is that the code doesn't enter none of the if loops and returns nothing. Maybe the reason is that the function tries to fulfill the conditions for all the vector at once? How should I proceed so that y(p0,xdata) returns something?

By the way, I need this because I have to fit a model to data like this:


[theta] = lsqcurvefit(@y, p0, xdata, ydata);

Solution

  • Your code doesn't work, because when you write something like this:

    if [1 3 -1] > 0
       %code
    end
    

    Then "%code" won't be evaluated because it's checking, if the condition holds for every value in the vector.

    Let's say you want to define the Heaviside function and evaluate a vector of it. Then, what you do is using a for loop:

    x_vals = [-1 1 5];
    heav(x_vals)
    function y = heav(x)
        y = zeros(size(x));
        for i = 1:length(x)
            if x(i) >= 0
                y(i) = 1;
            else
                y(i) = 0;
            end
        end
    end