Я хочу проверить, как какой-либо параметр блока влияет на результаты моей симуляции.
Я использую цикл 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
Есть ли более эффективный способ решить эту проблему?
Спасибо
Вы можете использовать load_system
вместо open_system
, чтобы избежать открытия Simulink. Вероятно, вам нужно вызвать его только один раз, перед циклом for, а не на каждой итерации.
Если это все еще занимает слишком много времени, попробуйте увеличить размер шага (или переменную, определяемую решателем оды) или увеличить размер шага в изменяющихся параметрах.
Пример использования парсима:
% 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);
Я продолжаю получать следующую ошибку в блоках, где я использовал mat2str: Ошибка при использовании Simulink.SimulationInput/setBlockParameter Недостаточно входных аргументов.
О, извините, используйте num2str
Дело в том, что есть вариант, который мне нужно будет использовать mat2str, например simIn(idx).setBlockParameter([mdl_name,'/Tfn'],'Numerator',mat2str([50 20]),'Denominator', mat2str([20 10])); как заставить его работать тогда?
Нормально ли работает вычисление mat2str([50 20])? В какой строке вы видите ошибку?
Как использовать parsim, когда мне нужно установить несколько блоков (как K1 K2 K3). пример будет оценен.