2016-09-20 197 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解算器並設置固定步長後,一切正常。移位/延遲不再發生。