一、概述
在进行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