📄 nnident.m
字号:
ErrorFlag=~(exist(sim_file)==4);
if ~ErrorFlag,
OpenFlag=0;
load_system(sim_file);
end
end
if ErrorFlag,
ErrMsg=[sim_file ' must be the name of a Simulink model.'];
present_error(fig,H,H.simulink_file,a1,0,ErrMsg);
return
end
blk=get_param(sim_file,'blocks');
iblk=0;oblk=0;
for k=1:size(blk,1)
if strcmp(get_param(cat(2,cat(2,sim_file,'/'),blk{k}),'blocktype'),'Inport')
iblk=iblk+1;
end
if strcmp(get_param(cat(2,cat(2,sim_file,'/'),blk{k}),'blocktype'),'Outport')
oblk=oblk+1;
end
end
if ~OpenFlag,close_system(sim_file,0);end
if iblk~=1 | oblk~=1
present_error(fig,H,H.simulink_file,a1,0, ...
'The Simulink plant model must have one Inport and one Outport');
return
end
sim_path=a2(1:findstr(a2,a1)-1); set(H.sim_file_ptr,'userdata',sim_file);
end
a1 = str2num(get(H.Max_input,'string'));
max_i=get_param(arg1,'max_i');
if length(a1) == 0,
present_error(fig,H,H.Max_input,max_i,1, ...
'You must enter a valid number for the maximum plant input.');
return
else max_i=a1; set(H.max_i_ptr,'userdata',max_i); end
a1 = str2num(get(H.Min_input,'string'));
min_i=get_param(arg1,'min_i');
if length(a1) == 0,
present_error(fig,H,H.Min_input,min_i,1, ...
'You must enter a valid number for the minimum plant input.');
return
elseif a1>=max_i
present_error(fig,H,H.Min_input,min_i,1, ...
'You must enter valid numbers for the maximum and minimum plant inputs.');
return
else min_i=a1; set(H.min_i_ptr,'userdata',min_i); end
a1 = str2num(get(H.max_int_edit,'string'));
max_i_int=get_param(arg1,'max_i_int');
if (length(a1) == 0) | a1<=0,
present_error(fig,H,H.max_int_edit,max_i_int,1, ...
'You must enter a valid number for the maximum interval value over which the random input is constant.');
return
else max_i_int=a1; set(H.max_i_int_ptr,'userdata',max_i_int); end
a1 = str2num(get(H.min_int_edit,'string'));
min_i_int=get_param(arg1,'min_i_int');
if (length(a1) == 0) | a1<=0,
present_error(fig,H,H.min_int_edit,min_i_int,1, ...
'You must enter a valid number for the minimum interval value over which the random input is constant.');
return
elseif a1>=max_i_int
present_error(fig,H,H.min_int_edit,min_i_int,1, ...
'You must enter valid maximum and minimum interval values for constant input to the plant.');
return
else min_i_int=a1; set(H.min_i_int_ptr,'userdata',min_i_int); end
a1 = str2num(get(H.Samples,'string'));
sam_training=get_param(arg1,'sam_training');
if (length(a1) == 0) | (a1 < 1) | (floor(a1)~=a1),
present_error(fig,H,H.Samples,sam_training,1, ...
'You must enter a valid number of samples for training');
return
else sam_training=a1; set(H.sam_training_ptr,'userdata',sam_training); end
Limit_output=get(H.Limit_output_data,'value');
if Limit_output
a1 = str2num(get(H.Max_output,'string'));
max_out=get_param(arg1,'max_output');
if length(a1) == 0,
present_error(fig,H,H.Max_output,max_out,1, ...
'You must enter a valid maximum plant output');
return
else max_out=a1; set(H.max_out_ptr,'userdata',max_out); end
a1 = str2num(get(H.Min_output,'string'));
min_out=get_param(arg1,'min_output');
if length(a1) == 0,
present_error(fig,H,H.Min_output,min_out,1, ...
'You must enter a valid minimum plant output');
return
elseif a1>=max_out
present_error(fig,H,H.Min_output,min_out,1, ...
'You must enter valid maximum and minimum plant outputs');
return
else min_out=a1; set(H.min_out_ptr,'userdata',min_out); end
else
max_out=Inf;
set(H.max_out_ptr,'userdata',max_out);
min_out=-Inf;
set(H.min_out_ptr,'userdata',min_out);
end
if fig2==0
pos_fig2=get(fig,'Position');
fig2 = figure('Units', H.StdUnit,...
'Interruptible','off', ...
'BusyAction','cancel', ...
'HandleVis','Callback', ...
'CloseRequestFcn','nncontrolutil(''nnident'',''data_NO_ok'');', ...
'Name', 'Plant Input-Output Data',...
'Tag', 'nnidentdata',...
'NumberTitle', 'off',...
'Position', pos_fig2, ...
'IntegerHandle', 'off',...
'Toolbar', 'none', ...
'WindowStyle','modal');
f2.h1=axes('Position',[0.13 0.60 0.74 0.32],'Parent',fig2);
f2.h2=axes('Position',[0.13 0.15 0.74 0.32],'Parent',fig2);
f2.message= uicontrol('Parent',fig2, ...
'Units',H.StdUnit, ...
'BackgroundColor',[0.752941176470588 0.752941176470588 0.752941176470588], ...
'FontWeight','bold', ...
'ForegroundColor',[0 0 1], ...
'ListboxTop',0, ...
'Position',[156 3 188 20], ...
'Style','text', ...
'Tag','StaticText1');
else
f2=get(fig2,'userdata');
figure(fig2);
end
f2.accept_but = uicontrol('Parent',fig2, ...
'Units',H.StdUnit, ...
'BackgroundColor',[0.752941176470588 0.752941176470588 0.752941176470588], ...
'Callback','nncontrolutil(''nnident'',''stop_sim'');', ...
'ListboxTop',0, ...
'Position',[2 2 68.75 15], ...
'String','Stop Simulation', ...
'Tag','Pushbutton1');
f2.stop=0;
set(fig2,'UserData',f2);
set(H.error_messages,'string','Simulating plant. Wait until sample data points are generated');
drawnow; % pause needed to refresh the message
options_ini=simset('OutputPoints','all');
options=simset('OutputPoints','all');
step_size=5;
k=1;
k1=1;
% We change cursor shape.
set(fig,'pointer','watch');
Actual_path=pwd;
if isempty(sim_path)
sim_path=Actual_path;
end
cd(sim_path);
tr_dat.Ts=Ts;
min_k=ceil(min_i_int/Ts);
while k<=sam_training %for k=1:sam_training
if ceil((k1-1)/step_size)==(k1-1)/step_size
newsample=rand*(max_i-min_i)+min_i;
k1=1;
step_size=ceil(max([min([(rand*(max_i_int-min_i_int)+min_i_int) max_i_int]) min_i_int])/Ts);
end
k1=k1+1;
tr_dat.U(k,1)=newsample;
[time,xx0,yy] = sim(sim_file,[(k-1)*Ts k*Ts],options,[[(k-1)*Ts k*Ts]' [tr_dat.U(k) tr_dat.U(k)]']);
options.InitialState=xx0(size(xx0,1),:);
if k==1
tr_dat.Y(1,1)=yy(1);
end
tr_dat.Y(k+1,1)=yy(size(yy,1));
tr_dat.flag(k,1)=1;
if tr_dat.Y(k+1,1)>max_out | tr_dat.Y(k+1,1)<min_out
options=options_ini;
newsample=rand*(max_i-min_i)+min_i;
k2=1;
while k2<=1 %max_Ni_Nj
k=k+1;
tr_dat.U(k,1)=newsample;
[time,xx0,yy] = sim(sim_file,[(k-1)*Ts k*Ts],options,[[(k-1)*Ts k*Ts]' [tr_dat.U(k) tr_dat.U(k)]']);
options.InitialState=xx0(size(xx0,1),:);
tr_dat.Y(k+1,1)=yy(size(yy,1));
tr_dat.flag(k,1)=0;
k2=k2+1;
end
end
% 4-4-00 ODJ. We check for constant output, so we change the input.
% We verified for constant output according to the minimum interval.
% We change the input if we didn't change in for last min_k*2 samples.
% We also reset the k1 and step_size.
if k>(min_k*2+1)
if (abs(mean(tr_dat.Y(k-min_k+1:k+1,1))-mean(tr_dat.Y(k-min_k*2:k-min_k,1)))) < 1e-10 ...
& tr_dat.U(k) == tr_dat.U(k-min_k*2)
newsample=rand*(max_i-min_i)+min_i;
k1=2;
step_size=ceil(max([min([(rand*(max_i_int-min_i_int)+min_i_int) max_i_int]) min_i_int])/Ts);
end
end
if ceil(k/100)==k/100
f2=get(fig2,'userdata');
if f2.stop~=0
st=sprintf('Simulation stopped by the user.\nPlease Accept or Reject Data to continue.');
set(H.error_messages,'string',st);
H.Data_Available=0;
set(fig,'UserData',H);
sam_training=k;
k=k+1;
break
end
st=sprintf('Processing sample # %d of %d total samples.',k,sam_training);
set(H.error_messages,'string',st);
set(f2.message,'string',st);
plot((0:k-1)*Ts,tr_dat.U(1:k),'Parent',f2.h1);
plot((0:k-1)*Ts,tr_dat.Y(2:k+1),'Parent',f2.h2);
set(get(f2.h1,'Title'),'string','Plant Input','fontweight','bold');
set(get(f2.h2,'Title'),'string','Plant Output','fontweight','bold');
set(get(f2.h1,'XLabel'),'string','time (s)');
set(get(f2.h2,'XLabel'),'string','time (s)');
set(fig2,'UserData',f2);
drawnow;
end
k=k+1;
end
if ~f2.stop
st=sprintf('Simulation concluded.\nPlease Accept or Reject Data to continue.');
set(H.error_messages,'string',st);
set(f2.message,'string',st);
end
set(fig,'pointer','arrow');
cd(Actual_path);
tr_dat.U(k,1)=newsample; % We require U and Y have the same size.
set(f2.message,'string',st);
set(f2.accept_but,'Callback','nncontrolutil(''nnident'',''data_ok'');', ...
'String','Accept Data');
end
set(H.Max_input,'enable','off')
set(H.Max_input_text,'enable','off')
set(H.Min_input,'enable','off')
set(H.Min_input_text,'enable','off')
set(H.max_int_edit,'enable','off')
set(H.max_int_text,'enable','off')
set(H.min_int_edit,'enable','off')
set(H.min_int_text,'enable','off')
set(H.Samples_text,'enable','off')
set(H.Samples,'enable','off')
set(H.Sampling_text,'enable','off')
set(H.Sampling_time,'enable','off')
set(H.Max_output,'enable','off')
set(H.Max_output_text,'enable','off')
set(H.Min_output,'enable','off')
set(H.Min_output_text,'enable','off')
set(H.Limit_output_data,'enable','off');
set(H.BrowseButton,'enable','off');
set(H.simulink_file,'enable','off');
set(H.simulink_file_text,'enable','off');
f2.Reject_but = uicontrol('Parent',fig2, ...
'Units',H.StdUnit, ...
'BackgroundColor',[0.752941176470588 0.752941176470588 0.752941176470588], ...
'Callback','nncontrolutil(''nnident'',''data_NO_ok'');', ...
'ListboxTop',0, ...
'Position',[75 2 68.75 15], ...
'String','Reject Data', ...
'Tag','Pushbutton1');
plot((0:sam_training-1)*Ts,tr_dat.U(1:sam_training),'Parent',f2.h1);
plot((0:sam_training-1)*Ts,tr_dat.Y(2:sam_training+1),'Parent',f2.h2);
set(f2.h1,'xlim',[0 (sam_training-1)*Ts]);
set(f2.h2,'xlim',[0 (sam_training-1)*Ts]);
set(get(f2.h1,'Title'),'string','Plant Input','fontweight','bold');
set(get(f2.h2,'Title'),'string','Plant Output','fontweight','bold');
set(get(f2.h1,'XLabel'),'string','time (s)');
set(get(f2.h2,'XLabel'),'string','time (s)');
set(fig,'userdata',H)
set(fig2,'UserData',f2);
save(cat(2,tempdir,'nnidentdata2.mat'));
return;
elseif strcmp(cmd,'data_ok')
load(cat(2,tempdir,'nnidentdata2.mat'));
delete(cat(2,tempdir,'nnidentdata2.mat'));
delete(fig2);
N2=length(tr_dat.U);
st=sprintf('Your training data set has %d samples.\nYou can now train the network.',N2-1);
set(H.error_messages,'string',st);
if H.Training_done==1
set(H.Apply_but,'enable','on');
set(H.OK_but,'enable','on');
set(H.Handles.Menus.File.Save_NN,'enable','on')
set(H.Handles.Menus.File.Save_Exit_NN,'enable','on')
end
set(H.Start_but,'enable','on');
set(H.Cancel_but,'enable','on');
H.Data_Available=1;
if H.Data_Imported
H.Data_Generated=0;
set(H.Gen_data_but,'String','Erase Imported Data', ...
'Callback','nncontrolutil(''nnident'',''erase_data'')', ...
'TooltipString','The imported data will be erased and the Training Data section be enabled.');
else
H.Data_Generated=1;
set(H.Gen_data_but,'String','Erase Generated Data', ...
'Callback','nncontrolutil(''nnident'',''erase_data'')', ...
'TooltipString','The generated data will be erased and the Training Data section will be enabled.');
end
set(fig,'userdata',H)
save(cat(2,tempdir,'nnidentdata.mat'));
return
elseif strcmp(cmd,'continue_training')
load(cat(2,tempdir,'nnidentdata.mat'));
HH=msgbox({['The Neural Network is being configured.'] ['Training will start shortly.'] },H.me,'warn');
delete(findobj(HH,'style','pushbutton'));
pause(1); % Pause works better here that drawnow.
a1 = str2num(get(H.Hidden_layer_size,'string'));
S1=get_param(arg1,'S1');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -