Модель Simulink внутри для петли - PullRequest
0 голосов
/ 06 апреля 2019

Я хочу проверить, как какой-либо параметр блока влияет на результаты в моем моделировании.

Я использую цикл 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

Есть лиЕсть ли более эффективный способ ее решения?

Спасибо

1 Ответ

1 голос
/ 06 апреля 2019

Используйте 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);
...