我是使用Matlab / Simulink的初学者,需要进行一些系统分析。
因为我需要针对不同的系统和信号条件测试分析算法
我决定为数据生成创建一个简化但合适的simulink模型,而不是进行几个“真实”实验。
此模型在get_data()
函数中调用,数据按预期返回到变量d
。
由于我需要估计给定系统的传递函数,我必须创建一个iddata
对象才能提供数据
在合适的数据类型中。
从simulink检索的时间步长存储在data_time
中,系统的输入和输出数据存储在data_in
中。 data_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);
在进一步的编码和数据分析中,我发现iddata-object data_measured
的时间数据与给定的时间数据不同
data_time
为
any(data_measured.sa == data_time)
打印0
,表示没有任何元素是1
,并且给定的数组不相同。
由于any()
的上述调用未引起有关不等矩阵维度的任何错误,因此我决定同时绘制data_in
与其{
使用
data_time
和data_measured.u
与data_measured.sa
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')
情节如下:
正如你所看到的,两个情节之间有一个转变,恕我直言不应该在那里。 这种时间的转变似乎并没有从数据的开始就开始,因为在信号上升之前有一个小区域,而不是 吵。但是,simulink正在为整个信号添加噪声,正如您从中间给出的图中可以看到的那样。
总而言之,似乎将数据传递给iddata()
以某种方式沿着时间轴切割数据并插入一些额外的数据。
它来自哪里?我错过了什么吗?
答案 0 :(得分:0)
过了一会儿,我发现问题与Simulink中的ODE求解器有关。
设置Simulink以自动选择合适的解算器及其步长。这导致了不同的步长,这在iddata()
命令中使用离散采样时间时扩展了我的数据。
手动选择所需的ODE求解器并设置固定的步长后,一切正常。转移/延迟不再发生。