[忤旭]《MATLAB》Simulink自動(dòng)更改參數(shù)示例

大家好,我是忤旭!
今天分享的是關(guān)于MATLAB仿真中利用腳本和回調(diào)函數(shù)來實(shí)現(xiàn)一鍵多次仿真,并且每次仿真都自動(dòng)修改參數(shù)。需要注意的文中腳本只針對(duì)每次仿真數(shù)據(jù)是定值的模型,如果要保存時(shí)變數(shù)據(jù)請(qǐng)自行修改腳本。
修改當(dāng)前工作文件夾
進(jìn)入MATLAB后,先將當(dāng)前工作文件夾切換到你想要的文件夾。


新建腳本文件



腳本編寫
完整的腳本,在文章的最后會(huì)進(jìn)行代碼分析。

仿真模型搭建
搭建你的仿真模型,這里只是舉個(gè)例子。





設(shè)置直流電源的參數(shù)為變量inp,后續(xù)每次仿真都修改它的值。


設(shè)置回調(diào)函數(shù)
通過設(shè)置回調(diào)函數(shù)來建立Simulink模塊與MABLAB工作空間的聯(lián)系。


我選擇預(yù)加載函數(shù)來建立橋梁,并在預(yù)加載函數(shù)中定義了MATLAB工作空間中的變量inp,也就是模型每次加載時(shí)都會(huì)創(chuàng)建一個(gè)inp的工作空間變量,同時(shí)直流電源的參數(shù)由這個(gè)變量決定。

記錄數(shù)據(jù)到MATLAB工作空間
為了保存每次仿真的數(shù)據(jù),必須將每次仿真的數(shù)據(jù)記錄到MATLAB工作空間以寫入Excel。右鍵信號(hào)線并選擇Log Selected Signals以將這條信條線的數(shù)據(jù)記錄到MATLAB工作空間。

需要注意的是哪條信條線先進(jìn)行記錄根據(jù)你自己而定,比如這張圖里我選擇先記錄電流,再記錄電壓,這將與最后仿真結(jié)果中數(shù)據(jù)的順序有關(guān)。

腳本運(yùn)行
運(yùn)行腳本后,等待一段時(shí)間,這與你設(shè)置的仿真次數(shù)有關(guān),當(dāng)腳本運(yùn)行完畢后你就會(huì)得到圖中保存了所有你記錄的信號(hào)線的data.xlsx,右邊的simOut是單次仿真的數(shù)據(jù),下面會(huì)講解如何在simOut中找到你要的數(shù)據(jù)。

單次仿真數(shù)據(jù)保存的地方

注意觀察圖中右框中顯示的內(nèi)容,是否是你想要的數(shù)據(jù)順序,如果不是請(qǐng)重新返回模型修正記錄順序。


這就是你記錄的第1條信號(hào)線的單次仿真數(shù)據(jù),紅框中是數(shù)據(jù)地址,在最后加上數(shù)據(jù)索引就可以得到一個(gè)具體數(shù)值了。比如圖中第1個(gè)數(shù)值1需要使用.Data(1,1)來進(jìn)行索引,而這一列的數(shù)值你可以使用.Data(:,1)來索引。

查看所有仿真數(shù)據(jù)保存的Excel文件

可以從圖中看到第1列數(shù)據(jù)為記錄的電流,第2列數(shù)據(jù)為記錄的電壓,與預(yù)期的數(shù)據(jù)順序符合。

代碼分析

model = 'Test';? ? ? ? ? ? ? ? ? ? ?%仿真模型名稱,不用加.slx后綴
定義存放模型名的變量,根據(jù)你模型名字進(jìn)行修改。
inp = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? %變量初始化
定義仿真模型中每次要改變的參數(shù),你也可以定義好幾個(gè)。
inp_series = 1:1:10;? ? ? ? ? ? ? ? %設(shè)置變量的數(shù)組
定義一個(gè)數(shù)組,用來存放參數(shù)準(zhǔn)備更改的值,比如1:1:10就是inp將從1仿真到10,每次步長(zhǎng)為1。
Excel_name = 'data.xlsx';? ? ? ? ? ?%保存數(shù)據(jù)的Excel文件名
定義存放Excel名字的變量,你可以改名。
head1 = "1";? ? ? ? ? ? ? ? ? ? ? ? %數(shù)據(jù)1的頭
定義數(shù)據(jù)1的頭,也就是一列數(shù)據(jù)的名字。
head2 = "2";? ? ? ? ? ? ? ? ? ? ? ? %數(shù)據(jù)2的頭
定義數(shù)據(jù)2的頭,也就是一列數(shù)據(jù)的名字。
Excel_data_head = [head1, head2];? ?%存放數(shù)據(jù)頭的變量
定義存放數(shù)據(jù)頭的變量,你可以按你需要增加或減少數(shù)據(jù)頭。
%%
open_system(model);
打開Simulink模塊。
load_system(model);
加載model仿真模型。
for i = 1:1:length(inp_series)
循環(huán)參數(shù)數(shù)組。
? ? inp = inp_series(i);
????從參數(shù)數(shù)組中取一個(gè)新參數(shù)賦給參數(shù)inp。
? ? simOut = sim(model);
????對(duì)model仿真模型開始仿真。
? ??
? ? if exist(Excel_name, 'file')==0
????判斷當(dāng)前工作文件夾中是否存在名為Excel_name的Excel。
? ? ? ? disp('no Excel file');
????????如果不存在就打印不存在Excel文件。
? ? ? ? Excel_data_head_position = strcat(['A', '1', ':', char('A' + length(Excel_data_head) - 1), '1']);
????????根據(jù)定義的數(shù)據(jù)頭變量長(zhǎng)度來創(chuàng)建數(shù)據(jù)頭位置變量。
? ? ? ? xlswrite(Excel_name, Excel_data_head, 'sheet1', Excel_data_head_position);
????????根據(jù)數(shù)據(jù)頭位置變量將數(shù)據(jù)頭變量寫入名為Excel_name的Excel文件中。
? ? ? ? disp('Excel has been created');
????????打印Excel已經(jīng)創(chuàng)建。
? ? end
? ? load = xlsread(Excel_name, 'sheet1');
????加載名為Excel_name的Excel文件的sheet1工作表。
? ? [m, n] = size(load);
????計(jì)算Excel的形狀并賦值給m和n。
? ? m = m + 1;
????行數(shù)加1。
? ? write_position = strcat(['A', num2str(m), ':', char('A' + length(Excel_data_head) - 1), num2str(m)]);
????根據(jù)當(dāng)前行數(shù)和數(shù)據(jù)頭變量長(zhǎng)度來定義數(shù)據(jù)位置變量。
? ? data = [];
????定義數(shù)據(jù)變量為一維數(shù)組。
? ? for j = 1:1:length(Excel_data_head)
????根據(jù)數(shù)據(jù)頭長(zhǎng)度進(jìn)行循環(huán)。
? ? ? ? data = [data simOut.logsout{j}.Values.Data(1:1)];
????????從仿真數(shù)據(jù)中依次取得信號(hào)線數(shù)據(jù),并存放進(jìn)數(shù)據(jù)變量中。需要注意雖然文中(1:1)與(1,1)等價(jià),但單個(gè)數(shù)據(jù)索引應(yīng)使用(1,1),列向量數(shù)據(jù)索引應(yīng)使用(:,1)。
? ? end
? ? result = xlswrite(Excel_name, data, 'sheet1', write_position);
????根據(jù)將數(shù)據(jù)data寫入名為Excel_name的Excel的sheet1的write_position位置。
end