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);
我想检查一些块参数如何影响我的模拟结果。
我使用 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);