Оценить вектор в кусочной функции - PullRequest
1 голос
/ 19 октября 2019

Я хочу вычислить вектор xdata в кусочной функции, например:


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

Проблема в том, что код не вводит ни один из циклов if и ничего не возвращает. Может быть, причина в том, что функция пытается выполнить условия для всех векторов одновременно? Как мне поступить так, чтобы y (p0, xdata) что-то вернул?

Кстати, мне это нужно, потому что я должен подогнать модель под данные, подобные этим:


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

1 Ответ

2 голосов
/ 19 октября 2019

Ваш код не работает, потому что когда вы пишете что-то вроде этого:

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

Тогда «% code» не будет оцениваться, потому что он проверяет, выполняется ли условие для каждого значения вvector.

Допустим, вы хотите определить функцию Heaviside и оценить ее вектор. Затем вы используете цикл for:

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