?一、概述
?????????在進行simulink仿真的過程中常常遇到CPU利用率較低,仿真緩慢的情況,可以借助并行仿真改善這些問題,其核心思想是將參數掃描、蒙特卡洛分析或多工況驗證等任務拆分成多個子任務,利用多核CPU或計算集群的并行計算能力,顯著縮短整體仿真時間。
主要使用的函數包括:
1.parpool(numCore)函數,目的是開啟并行池(具體數量取決于計算機物理內核數)
2.Simulink.SimulationInput函數,用于
封裝模型參數、變量修改、回調函數等配置,簡單來說就是建立一個數組,存放并行仿真時模型的參數
3.parsim函數,用于
將SimulationInput
數組分發到各工作進程執行
二、流程
大體使用過程如下
1.開啟并行工作池
clear; clc;
% start parpool by codes.
delete(gcp('nocreate')); % 關閉之前的并行池
numCore = 2; % 設定并行工作池的數量(受限于CPU真實內核數)
p = parpool(numCore); % start parpool.
2.打開simulink文件
%打開模型
modl = 'u_of_ideal_full_bridge_LLC_double_vol_blue';
open_system(modl);
load_system(modl);
3.設置參數
Lm = 20e-6;
k = [1 10 100 1000];
Lr = zeros(size(k));
for i = 1:length(Lr)
Lr(i) = Lm/k(i);
end
4.建立輸入函數
In(length(k)) = Simulink.SimulationInput(modl); %內存預分配
for i = 1 : length(k)
In(i) = Simulink.SimulationInput(modl);
In(i) = In(i).setVariable('Lr',Lr(i));
In(i) = In(i).setPostSimFcn(@(x) u_PostSimFunction(x));%這行代碼用于設置后處理函數,具體作用在后面解釋
end
5.運行仿真
Out = parsim(In,'ShowSimulationManager','on');%運行結果會存儲在OUT中
三、后處理函數作用
simulink仿真的數據會通過to workscape模塊傳遞到基礎工作區,但是在并行仿真時,數據都會保存在計算機內存里,這樣子很容易導致計算機內存爆滿,所以可以設置一個后處理函數,在每次仿真結束后直接對仿真數據進行處理,把處理結果保存,其余數據清空。
示例中的后處理函數如下:
?
function newout = PostSimFunction(simOut, fm)
%計算阻抗
newout.Ro = sum(simOut.get('Vout') .* exp(-1j * 2 * pi * fm * simOut.get('to')))...
/sum(simOut.get('Iout') .* exp(-1j * 2 * pi * fm * simOut.get('to')));
%計算效率
newout.u = (mean(simOut.get('Vout'))*mean(simOut.get('Iout')))/(mean(simOut.get('Vi'))*mean(simOut.get('Ii')));
%清空simOut
simOut.Vout = 0;
simOut.Iout = 0;
simOut.to = 0;
simOut.fm = 0;
end