Simulink模型作为MATLAB中的函数

        我们知道,在simulink里面使用MATLAB-function,让MATLAB函数作为simulink系统里面的一个模型,是很常见的做法。

        但有时候我们也需要让Simulink模型作为一个函数,参与到MATLAB脚本中,比如有时我们需要向一个控制系统传入控制器参数然后读取控制过程的一些指标。

        那么“向simulink模型传入参数”以及“读出simulink控制过程的指标”,要如何做到呢?

总结:

Simulink视角下,

使用from workspace模块从MATLAB工作区获取参数,使用to workspace模块向MATLAB工作区传递参数。其中,参数要以特定格式传递,具体地说,simin/simout有timeseries,结构体,矩阵三种形式,这里不详细讨论这个视角。

MATLAB视角下,

使用assignin函数传递参数到simulink的模型工作空间,通过sim函数来运行Simulink模型,并通过simout对象获取仿真结果。

assignin函数,用于向指定工作区插入参数

用例:

assign('base','omeagaC',omegaC);

assignin('base', 'omega0', omega0);

assignin('base', 'b0', b0);

base工作区对simulink模型是可见的,但如果你是在一个函数里面调用simulink模型,那么simulink模型不能从这个函数的局部工作区读取参数

sim函数,用来运行同目录下的simulink模型

simout对象:

为获取simulink中的输出,可以使用to workspace,再在MATLAB中提取simout中的数据

simout有三种形式,我们可以在to workspace模块中设置

作者倾向于使用结构体

例子:

这是作者写的一个测试例:

输入LADRC控制器的三个参数,然后返回整个过程中被控量与期望量误差的均方差。

其中均方差是在simulink模型中采集的

function fitness = getFitness_LADRC(omegaC,omega0,b0)
%LADRCTEST 输入控制器的三个参数,输出本次控制过程的适应度

%向LadrcTest的slx模型传入Ladrc的三个参数,设定仿真时间为200s,
    assignin('base', 'omegaC', omegaC);
    assignin('base', 'omega0', omega0);
    assignin('base', 'b0', b0);

    % 设置仿真时间
    simTime = 200; % 仿真时间200秒

    % 运行仿真
    simOut = sim('LadrcTest', 'SimulationMode', 'normal', 'StartTime', '-10', 'StopTime', num2str(simTime), 'SaveOutput', 'on');
    % 提取仿真结果
    simdata = simOut.get('fitness');
    fitness=-simdata.signals.values(end);
end

让我们以omegaC=3.5,omega0=35,b0=0.5为例

可以看到,传入三个参数,传出适应度

我们点开模型,手动运行,用scope观察,结果与MATLAB上得到的适应度一致

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值