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

📄 npccon2.m

📁 基于神经网络的控制工具箱
💻 M
📖 第 1 页 / 共 2 页
字号:
         dY_dU(l+1,k-N1+1)  = W2(1:hidden)*(df.*hj_vec);
      end
    
      if k>=Nu
         l=Nu-1;
         %       min(k-d-Nu+2,nb)          min(k-d-l,na)
         %             ---                    ---        dy(t+k-1)
         % h(k,l,j) =  >   w           +      >   w      --------
         %             ---  j,na+i            ---   j,i   du(t+l)
         %             i=1                    i=1
         % 
         imax1 = min(k-d-l,na);
         imax2 = min(k-d-Nu+2,nb);
         if imax2>1,
           if k==Nu,
             hj_vec = sum(W1(:,na+1:na+imax2)')';
           else
             hj_vec = W1(:,1:imax1)*dY_dU(l+1,k-N1:-1:k-imax1-N1+1)'...
                                                    + sum(W1(:,na+1:na+imax2)')';
           end
         else
           if k==Nu,
             hj_vec = W1(:,na+1:na+imax2);
           else
             hj_vec = W1(:,1:imax1)*dY_dU(l+1,k-N1:-1:k-imax1-N1+1)'...
                                                    + W1(:,na+1:na+imax2);
           end
         end
         hj_mat(index2(l+1):index2(l+1)+hidden-1,k-d+1) = hj_vec;
                                                
                                                    
         %          hidden     
         % dy(t+k)   ---
         % ------- =  >  W  * f'(y1(j)) * h(k,l,j)
         % du(t+l)   ---  j
         %           j=1     
         dY_dU(l+1,k-N1+1)  = W2(1:hidden)*(df.*hj_vec);
       end 
     end
   
   
     %>>>>>>>>>>>>>>>>>>>    DETERMINE d^2 y / du^2 <<<<<<<<<<<<<<<<<<<<<
     for k=d:N2,
       for l=0:Nu-1,
         imax1 = min(k-d-l,na);
         for p=0:l,
           if imax1>=1,
             tmpvec = W1(:,1:imax1)*d2Y_dU2(index1(l+1)+p,k-d:-1:k-imax1-d+1)';
           else
             tmpvec = zeros(hidden,1);
           end         
           dd = d2f.*hj_mat(index2(l+1):index2(l+1)+hidden-1,k-d+1)...
                                  .*hj_mat(index2(p+1):index2(p+1)+hidden-1,k-d+1);
           dd = dd + df.*tmpvec;
           d2Y_dU2(index1(l+1)+p,k-d+1) = W2(1:hidden)*dd;
         end
       end
     end
   
   
     %>>>>>>>>>>>>>>>>>>>    DETERMINE Hessian matrix <<<<<<<<<<<<<<<<<<<<<
     H = dY_dU*dY_dU' + d2U;
     for l=1:Nu,
       for p=1:l,
         H(l,p) = H(l,p) - d2Y_dU2(index1(l)+p-1,:)*evec;
         H(p,l) = H(l,p);              % This is due to the symmetry 
       end
     end
   
     % -- Gradient --
     dJdu   = -dY_dU*evec + rho*(dUtilde_dU*duvec);
     dw = 0;   
   end

%>>>>>>>>>>>>>>>>>>>>>   DETERMINE SEARCH DIRECTION   <<<<<<<<<<<<<<<<<<<<<
 
    % -- Add lambda to the diagonal --
    H(index3) = H(index3) + lambda;
    
    % -- Check if H is positive definite --
    p=1;
    while p~=0,
      [ch,p] = chol(H);
      if p~=0,         % Hessian + diagonal not positive definite
         lambda = lambda*4;
         H(index3) = H(index3) + lambda;
      end
    end
    
    % -- Determine search direction --
    f = -(ch\(ch'\dJdu));

    % -- Compute 'apriori' iterate --
    up_new = up + f;
    u_vec(uvi) = up_new(upi);          % Insert updated controls


     %>>>>>>>>>>>>> COMPUTE PREDICTIONS FROM TIME t+N1 TO t+N2  <<<<<<<<<<<<<<<< 
     for k=N1:N2,
       %----- Determine prediction yhat(t+k) -----
       phi              = [yhat_vec(tiyh+k-1:-1:tiyh+k-min(k,na)) ; ...
                y_vec(tiy-1:-1:tiy-max(na-k,0)) ; u_vec(tiu-d+k:-1:tiu-d+1-nb+k)];
       h1               = W1(:,1:inputs)*phi + W1(:,inputs+1);  
       y1(H_hidden,k-N1+1) = pmntanh(h1(H_hidden)); 
       y1(L_hidden,k-N1+1) = h1(L_hidden);
       yhat_vec(tiyh+k) = W2(:,1:hidden)*y1(:,k-N1+1) + W2(:,hidden+1);
     end
  
  
     %>>>>>>>>>>>>>>>>>>>>>>>>    EVALUATE CRITERION   <<<<<<<<<<<<<<<<<<<<<<<<<<  
     duvec = u_vec(tiu:tiu+Nu-1)-u_vec(tiu-1:tiu+Nu-2);
     evec_new  = ref(i+N1:i+N2) - yhat_vec(tiyh+N1:tiyh+N2);
     J_new = evec_new'*evec_new + rho*(duvec'*duvec);


     %>>>>>>>>>>>>>>>>>>>>>>>       UPDATE lambda      <<<<<<<<<<<<<<<<<<<<<<<<<<
     L = -f'*dJdu +0.5*lambda*f'*f;
     
     % Reduce lambda if SSE has decreased 'sufficiently'
     if (J - J_new) > (0.75*L),
       lambda = lambda/2;
  
     % Increase lambda if SSE has increased 'sufficiently'
     elseif (J-J_new) <= (0.25*L),
       lambda = 2*lambda;
     end
     

     %>>>>>>>>>>>>>>>>>>>>>   UPDATES FOR NEXT ITERATION   <<<<<<<<<<<<<<<<<<<<<< 
     % Update only if criterion has decreased
     if J_new < J,
       evec = evec_new;
       du = up_new-up;                
       up = up_new;
       J = J_new;
       dw = 1;
       m = m + 1;
       % Check if stop condition is satisfied 
       if sqrt(du'*du)<delta2, break, end 
     end

     if lambda>1e3, break, end       
    end


    %>>>>>>>>>>>>>>>>>>>>>>>     SELECT BEST MINIMUM     <<<<<<<<<<<<<<<<<<<<<<<<<
    if tr==1,
      Jmin_old = J;
      upmin = up;
    else
      if J<Jmin_old,
        upmin = up;
      end
    end
  end


%>>>>>>>>>>>>>>>>>>>>>>     CALCULATE CONTROL SIGANL     <<<<<<<<<<<<<<<<<<<<<<
  e = ref(i) - y;
 
  % Predictive Controller
  if strcmp(regty,'npc'),
    u=upmin(1);

  % PID controller
  elseif strcmp(regty,'pid'),
    ui = B1*e + I1;
    um = ui;
    if ui<uimin, um=uimin; end
    if ui>uimax, um=uimax; end
    u = (um-I2)*B2 + I2;
    I1 = I1 + (K*e - (ui - um))*A1;
    I2 = I2 + (um - I2)*A2;
  
  % No control
  else
     u = ref(i);
  end
  
  
 %>>>>>>>>>>>>>>>>>>>       STORE DATA IN DATA VECTORS      <<<<<<<<<<<<<<<<<<<
  u_data(i)       = u;
  y_data(i)       = y;
  yhat_data(i)    = yhat_vec(tiyh);
  t_data(i)       = t;
  e_data(i)       = J;


%>>>>>>>>>>>>>>>>>>>>>>>>>>       TIME UPDATES        <<<<<<<<<<<<<<<<<<<<<<<<<
  y_old    = shift(y_old,y);
  u_old    = shift(u_old,u);
  u_vec(uvi) = upmin(upi);
  u_vec    = [u_vec(2:length(u_vec)) ; upmin(length(up))];
  y_vec    = [y_vec(2:length(y_vec)) ; y];
  yhat_vec(1:length(yhat_vec)-1) = yhat_vec(2:length(yhat_vec));


%>>>>>>>>>>>>>>>>>>      WRITE % OF SIMULATION COMPLETED      <<<<<<<<<<<<<<<<<
  progress(fighandle,floor(100*i/samples));
end
%------------------------------------------------------------------------------
%------------------        >>>   END OF MAIN LOOP   <<<       -----------------
%------------------------------------------------------------------------------

%>>>>>>>>>>>>>>>>>>>>>>            DRAW PLOTS           <<<<<<<<<<<<<<<<<<<<<<<
figure(gcf);clf
set(gcf,'DefaultTextInterpreter','none');

% Plot A
  if(exist('plot_a')==1),
   [a_plots,dummy]=size(plot_a);        % Number of plots in plot A
   plmat = zeros(samples,a_plots);      % Collect vectors in plmat
   for nn = 1:a_plots, 
     plmat(:,nn) = eval(plot_a(nn,:));   
   end
   subplot(2,1,1);
   plot([0:samples-1],plmat);           % Plot plmat
   xlabel('Samples');
   set(gca,'Xlim',[0 samples-1]);       % Set x-axis
   if regty(1)=='n',
     title('Nonlinear Predictive Control');
   elseif regty(1)=='p',
     title('Constant gain PID controller');
   else
     title('Open-loop simulation');
   end
   grid on
   legend(plot_a);
  end
  
 % Plot B
  if(exist('plot_b')==1),
   [b_plots,dummy]=size(plot_b);        % Number of plots in plot B
   plmat = zeros(samples,b_plots);      % Collect vectors in plmat
   for nn = 1:b_plots, 
     plmat(:,nn) = eval(plot_b(nn,:));   
   end
   subplot(2,1,2);
   plot([0:samples-1],plmat);           % Plot plmat
   xlabel('Samples'); 
   set(gca,'Xlim',[0 samples-1]);       % Set x-axis
   grid on
   legend(plot_b);
  end
set(gcf,'DefaultTextInterpreter','tex');
subplot(111)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -