广义预测控制 GPC

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

广义预测控制(GPC)

GPC算法仿真

被控对象模型

动态矩阵控制算法的编程原理

(1)设置GPC参数,例如采样周期,预测时域,控制时域,截断步长等。

(2)建立系统阶跃响应模型

(3)设置初始时刻参数,例如系统的初始时刻值,柔化系数等。

(4)计算参考轨迹

(5)计算控制作用增量

(6)实施GPC控制

(7)输出结果,绘制曲线

GPC算法:

1.初选控制参数:Q、R、P、M、 ysp 、α、Â(z-1)

2.采集输入、输出样本{∆u(k),∆y(k)}

3.用RLS算法估计参数

4.递推求解Diophantine方程,得到

5.计算F(k)

6.在线计算控制器参数d T

7.得到控制增量∆u(k)和控制输入u(k) =u(k-1) +∆u(k)

8.k+1 →k,进入下一周期预测计算和滚动优化

GPC程序:

%Clarke广义预测控制(C=1)(对象参数已知)

%N1=d、N、Nu取不同的值

clear all;close all;

a=cell(1,2) ;b=cell(1,2) ;c=cell(1,1);d=cell(1,1);%对象参数syms k;

k=length(k);

if (0<=k<=150)

a=[1 0.9234]; b=[7.2402 0.9485]; c=1; d=1;

elseif (150

a=[1 0.8981]; b=[9.9901 0.14142]; c=1; d=1; elseif (300

a=[1 0.8838]; b=[9.6041 0.34067]; c=1; d=1;

else (450

a=[1 0.9234]; b=[7.2402 0.9485]; c=1; d=1;

end

na=length(a)-1;b=[zeros(1,d-1) b];nb =length(b)-1;%na、nb为多项式A、B阶次(因d!=1,对b添0)

aa=conv(a,[1 -1]);naa=na+1;%aa的阶次

N1=d;N=15;Nu=5;%最小输出长度、预测长度、控制长度

gamma=1*eye(Nu);alpha=0.11;%控制加权矩阵、输出柔化系数

L=600;%控制步数

uk=zeros(d+nb,1);%输入初值:uk(i)表示u(k-i)

duk=zeros(d+nb,1);%控制增量初值

yk=zeros(naa,1);%输出初值

w=10*[ones(L/4,1);-ones(L/4,1);ones(L/4,1);-ones(L/4+d,1)]; %设定值

xi=sqrt(0.01)*randn(L,1);%白噪声序列

%求解多步Diophantine方程并构建F1、F2、G

[E,F,G]=multidiophantine(aa,b,c,N);

G=G(N1: N, : );

F1=zeros(N-N1+1,Nu); F2=zeros(N-N1+1,nb);

for i=1:N-N1+1

for j=1:min(i,Nu); F1(i,j)=F(i+N1-1,i+N1-1-j+1);end for j=1:nb; F2(i,j)=F(i+N1-1,i+N1-1+j);end

end

for k=1:L

if (1<=k<=150)

time(k)=k;

a=[1 0.9234]; b=[7.2402 0.9485]; c=1; d=1;

y(k)=-aa(2:naa+1)*yk+b*duk(1:nb+1)+xi(k);%采集输出数据Yk=[y(k);yk(1:na)];%构建向量Y(k)

dUk=duk(1:nb);%构建向量△U(k-j)

elseif (150

time(k)=k;

a=[1 0.8981]; b=[9.9901 0.14142]; c=1; d=1;

y(k)=-aa(2:naa+1)*yk+b*duk(1:nb+1)+xi(k);%采集输出数据Yk=[y(k);yk(1:na)];%构建向量Y(k)

dUk=duk(1:nb);%构建向量△U(k-j)

elseif (300

time(k)=k;

a=[1 0.8838]; b=[9.6041 0.34067]; c=1; d=1; y(k)=-aa(2:naa+1)*yk+b*duk(1:nb+1)+xi(k);%采集输出数据Yk=[y(k);yk(1:na)];%构建向量Y(k)

dUk=duk(1:nb);%构建向量△U(k-j)

else (450

time(k)=k;

a=[1 0.9234]; b=[7.2402 0.9485]; c=1; d=1; y(k)=-aa(2:naa+1)*yk+b*duk(1:nb+1)+xi(k);%采集输出数据Yk=[y(k);yk(1:na)];%构建向量Y(k)

dUk=duk(1:nb);%构建向量△U(k-j)

end

%参考轨迹

yr(k)=y(k);

for i=1:N

yr(k+i)=alpha*yr(k+i-1)+(1-alpha)*w(k+d); end

Yr=[yr(k+N1:k+N)]';%构建向量Yk(k)

%求控制量

dU=inv(F1'*F1+gamma)*F1'*(Yr-F2*dUk-G*Yk); %ΔU du(k)=dU(1); u(k)=uk(1)+du(k);

%更新数据

for i=1+nb:-1:2

uk(i)=uk(i-1);

duk(i)=duk(i-1);

end

uk(1)=u(k);

duk(1)=du(k);

相关文档
最新文档