⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nnident.m

📁 RBF网络逼近、RBF-建模、RBF网络训练与测试程序
💻 M
📖 第 1 页 / 共 5 页
字号:
           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 + -