Simulink如何实现批量仿真?

我们可能都遇到过需要对simulink模型进行批量仿真、参数寻优的需求,在Simulink中进行批量仿真可以通过多种方式实现,具体选择方法取决于你的需求和仿真的规模。

一般情况下,simulink中对模型进行批量仿真的需求一般可以总结为:

  1. 有多个模型需要进行批量仿真。
  2. 需要对同一个模型的某些参数进行批量修改和仿真,以实现调参、寻优等需求。

多个模型的批量仿真

如果我们手头有多个不同的模型文件想要进行批量仿真,可以通过编写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_systemload_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);

运行计算上述代码可以看到系统会提示批量仿真的进程:

在这里插入图片描述
计算结果:

在这里插入图片描述

该方法的具体步骤为:

  1. 将需要修改的参数k创建为一个包含所有修改值的数组k。
  2. 使用Simulink.SimulationInput对象语法创建了一个包含10个元素的Simulink.SimulationInput 对象数组。
  3. 使用Simulink.SimulationInput 对象的setVariable方法将模型中的增益k修改为数组k中的元素。
  4. 通过for循环重复第三步的操作,修改所有Simulink.SimulationInput对象元素的k值。
  5. 通过sim函数进行批量运算,计算结果out为一个包含10个Simulink.SimulationOutput元素的数组。

注意:

  • 如果 simIn 是标量 Simulink.SimulationInput 对象,则 simOut 是标量 Simulink.SimulationOutput 对象。
  • 如果 simInSimulink.SimulationInput 对象数组,则 simOutSimulink.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处进行修改。
在这里插入图片描述

如果有多个参数,可以选择参数组合的方式

在这里插入图片描述

在计算前需要在模型栏勾选对应的模型,点击全部运行即可进行批量仿真

在这里插入图片描述

  • 17
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值