2016-08-07 3 views
0

У меня есть много наборов данных за тот же период времени с отметкой 300 секунд. Наборы, которые заканчиваются до конца периода наблюдения (здесь я усеченный его от 0 до 3000 секунд) имеют пренебрежимо малые в остальных пространствах:Решите для независимой переменной между точками данных в MATLAB

x = [0;300;600;900;1200;1500;1800;2100;2400;2700;3000]; 
y(:,1) = [4.65;3.67;2.92;2.39;2.02;1.67;1.36;1.07;NaN;NaN;NaN]; 
y(:,2) = [4.65;2.65;2.33;2.18;2.03;1.89;1.75;1.61;1.48;1.36;1.24]; 
y(:,3) = [4.65;2.73;1.99;1.49;1.05;NaN;NaN;NaN;NaN;NaN;NaN]; 

data plot Я хотел бы знать, в какое время каждого набор данных будут достигают точки, где y равно определенному значению, в этом случае y = 2,5

Сначала я попытался найти ближайшее значение y до 2,5, а затем используя связанное время, но это не очень точно (точки должны упасть на одну и ту же горизонтальную линию):

ybreak = 2.5; 

for ii = 1:3 
[~, index] = min(abs(y(:,ii)-ybreak)); 
yclosest(ii) = y(index,ii); 
xbreak(ii) = x(index); 
end 

data with dots for the time at which y=2.5

Затем я попытался сделать линейную интерполяцию между точками данных, а затем решением для й при у = 2,5, но не был в состоянии сделать эту работу:

Сначала я устранил пренебрежим малый (что это кажется, что там должна быть более простой способ сделать):

for ii = 1:3 
    NaNs(:,ii) = isnan(y(:,ii)); 
    for jj = 1:length(x);  
     if NaNs(jj,ii) == 0; 
      ycopy(jj,ii) = y(jj,ii); 
     end 
    end 
end 

Затем попытался фитинга:

for ii = 1:3      
f(ii) = fit(x(1:length(ycopy(:,ii))),ycopy(:,ii),'linearinterp'); 
end 

И получить следующее сообщение об ошибке:

Error using cfit/subsasgn (line 7) 
Can't assign to an empty FIT. 

Когда я пытаюсь фитинга вне цикла (только для одного набора данных), он отлично работает:

f = fit(x(1:length(ycopy(:,1))),ycopy(:,1),'linearinterp'); 

f = 

    Linear interpolant: 
     f(x) = piecewise polynomial computed from p 
    Coefficients: 
     p = coefficient structure 

fitted curve for one dataset

Но я тогда еще не может решить п (x) = 2,5, чтобы найти время, в течение которого y = 2,5

syms x; 
xbreak = solve(f(x) == 2.5,x); 

Error using cfit/subsref>iParenthesesReference (line 45) 
Cannot evaluate CFIT model for some reason. 

Error in cfit/subsref (line 15) 
     out = iParenthesesReference(obj, currsubs); 

Любые советы или мысли о Эти подходы к этому будут высоко оценены. Мне нужно сделать это для многих наборов данных, все из которых имеют различное количество значений NaN.

ответ

1

Как вы упомянули, y=2.5 не находится в вашем наборе данных, поэтому значение x, которое соответствует этому, зависит от метода интерполяции, который вы используете. Для линейной интерполяции, вы могли бы использовать что-то вроде следующего

x = [0;300;600;900;1200;1500;1800;2100;2400;2700;3000]; 
y(:,1) = [4.65;3.67;2.92;2.39;2.02;1.67;1.36;1.07;NaN;NaN;NaN]; 
y(:,2) = [4.65;2.65;2.33;2.18;2.03;1.89;1.75;1.61;1.48;1.36;1.24]; 
y(:,3) = [4.65;2.73;1.99;1.49;1.05;NaN;NaN;NaN;NaN;NaN;NaN]; 

N = size(y, 2); 
x_interp = NaN(N, 1); 
for i = 1:N 
    idx = find(y(:,i) >= 2.5, 1, 'last'); 
    x_interp(i) = interp1(y(idx:idx+1, i), x(idx:idx+1), 2.5); 
end 

figure 
hold on 
plot(x, y) 
scatter(x_interp, repmat(2.5, N, 1)) 
hold off 

enter image description here

Это стоит иметь в виду, что приведенный выше код принимаемой ваши данные монотонно убывающая (как ваши данные), но это решение может также могут быть адаптированы для монотонного увеличения.

Смежные вопросы