2016-09-20 191 views
0

我是一名使用Matlab/Simulink的初学者,需要做一些系统分析。 因为我需要测试不同系统和信号条件下的分析算法 我决定为数据生成创建一个简化但合适的simulink模型,而不是做几个“真正的”实验。 在get_data()函数中调用此模型,并按预期将数据返回到变量d创建iddata对象似乎将数据沿时间轴移动

因为我需要估计给定系统的传递函数,所以我必须创建一个iddata对象以提供合适数据类型的数据 。 从simulink中获取的时间步骤存储在data_time中,系统的输入和输出数据分别为data_indata_indata_out。 然后将这三个变量传递给iddata()以创建传递函数估计所需的iddata对象data_measured。此代码段如下所示:

% get data from simulink simulation executed in get_data function 
d = get_data(); 

% extract data into variables 
data_time = d.time; 
data_in = d.data(:, 1); 
data_out = d.data(:, 2); 

% generate a time-domain data object (sample time given from simulink's noise generation) 
data_measured = iddata(data_out, data_in, 0.1); 

在进一步的编码和数据分析我发现,如在 data_time给出

any(data_measured.sa == data_time) 

的IDDATA对象data_measured的时间数据是不一样的打印0表示没有元素是1,并且给定的数组不相同。

由于any()上面的调用并没有提高对不平等的矩阵尺寸的任何错误,我决定用

subplot(3, 1, 1) 
plot(data_time, data_in); 
title('Data retrieved from simulink') 

subplot(3, 1, 2) 
plot(data_measured.sa, data_measured.u); 
title('Data as in iddata-object') 

subplot(3, 1, 3) 
plot(data_time, data_in, data_measured.sa, data_measured.u); 
title('Data comparison') 

情节来绘制两个data_in与它 相应时间的数据data_timedata_measured.udata_measured.sa下面给出:

plot

正如你看到的,有间错位恕我直言不应该在那里的两块地块。 由于在信号上升之前有一个很小的区域,而非噪声,所以时间的这种转换似乎并不从数据开始。然而,simulink正在给整个信号增加噪音,正如你从中间给出的图中看到的那样。

总而言之,似乎将数据传递给iddata()以某种方式沿时间轴切割数据并插入一些附加数据。 这是从哪里来的?我错过了什么吗?

回答

0

经过一段时间后,我发现问题与Simulink中的ODE解算器有关。

Simulink设置为自动选择合适的求解器及其步长。这会导致步长变化,在iddata()命令中使用离散采样时间时会扩展我的数据。

手动选择所需的ODE解算器并设置固定步长后,一切正常。移位/延迟不再发生。