求解MATLAB

时间:2016-08-07 16:48:08

标签: matlab time-series interpolation nan solver

我在同一时间段内拥有多组数据,时间为300秒。在观察期结束之前终止的集合(这里我将其截断为0到3000秒)在剩余空格中有NaN:

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

然后我尝试在数据点之间进行线性插值,然后在y = 2.5处求解x,但是无法使其工作:

首先我删除了NaN(似乎必须有一种更简单的方法吗?):

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

但我仍然无法解决f(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 个答案:

答案 0 :(得分:1)

正如您所提及的那样x3不在您的数据集中,因此与此对应的y=2.5的值取决于您使用的插值方法。对于线性插值,您可以使用类似下面的内容

x

enter image description here

值得注意的是,上面的代码假设您的数据是单调减少的(就像您的数据一样),但是这个解决方案也可以适应单调增加。