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

📄 foraging_adaptive_ind.m

📁 一个用MATLAB编写的优化控制工具箱
💻 M
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% This program implements an indirect % adaptive controller based on an E. coli chemotactic %  foraging strategy for the surge tank example.%% Kevin Passino% Version: 9/27/00%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Initialize variablesclearrand('state',0) % Reset the random number generator so each time you re-run                % the program with no changes you will get the same results.% We assume that the parameters of the tank are:abar=0.01;  % Parameter characterizing tank shape (nominal value is 0.01)bbar=0.2;   % Parameter characterizing tank shape (nominal value is 0.2)cbar=1;     % Clogging factor representing dirty filter in pump (nominally, 1)dbar=1;     % Related to diameter of output pipe g=9.8;      % GravityT=0.1;      % Sampling ratebeta0=0.25; % Set known lower bound on betahatbeta1=0.5;  % and the upper bound% Set the length of the simulation (here, also the number of chemotactic steps)Nnc=1000;% As a reference input, we use a square wave (define one extra % point since at the last time we need the reference value at% the last time plus one)timeref=1:Nnc+1;r(timeref)=3.25-3*square((2*pi/150)*timeref); % A square wave input%r(timeref)=3.25*ones(1,Nnc+1)-3*(2*rand(1,Nnc+1)-ones(1,Nnc+1)); % A noise inputref=r(1:Nnc);  % Then, use this one for plottingtime=1:Nnc;time=T*time; % Next, make the vector real time% Next, set plant initial conditionsh(1)=1;          % Initial liquid levele(1)=r(1)-h(1);  % Initial errorA(1)=abs(abar*h(1)+bbar);alpha(1)=h(1)-T*dbar*sqrt(2*g*h(1))/A(1);beta(1)=T*cbar/A(1);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Initialize the foraging strategy parameters:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% We will use a very simple foraging strategy, one modeling the E. coli, but not% the reproduction and elimination-dispersal events.  We align the increments for % chemotactic steps with time steps (of course you could take multiple steps per% time step, but that complicates the coding a bit).p=2;                 % Dimension of the search spaceS=10;	% The number of bacteria in the population (for convenience, require this to be an        % an even number)Ns=4;   % Limits the length of a swim when it is on a gradientclimbstepcounter=0*ones(S,1); % Set up a counter for each bacterium when for how long it							% will climb down in a single directionrunlengthunit=0.05; % For setting chemotactic step size (same for both dimensions), can					% think of this as an adaptation gain% Allocate memory: %bestvalue=0*ones(Nnc+1,1);%bestmember=0*ones(Nnc+1,1);%bestindividual=0*ones(p,Nnc+1);% Generate an initial random direction for each bacterium (later these will change when% a bacterium tumbles)	for i=1:S	Delta(:,i)=(2*round(rand(p,1))-1).*rand(p,1);end% Initial populationP(:,:,:)=0*ones(p,S,Nnc+1);  % First, allocate needed memory% Initialize locations of bacteria - initial guess at the plant dynamics (make each member of the % population the same initial guess) thetaalpha(1)=2;thetabeta(1)=0.5;for m=1:S	P(1,m,1)=thetaalpha(1); % Load into initial population of bacteria	P(2,m,1)=thetabeta(1); end % Make the initial estimates of the plant dynamics based on this:	alphahat(1)=thetaalpha(1)*h(1);betahat(1)=thetabeta(1);% Number of steps to look back in assessment of quality of identifier model:N=100;% Next, define the intial controller output	u(1)=(1/(betahat(1)))*(-alphahat(1)+r(1+1));% Initialize estimate of the plant dynamics (note that the % time indices are not properly aligned but this is just an estimate)	hhat(1)=alphahat(1)+betahat(1)*u(1); % Estimate to be the same as at 									 % the first time step%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Next, start the main loop:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%for k=2:Nnc	% Define the plant		% In implementation, the input flow is restricted 	% by some physical contraints. So we have to put a	% limit for the input flow that is chosen as 50.    if u(k-1)>50      u(k-1)=50;    end    if u(k-1)<-50     u(k-1)=-50;    end	h(k)=alpha(k-1)+beta(k-1)*u(k-1);	h(k)=max([0.001,h(k)]); % Constraint liquid not to go							% negative		e(k)=r(k)-h(k);  % For plotting, if needed% Define the adaptive controller:	if k>N+1, 		% Next, we have to check how each member of the population would have	% done over the last several steps if it had been used as the identifier	% The objective is to compute Js which will be used in the fitness function		for m=1:S		% Initialize:	    Js(m,k)=0;		% Compute S values of the cost, one for each bacterium	    for j=k-N:k,			hhats(m,j)=P(1,m,k-1)*h(j-1)+P(2,m,k-1)*u(j-1);		    es(m,j)=hhats(m,j)-h(j);	        Js(m,k)=Js(m,k)+(es(m,j))^2;		end	end		% Pick the best member to be used to specify the estimate		[bestvalue(k),bestmember(k)]=min(Js(:,k));		bestindividual(:,k)=P(:,bestmember(k),k-1);  % For plotting if needed	thetaalpha(k)=P(1,bestmember(k),k-1);  	thetabeta(k)=P(2,bestmember(k),k-1);  	    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%	% Foraging strategy for searching for good model information (parameters)	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%	% This part assumes that the parameters at time k-1 are in range to start with% This algorithm operates on P(:,:,k-1) to produce P(:,:,k)	for i=1:S  % For each bacterium				if Js(i,k)<Js(i,k-1) & climbstepcounter(i,1)<Ns; % Moving in good direction, and not for too long			P(:,i,k)=P(:,i,k-1)+runlengthunit*Delta(:,i)/sqrt(Delta(:,i)'*Delta(:,i));			climbstepcounter(i,1)=climbstepcounter(i,1)+1; % Increment climb counter since climbed in same direction as last time		else  % Not in good direction, or moved in good one too long			Delta(:,i)=(2*round(rand(p,1))-1).*rand(p,1); % Generate new direction for this bacterium (tumble)			P(:,i,k)=P(:,i,k-1)+runlengthunit*Delta(:,i)/sqrt(Delta(:,i)'*Delta(:,i));			% Reset counter for any bacterium that has reached the max number of climb steps			climbstepcounter(i,1)=0;		end				% Put parameters in range using projection:				if P(1,m,k)>6;			P(1,m,k)=6;		end		if P(1,m,k)<-2;			P(1,m,k)=-2;		end		if P(2,m,k)>0.5;			P(2,m,k)=0.5;		end		if P(2,m,k)<0.25;			P(2,m,k)=0.25;		end					end		%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%	% End foraging strategy	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%	else  % Hold estimates constant if have not gotten enough data	  % to be able to compute the cost function (hence, adaptation	  % does not start until after N steps)	P(:,:,k)=P(:,:,k-1);		% Pick the parameters to be the same (here, just pick it to be the first	% population member - since they are all the same initially it does not	% matter which one you pick)		thetaalpha(k)=P(1,1,k-1);  	thetabeta(k)=P(2,1,k-1);  	end	% Next, find the estimates of the plant dynamics (best member)		betahat(k)=thetabeta(k);	alphahat(k)=thetaalpha(k)*h(k);	% Store the estimate of the plant dynamics		hhat(k)=alphahat(k-1)+betahat(k-1)*u(k-1);		% Next, use the certainty equivalence controller		u(k)=(1/(betahat(k)))*(-alphahat(k)+r(k+1));			% Define some parameters to be used in the plant		A(k)=abs(abar*h(k)+bbar);	alpha(k)=h(k)-T*dbar*sqrt(2*g*h(k))/A(k);	beta(k)=T*cbar/A(k);	end%%%%%%%%% Plot the resultsfigure(1)clfsubplot(211)plot(time,h,'b-',time,ref,'k--')gridylabel('Liquid height, h')title('Liquid level h (solid) and reference input r')subplot(212)plot(time,u,'b-')gridtitle('Tank input, u')xlabel('Time, k')axis([min(time) max(time) -50 50])%%%%%%%%figure(2)clfsubplot(311)plot(time,h,'k--',time,hhat,'b-')gridtitle('Liquid level h and estimate of h (solid)')subplot(312)plot(time,alpha,'k--',time,alphahat,'b-')gridtitle('Plant nonlinearity \alpha and its estimate (solid)')subplot(313)plot(time,beta,'k--',time,betahat,'b-')gridxlabel('Time, k')title('Plant nonlinearity \beta and its estimate (solid)')%%%%%%%%figure(3)clfsubplot(211)plot(time,bestvalue,'b-')gridtitle('Cost for best member')subplot(212)plot(time,bestmember,'b-')gridxlabel('Time, k')T=num2str(S);T=strcat('Index of best member in population of size=',T);title(T)%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% End of program%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

⌨️ 快捷键说明

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