我们可能都遇到过需要对simulink模型进行批量仿真、参数寻优的需求,在Simulink中进行批量仿真可以通过多种方式实现,具体选择方法取决于你的需求和仿真的规模。
一般情况下,simulink中对模型进行批量仿真的需求一般可以总结为:
- 有多个模型需要进行批量仿真。
- 需要对同一个模型的某些参数进行批量修改和仿真,以实现调参、寻优等需求。
多个模型的批量仿真
如果我们手头有多个不同的模型文件想要进行批量仿真,可以通过编写Matlab脚本的方法进行仿真.
比如说我们手上有’model1’, ‘model2’, 'model3’三个模型文件,需要进行仿真,可以通过将多个模型创建为一个元胞数组,通过for
循环使用sim
函数依次进行仿真。
例如:
% 模型文件列表
modelList = {'model1', 'model2', 'model3'};
% 内存预分配
simOut{length(modelList)} = [];
for i = 1:length(modelList)
load_system(modelList{i});
simOut{i} = sim(modelList{i}); % 注意元胞数组使用()与{}索引的区别
end
注意:
- 在使用sim函数进行仿真时,须创建数组(simOut)用于保存仿真结果,否则每仿真新的模型时,其结果都会覆盖上一个模型的计算结果,最终只会保留最后一个模型的计算结果。
- 根据是否有打开simulink界面的需求选择
open_system
或load_system
函数。 - 避免检索问题,模型的路径均须添加至Matlab的工作路径。
多个参数的批量仿真
1. Simulink.SimulationInput对象方法
如果我们需要对同一个simulink模型中的某些参数进行批量修改并计算,可以考虑使用Simulink.SimulationInput
对象配置仿真以实现批量计算。
SimulationInput
对象可以配置的内容包括:
- 要仿真的模型
- 外部输入数据的源变量或文件
- 用于仿真的模块参数值
- 用于仿真的模型配置参数值
当 SimulationInput
对象的属性修改模型或模块参数值时,该值将在仿真期间修改,并在仿真结束时还原。
示例:
这里通过一个十分简单的模型进行演示,该模型的功能是通过设定值为k的增益模块(Gain)改变正弦信号的幅值,并输出结果至out端口。
假设我们的需求是得到当k分别取1~10时仿真的结果,因此需要进行10次仿真。
可以通过下面的代码进行批量仿真:
clc,clear,close
model = 'contGain';
k = 1:10;
% 读取模型文件
load_system(model)
% 内存预分配
simIn(10) = Simulink.SimulationInput(model);
for i = 1 : 10
simIn(i) = Simulink.SimulationInput(model);
simIn(i) = simIn(i).setVariable('k',k(i));
end
simOut = sim(simIn);
运行计算上述代码可以看到系统会提示批量仿真的进程:
计算结果:
该方法的具体步骤为:
- 将需要修改的参数k创建为一个包含所有修改值的数组k。
- 使用
Simulink.SimulationInput
对象语法创建了一个包含10个元素的Simulink.SimulationInput
对象数组。 - 使用
Simulink.SimulationInput
对象的setVariable
方法将模型中的增益k修改为数组k中的元素。 - 通过for循环重复第三步的操作,修改所有
Simulink.SimulationInput
对象元素的k值。 - 通过sim函数进行批量运算,计算结果out为一个包含10个
Simulink.SimulationOutput
元素的数组。
注意:
- 如果
simIn
是标量Simulink.SimulationInput
对象,则simOut
是标量Simulink.SimulationOutput
对象。 - 如果
simIn
是Simulink.SimulationInput
对象数组,则simOut
是Simulink.SimulationOutput
对象数组。
同理,如果我们需要同时修改多个参数,例如同时修改上述案例中正弦信号的幅值及增益,可以创建多维Simulink.SimulationInput
对象数组来实现。
clc,clear,close
model = 'contGain';
k = 1:10;
a = 1:2;
load_system(model)
simIn(10,2) = Simulink.SimulationInput(model);
for j = 1 : 2
for i = 1 : 10
simIn(i,j) = Simulink.SimulationInput(model);
simIn(i,j) = simIn(i,j).setVariable('k',k(i));
simIn(i,j) = simIn(i,j).setBlockParameter("contGain/Sine Wave",'Amplitude',a(j));
end
end
out = sim(simIn);
运行结果:
2. Multiple Simulations工具
相较于上述两种需要编写代码的方法,Matlab2021b版本开始在Simulink中新增了“多个仿真”功能。
可以在图示“仿真”—“输入和参数调整”中找到。
该功能菜单主要由模型栏与参数栏两部分组成。
可以在参数栏添加并修改变量,例如要实现前文提到的修改增益k的值为1~10,选择添加变量,修改变量名称为k,赋值为1:10即可。
如果要修改模块参数,可以选择添加模块参数,通过下图标记2处的选项,可以直接在模型中选择模块,点击模块后会如标记3处所示展开所有可修改的参数类型,选择需要修改的参数后即可在标记4处进行修改。
如果有多个参数,可以选择参数组合的方式
在计算前需要在模型栏勾选对应的模型,点击全部运行即可进行批量仿真