📄 nefsim.m
字号:
%NEFSIM Simulation loop (started by NEFGUI)
% Script controlling the SIMULINK Simulations, including
% storing of simulation results (in loop_x.mat files).
% The results will be redisplayed after the last
% learning cycle.
% The system output must be stored in t (time),u (input)
% and y (response) vectors.
% This funtion uses the simulation function rk23. This can
% be changed, if different functions must be used.
%
% See also NEFCON.
% Author: Andreas Nuernberger, TU Braunschweig, August 1996; a.nuernberger@tu-bs.de
% contact: Ludger Merz, DASA-Airbus GmbH, Hamburg; ludger.merz@airbus.de
%function nefsim(action);
% ----------------------------------------------------------------
% Einlesen der Parameter
% ----------------------------------------------------------------
global NEFCON_CYC NEFCON_FIS NEFCON_ACTCYC NEFCON_STOP NEFCON_STAT NEFCON_NOISE NEFCON_BTN
%settings of last simulation (for continue)
global NEFCON_X0 NEFCON_TIME NEFCON_YS
global NEFCON_U NEFCON_Y gut
%if strcmp(action, 'initialize')
sys = get_param; % actual system
tstart = str2num(get_param(sys,'Start time'));
tend = str2num(get_param(sys,'Stop time'));
dt = str2num(get_param(sys,'Min step size'));
zy = NEFCON_CYC;
if zy == []
zy = 1;
end
if NEFCON_ACTCYC == 0
NEFCON_ACTCYC = 1;
gut = [];
end
% ----------------------------------------------------------------
% Simulation und Optimierung
% ----------------------------------------------------------------
for i=NEFCON_ACTCYC:zy,
NEFCON_ACTCYC = i;
nefgui('status');
% continue if stopped during simulation
if NEFCON_X0 ~= [] & NEFCON_TIME ~= [] & size(NEFCON_TIME,1) > 2
% [t,xs,ys] = linsim(sys, [max(NEFCON_TIME) tend], NEFCON_X0(size(NEFCON_X0,1)-1,:), [1e-3, dt, dt]);
[t,xs,ys] = rk23(sys, [max(NEFCON_TIME) tend], NEFCON_X0(size(NEFCON_X0,1)-1,:), [1e-3, dt, dt]);
t = [NEFCON_TIME(1:size(NEFCON_TIME)-2,:); t];
xs = [NEFCON_X0(1:size(NEFCON_X0)-2,:); xs];
% ys = [NEFCON_YS(1:size(NEFCON_YS)-2,:); ys];
nef_u = [NEFCON_U(1:size(NEFCON_U)-1,:); nef_u];
nef_y = [NEFCON_Y(1:size(NEFCON_Y)-1,:); nef_y];
else
NEFCON_BTN = 0; % reset button flag - use automatic status switch
% [t,xs,ys] = linsim(sys, [tstart tend], [], [1e-3, dt, dt]);
[t,xs,ys] = rk23(sys, [tstart tend], [], [1e-3, dt, dt]);
end
if NEFCON_STOP == 1
NEFCON_X0 = xs;
NEFCON_TIME = t;
% NEFCON_YS = ys;
NEFCON_U = nef_u;
NEFCON_Y = nef_y;
nefgui('status');
break;
else
NEFCON_X0 = [];
NEFCON_TIME = [];
% NEFCON_YS = [];
NEFCON_U = [];
NEFCON_Y = [];
end
loop = 1;
if nef_u == []
disp('NEFCON: Could not save reference signal. u-vector undefined.');
nef_u = zeros(1,size(t,2));
end
if nef_y == []
disp('NEFCON: Could not save system output. y-vector undefined.');
nef_y = zeros(1,size(t,2));
end
% if loop == ok &
gut = [gut i];
nefsmat = nefmat; % read actual settings into nefsmat
comand = ['save loop/loop_', num2str(i), ' t nef_u nef_y nefsmat;'];
catch = ['eval(''!mkdir loop'');save loop/loop_', num2str(i), ' t nef_u nef_y nefsmat;'];
eval(comand, catch);
% end;
end;
if NEFCON_STOP ~= 1
NEFCON_STAT = 0; % finish and stopped
nefgui('status');
end
if gut ~= []
y_ges = [];
t_ges = [];
u_ges = [];
gutp = [];
for i = gut,
comand = ['load loop/loop_', num2str(i)];
eval(comand);
if (size(t,1) ~= size(t_ges,1) | size(nef_u,1) ~= size(u_ges,1) ...
| size(nef_y,1) ~= size(y_ges,1)) & size(t_ges,1) ~= 0
disp(['Illegal matrix size in saved data loop_' num2str(i) ' - perhaps different simulations.']);
elseif size(t,1) ~= size(nef_u,1) | size(t,1) ~= size(nef_y,1)
disp(['Different matrix size in saved data loop_' num2str(i) ' - perhaps error in simulation.']);
else
gutp = [gutp i];
t_ges = [t_ges t];
u_ges = [u_ges nef_u];
y_ges = [y_ges nef_y];
end
end;
% -------------------------------------------------
% calculate the number of subplots
% -------------------------------------------------
m = size(y_ges,2);
if m > 0,
spm = ceil( sqrt(m) );
spn = ceil( m / spm );
% -------------------------------------------------
% plot the function
% -------------------------------------------------
% open new window
figure;
for i=1:m,
subplot (spm, spn, i);
plot(t_ges(:,i), u_ges(:,i), 'm', t_ges(:,i), y_ges(:,i), 'c'); grid
title(['loop_', num2str(gutp(i))]);
xlabel(' ');
ylabel(' ');
end;
set(gcf,'windowbuttondownfcn','nefsim1(''wbd'')');
cl = uicontrol(gcf, 'style','pushbutton',...
'position',[15 3 100 18],...
'Callback', 'close(gcf);',...
'string', 'Close');
end;
end;
%end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -