gusucode.com > 一个简单的协同自适应巡航控制的MPC控制器设计源码程序 > cmpcQP.m
%求解有约束预测控制问题,函数返回值为系统输出及控制输入 %此函数针对无限预测时域与有限控制时域的情况 %function [Y,U]=cmpcQP() clear; %初始化 load dstatespace.mat;%下载辨识出的状态空间模型 %输入输出个数 usize=size(Bd,2); ysize=size(C,1); xsize=size(Ad,1); YW=[10 0 0 0;0 6 0 0;0 0 3 0;0 0 0 0];%输出误差加权阵 % YW=[10 0;0 1];%输出误差加权阵 UW=0;%输入加权阵 m=5;%控制时域 p=10;%预测时域 Ts=0.1;%采样周期 Tend=30;%仿真总时间 Nrow=Tend/Ts+m; LR1=5*ones(Nrow,1);%L1输出期望值 LR2=zeros(Nrow,1);%L2输出期望值 LR3=zeros(Nrow,1);%L2输出期望值 LR4=zeros(Nrow,1);%L2输出期望值 r=[LR1 LR2 LR3 LR4]; % r=[LR1 LR2]; L=zeros(Nrow,3); for k=1:1:150 L(k,1)=0; L(k,2)=3; L(k,3)=3*k*Ts+2; end for k=151:1:160 L(k,1)=-1; L(k,2)=L(k-1,2)+L(k,1)*Ts; L(k,3)=L(k-1,3)+L(k-1,2)*Ts+0.5*L(k,1)*Ts*Ts; end for k=161:1:Nrow L(k,1)=0; L(k,2)=L(k-1,2); L(k,3)=L(k-1,3)+L(k-1,2)*Ts; end % v=zeros(1,Nrow); % for i=20:1:24 % v(1,i)=0.5; % end % for i=40:1:44 % v(1,i)=-1.5; % end % % %产生均值为a,标准差为b的白噪声 % % n=randn(1,Nrow); % % n=n/std(n); % % n=n-mean(n); % % a=0; %均值为0 % % b=sqrt(0.01); %方差为0.01 % % n=a+b*n; % % %dn=[n;n]; % % dn=n; % % K=[0.1;0.1;0.1;0.1]; %输出约束 % % YMAX=ones(2*m,1); % % for i=1:2*m % % if rem(i,2)==0 % % YMAX(i,1)=3; % % else % % YMAX(i,1)=3; % % end % % end % % YMIN=ones(2*m,1); % % for i=1:2*m % % if rem(i,2)==0 % % YMIN(i,1)=-3; % % else % % YMIN(i,1)=0; % % end % % end YMAX=ones(4*m,1); for i=1:4*m if rem(i,4)==0 YMAX(i,1)=40; elseif rem(i,3)==0 YMAX(i,1)=Inf; elseif rem(i,2)==0&&rem(i,4)~=0 YMAX(i,1)=30; else YMAX(i,1)=10; end end YMIN=ones(4*m,1); for i=1:4*m if rem(i,4)==0 YMIN(i,1)=0; elseif rem(i,3)==0 YMIN(i,1)=-Inf; elseif rem(i,2)==0&&rem(i,4)~=0 YMIN(i,1)=-30; else YMIN(i,1)=0; end end %输入约束 UMAX=2*ones(m,1); UMIN=-4.5*ones(m,1); %输入变化率约束 DUMAX=3*ones(m,1); DUMIN=-3*ones(m,1); II=eye(m*usize); IDI=II-[zeros(usize,m*usize);eye((m-1)*usize) zeros((m-1)*usize,usize)]; %调用转化为QP标准型中二次型矩阵的函数 [H,f,YC]=genQP(Ad,Bd,C,YW,UW,m,p); H=(H'+H)/2;%将H转化为对称阵 %产生不等式约束阵A A=[YC;-YC;II;-II;IDI;-IDI]; X=zeros(xsize,Nrow); X(1,1)=2; X(2,1)=2; X(3,1)=0; X(4,1)=1; U=zeros(m*usize,Nrow); XR=zeros(3,Nrow); k=0;%初始步数 t=Ts*k; x=X(:,k+1);%初始状态 xr=XR(:,k+1); XR(1,1)=0; XR(2,1)=1; XR(3,1)=0; % for k=1:1:Nrow % vl=1; % pl=2*k*Ts+2; % end for i=0:Ts:Tend [F,CL]= get_F(Ad,C,f,r(k+1:k+m,:),x,m); b=[YMAX-CL;CL-YMIN;UMAX;-UMIN;DUMAX;-DUMIN]; U(:,k+2)=quadprog(H,F,A,b);%求解QP问题得到最优解U(k) % X(:,k+2)=Ad*x+Bd*U(1:usize,k+2); XR(:,k+2)=ARd*xr+BRd*U(1:usize,k+2); % X(:,k+2)=Ad*x+Bd*U(1:usize,k+2)+K*dn(:,k+1); % X(:,k+2)=Ad*x+Bd*U(1:usize,k+2)+Bd1*v(1,k+2); k=k+1; % x=X(:,k+1); xr=XR(:,k+1); % vl=3; % pl=3*k*Ts+2; vl=L(k,2); pl=L(k,3); X(1,k+1)=(pl-xr(1,1)-xr(2,1)); X(2,k+1)=(vl-xr(2,1)); X(3,k+1)=xr(3,1); X(4,k+1)=xr(2,1); x=X(:,k+1); t=[t;Ts*k]; end Y=C*X; save('cmpc_data.mat'); %绘制输入输出曲线 figure(1); subplot(2,1,1) plot(0:Ts:Tend,Y(1,1:Tend/Ts+1)); hold on; plot(0:Ts:Tend,Y(2,1:Tend/Ts+1),'r'); xlabel('Time(sec)'); ylabel('error_real'); hold on; plot(0:Ts:Tend,Y(3,1:Tend/Ts+1),'y'); hold on; plot(0:Ts:Tend,Y(4,1:Tend/Ts+1),'g'); grid on; title('Outputs'); legend('ep_real','e_v','ai+1','vi+1'); subplot(2,1,2) plot(0:Ts:Tend,U(1,1:Tend/Ts+1)); grid on; xlabel('Time(sec)'); ylabel('a_real()'); title('Manipulated Variables'); legend('u'); figure(2); plot(0:Ts:Tend,L(1:Tend/Ts+1,3),'r'); hold on plot(0:Ts:Tend,XR(1,1:Tend/Ts+1),'b'); grid on title('positions'); xlabel('Time(sec)'); ylabel('positions'); legend('P_l','P_f'); figure(3); plot(0:Ts:Tend,L(1:Tend/Ts+1,2),'r'); hold on plot(0:Ts:Tend,XR(2,1:Tend/Ts+1),'b'); grid on title('velocity'); xlabel('Time(sec)'); ylabel('velocity'); legend('V_l','V_f');