for 循环中的 Simulink 模型

Simulink model inside for loop

我想检查一些块参数如何影响我的模拟结果。

我使用 for 循环来更改此参数,但它运行起来很慢。

mdl_name='Gains';
open_system(mdl_name);

for K1 = 1:2
    for K2 = 1:2
        for K3 = 0.1:0.1:2

            set_param([mdl_name,'/Tfn'],'Numerator',mat2str(50),'Denominator',mat2str([20]));
            set_param([mdl_name,'/K1'],'Gain',mat2str(K1));
            set_param([mdl_name,'/K2'],'Gain',mat2str(K2));
            set_param([mdl_name,'/K3'],'Gain',mat2str(K3));

            mdl_name='PWM_Gains';
            open_system(mdl_name);

            Data = sim(mdl_name,'StartTime','40','StopTime','85','FixedStep',num2str(dt));
            Delta_PWM{i} = Data.get('Delta_PWM').signals.values;

            Gains{i} = [K1,K2,K3];

            i = i + 1
        end
    end
end

有没有更有效的方法解决?

谢谢

使用parsim.

您可以使用 load_system 而不是 open_system 来避免打开 simulink。您可能只需要在 for 循环之前调用它一次,而不是每次迭代。

如果仍然花费太长时间,尝试更大的步长(或变量,由ode求解器确定),或者在变化的参数中更大的步长。

使用 parsim 的示例:

% load model
mdl_name='Gains';
load_system(mdl_name);

% parameter to simulate
K1 = 1:2;
K2 = 1:2;
K3 = 0.1:0.1:2;

% create matrix with all combinations
[k1, k2, k3] = ndgrid(K1, K2, K3);
Gains = [k1(:), k2(:), k3(:)];

% Create an array of SimulationInput objects and specify the sweep value for each simulation
numSims = size(Gains,1);
simIn(1:numSims) = Simulink.SimulationInput(model);

% setup models
for idx = 1:numSims
    % get Gains
    K1 = Gains(idx,1);
    K2 = Gains(idx,2);
    K3 = Gains(idx,3);

    % set Gains
    simIn(idx) = simIn(idx).setBlockParameter([mdl_name,'/Tfn'],'Numerator',mat2str(50),'Denominator',mat2str([20]));
    simIn(idx) = simIn(idx).setBlockParameter([mdl_name,'/K1'],'Gain',mat2str(K1));
    simIn(idx) = simIn(idx).setBlockParameter([mdl_name,'/K2'],'Gain',mat2str(K2));
    simIn(idx) = simIn(idx).setBlockParameter([mdl_name,'/K3'],'Gain',mat2str(K3));

    % set simulation parameters
    simIn(idx) = simIn(idx).setModelParameter('StartTime','40', 'StopTime','85','FixedStep',num2str(dt));
end

% Simulate the model 
simOut = parsim(simIn);