📄 nc_tanker_9rcus.m
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Radial Basis Function Neural Controller for Tanker Ship Heading Regulation% (using only 9 receptive field units)%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% By: Kevin Passino % Version: 1/20/00%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%clear % Clear all variables in memorypause off% Initialize ship parameters % (can test two conditions, "ballast" or "full"):ell=350; % Length of the ship (in meters)u=5; % Nominal speed (in meters/sec)abar=1; % Parameters for nonlinearitybbar=1;% Define the reference model (we use a first order transfer function % k_r/(s+a_r)):a_r=1/150;k_r=1/150;% Adaptation gain:eta=1;% Parameters for reinforcement function:eta_e=.5;eta_c=100;% Parameters for the radial basis function neural network% Define parameters of the approximatornG=3; % The number of partitions on each edge of the gridnR=nG^2; % The number of receptive field units in the RBFn=2; % The number of inputs tempe=(-pi/2):(pi)/(nG-1):pi/2; % Defines a uniformly spaced vector roughly on the input domain % that is used to form the uniform grid on the (e,c) spacetempc=(-0.01):(0.02)/(nG-1):0.01;k=0; % Counter for centers below% Place the centers on a gridfor i=1:length(tempe) for j=1:length(tempc) k=k+1; center(1,k)=tempe(i); center(2,k)=tempc(j); endend% Convert to degrees:centerd=center*(180/pi);figure(1)clfplot(centerd(1,:),centerd(2,:),'ko')grid onxlabel('Error e (deg.)')ylabel('Change in error, c (deg./sec.)')title('Grid of receptive field unit centers (each "o" is a center)')axis([-110 110 -.8 .8])% Define spreads of Gaussian functionssigmae=0.7*((pi/nG)); % Use same value for all on e domainsigmac=0.7*((0.02)/nG); % First, compute vectors with points over the whole range of % the neural controller inputs e_input=(-pi/2):(pi)/50:(pi/2); c_input=(-0.01):(0.02)/50:(0.01); istar=5;% Next, compute the neural controller output for all these inputsfor jj=1:length(e_input) for ii=1:length(c_input) % Pick the special RBFs rbfistar1(ii,jj)=2*exp(-(((e_input(jj)-center(1,istar))^2)/sigmae^2)-(((c_input(ii)-center(2,istar))^2)/sigmac^2)); endend% Convert from radians to degrees:e_inputd=e_input*(180/pi);c_inputd=c_input*(180/pi);% Plot a receptive field unit figure(2)clfsurf(e_inputd,c_inputd,rbfistar1);view(145,30);colormap(white);xlabel('Heading error (e), deg.');ylabel('Change in heading error (c), deg.');zlabel('R_5(e,c)');title('Receptive field unit R_5(e,c)');rotate3d% Next, pick the *initial* strengths for the receptive field units (these are what will% later be adjusted by the reinforcement learning method): theta=0*ones(nR,1);thetaold=0*theta;% phi for the RBF NN is initialized below%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Simulate the RBF regulating the ship heading % Next, we initialize the simulation:t=0; % Reset time to zeroindex=1; % This is time's index (not time, its index). tstop=20000; % Stopping time for the simulation (in seconds) - normally 20000step=1; % Integration step sizeT=10; % The controller is implemented in discrete time and % this is the sampling time for the controller. % Note that the integration step size and the sampling % time are not the same. In this way we seek to simulate % the continuous time system via the Runge-Kutta method and % the discrete time controller as if it were % implemented by a digital computer. Hence, we sample % the plant output every T seconds and at that time % output a new value of the controller output.counter=10; % This counter will be used to count the number of integration % steps that have been taken in the current sampling interval. % Set it to 10 to begin so that it will compute a controller % output at the first step. % For our example, when 10 integration steps have been % taken we will then we will sample the ship heading % and the reference heading and compute a new output % for the controller. eold=0; % Initialize the past value of the error (for use % in computing the change of the error, c). Notice % that this is somewhat of an arbitrary choice since % there is no last time step. The same problem is % encountered in implementation. cold=0; % Need this to initialize phiold belowpsi_r_old=0; % Initialize the reference trajectoryyeold=0; % Intial condition used to calculate ycymold=0; % Initial condition for the first order reference modelx=[0;0;0]; % First, set the state to be a vector x(1)=0; % Set the initial heading to be zerox(2)=0; % Set the initial heading rate to be zero. % We would also like to set x(3) initially but this % must be done after we have computed the output % of the controller. In this case, by % choosing the reference trajectory to be % zero at the beginning and the other initial conditions % as they are, and the controller as designed, % we will know that the output of the controller % will start out at zero so we could have set % x(3)=0 here. To keep things more general, however, % we set the intial condition immediately after % we compute the first controller output in the % loop below.% Need to initialize phifor i=1:nR phiold(i,1)=exp(-(((eold-center(1,i))^2)/sigmae^2)-(((cold-center(2,i))^2)/sigmac^2));end% Next, we start the simulation of the system. This is the main % loop for the simulation of the control system.psi_r=0*ones(1,tstop+1);psi=0*ones(1,tstop+1);e=0*ones(1,tstop+1);c=0*ones(1,tstop+1);s=0*ones(1,tstop+1);w=0*ones(1,tstop+1);delta=0*ones(1,tstop+1);ym=0*ones(1,tstop+1);J_R=0*ones(1,tstop+1);ye=0*ones(1,tstop+1);yc=0*ones(1,tstop+1);while t <= tstop% First, we define the reference input psi_r (desired heading).if t>=0, psi_r(index)=0; end % Request heading of 0 degif t>=100, psi_r(index)=45*(pi/180); end % Request heading of 45 degif t>=1500, psi_r(index)=0; end % Request heading of 0 degif t>=3000, psi_r(index)=45*(pi/180); end % Request heading of -45 degif t>=4500, psi_r(index)=0; end % Request heading of 0 degif t>=6000, psi_r(index)=45*(pi/180); end % Request heading of 45 degif t>=7500, psi_r(index)=0; end % Request heading of 0 degif t>=9000, psi_r(index)=45*(pi/180); end % Request heading of 45 degif t>=10500, psi_r(index)=0; end % Request heading of 0 degif t>=12000, psi_r(index)=45*(pi/180); end % Request heading of -45 degif t>=13500, psi_r(index)=0; end % Request heading of 0 degif t>=15000, psi_r(index)=45*(pi/180); end % Request heading of 45 degif t>=16500, psi_r(index)=0; end % Request heading of 0 degif t>=18000, psi_r(index)=45*(pi/180); end % Request heading of 45 degif t>=19500, psi_r(index)=0; end % Request heading of 0 degif t>=21000, psi_r(index)=45*(pi/180); end % Request heading of 45 degif t>=22500, psi_r(index)=0; end % Request heading of 0 degif t>=24000, psi_r(index)=45*(pi/180); end % Request heading of -45 degif t>=25500, psi_r(index)=0; end % Request heading of 0 degif t>=27000, psi_r(index)=45*(pi/180); end % Request heading of 45 degif t>=28500, psi_r(index)=0; end % Request heading of 0 degif t>=30000, psi_r(index)=45*(pi/180); end % Request heading of 45 deg% Next, suppose that there is sensor noise for the heading sensor with that is% additive, with a uniform distribution on [- 0.01,+0.01] deg.%s(index)=0.01*(pi/180)*(2*rand-1);s(index)=0; % This allows us to remove the noise.psi(index)=x(1)+s(index); % Heading of the ship (possibly with sensor noise).if counter == 10, % When the counter reaches 10 then execute the % controllercounter=0; % First, reset the counter% Reference model calculations:% The reference model is part of the controller and to simulate it% we take the discrete equivalent of the% reference model to compute psi_m from psi_r (if you use% a continuous-time reference model you will have to augment % the state of the closed-loop system with the state(s) of the % reference model and hence update the state in the Runge-Kutta % equations).%% For the reference model we use a first order transfer function % k_r/(s+a_r) but we use the bilinear transformation where we % replace s by (2/step)(z-1)/(z+1), then find the z-domain % representation of the reference model, then convert this % to a difference equation:ym(index)=(1/(2+a_r*T))*((2-a_r*T)*ymold+... k_r*T*(psi_r(index)+psi_r_old));ymold=ym(index); psi_r_old=psi_r(index); % This saves the past value of the ym and psi_r so that we can use it % the next time around the loop % Radial basis function neural network controller calculations:e(index)=psi_r(index)-psi(index); % Computes error (first layer of perceptron)c(index)=(e(index)-eold)/T; % Sets the value of ceold=e(index); % Save the past value of e for use in the above % computation the next time around the loop% Next, perform calculations for reinforcement signalye(index)=ym(index)-psi(index); % Calculates yeyc(index)=(ye(index)-yeold)/T; % Calculates ycyeold=ye(index); % Saves the value of ye for use the % next time% Compute the reinforcement signal:J_R(index)=eta*(-eta_e*ye(index)-eta_c*yc(index));% When reinforcement signal is very small, simply make it zero (in% this way it will not over-react to small deviations in adjusting% the controller - it will only make adjustments when they are really needed)if abs(J_R(index))<0.005 J_R(index)=0;end% Compute the adjustments to the strengthsfor i=1:nR theta(i,1)=thetaold(i,1)+J_R(index)*phiold(i,1);end% Next, compute the phi vector for the next time around the loopfor i=1:nR phi(i,1)=exp(-(((e(index)-center(1,i))^2)/sigmae^2)-(((c(index)-center(2,i))^2)/sigmac^2));endthetaold=theta(:,1); % Save this for next time around the loopphiold=phi(:,1); % Save this for next time so that in the above formula the indices % for thetaold and phiold are the same% Compute the RBF outputdelta(index)=theta(:,1)'*phi(:,1); % Performs summing and scaling of receptive field units
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -