logo资料库

利用matlab实现H-infinity鲁棒控制.doc

第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
资料共12页,剩余部分请下载后查看
西安交通大学自动化系 利用 Matlab 实现 H∞控制 Prof. Dr.-Ing.F.Allgwer Institute for Systems Theory and Automatic Control http://www.ist.uni-stuttgart.de/education/courses/robust 1 引 言 H∞控制器设计原理容易理解,难点在于编程。这里简单介绍 Matlab 里面几 个相关函数的用法,希望能帮助你设计第一个 H∞控制器。 Matlab 提供了很多 H∞设计函数,与 H∞设计相关的几个重要的工具箱有: Control System Toolbox , mu-Analysis and Synthesis Toolbox(mu-tools) , Robust Control Toolbox(RCT)和 LMI Control Toolbox。Matlab7.0 之后的版本中,LMI 和 mu-tools 都包含在 RCT v3.0.1 中,Matlab 7.0 之前的版本中这些工具箱是独立 的。 本文中用到的函数都写在了一个 m 文件中(见附录),也可以从网站下载。 利用混合 S/KS 问题说明 H∞相关函数的用法。首先回顾这个问题。 2 回路成形传递函数 混合 S/KS 问题可用图 1 来说明。 从 w 到 z 的闭环传递函数 可以表示为 广义过程模型 P(s)(见图 2)可以表示为 原文:H∞ Control in Matlab. 2011/12/8 译
假设上面几个状态空间变量具有如下的形式: 于是可以得到 P(s)的一个可能的状态空间实现形式: WS 和 WKS 为调整参数。一种选择方法为: 其中 A<1 为允许的最大稳态误差, 为期望带宽,M 为灵敏度峰值(一般情况 下 A=0.01,M=2)。从控制器设计的方面来说, 的倒数为回路成形期望灵敏 度的上限, 影响控制器的输出 u。 有些情况下希望对补灵敏度函数 进行回路成 形设计(在图 1 中增加一个输出 )。一种选择方法为: 此函数与 函数成 轴对称,见图 3 所示。图中参数设置为 A=0.01 (=-40dB),M=2(=6dB), 。 2
3 子系统的实现 在 Matlab 中有几种方式得到 G,WS 和 WKS。例如 Control System Toolbox 提 供的 ss,tf 和 zpk 等函数。Mu-tools 也提供了诸如 pck,nd2sys,zp2sys 等函数, 也可以用 mksys 和 tree 等方法。需要注意的是,Mu-tools 提供了一种与 Control System Toolbox 不一样的表达方式:系统矩阵(system matrix)。Control System ,对 mu-tools 则不适用。 Toolbox 里面可以写成 Mu-tools: 4 广义系统 P 的实现 广义系统 P 也有多种产生方式。下面我列举了五种: (1)直接写出传递函数矩阵,见 2 节。我倾向于利用 mu-tools。如果后面需 要转化为状态空间模型,需要利用 minreal 之类的函数得到最小化实现。重要的 函数有:sbs(side-by-side),abv(above),mmult(multiply),minv(inverse)。 (2)写出状态空间系数矩阵 A,B,C,D,然后利用 3 节中的指令:P=pck (A,B,C,D)。 (3)利用 sysic 函数(system interconnect)。先在一个 m 文件中利用 mu-tools 设置了子系统,然后利用该函数将子系统互连起来。 (4)利用 sconnect 函数,这是 LMI-tools 提供的函数。子系统、输入、输出 以参数的形式传递,sconnect 返回互连的系统。 (5)利用 RCT v3.0.1 提供的 iconnect 函数,该函数功能与 sysic 类似。 这些方法中,我倾向于 sysic 和 iconnect 函数,因为它们使用灵活,能够搭 建方法 1 和方法 2 难于搭建的复杂系统。一般情况下,得到均衡实现形式以避免 数值计算问题是一个很好的想法,均衡实现形式可以利用 Control System Toolbox 3
提供的 balreal 实现。 5 控制器设计 设计问题是寻找一控制器 K,使之稳定系统 G,并使下列的 H∞ 范数最小: 有很多种得到 H∞控制器的方法,例如 hinfsyn,hinfric,hinflmi,这些函数 将 P 作为输入,并以系统矩阵(mu-tools)方式表达。RCT v3.0.1 提供了 mixsyn 作为输入( 函数,将 为补灵敏度函数权重),并不需要事 先得到广义系统模型 P。这些方法的主要区别在于是否用到 Riccati 方程和γ迭代 或者线性矩阵不等式来求解最优化问题。LMI 方法不需要求解 Riccati 时设定的 假设条件。 另外还有些指令:ncfsyn 和 loopsyn(对开环传递函数 L=GK 进行 H∞回路成 形设计),hinfmix 和 msfsyn(多目标)。具体请查阅手册。 6 结果分析 当控制器设计好后,需要对结果进行分析,这时可以利用 Control System Toolbox 提供的函数,例如利用 lsim,step(阶跃响应),bode(伯德图),sigma (奇异值),freqresp(频域响应)等函数对传递函数 S,KS,T,K,GK 进行分 析。Mu-tools 提供的函数有:trsp(时域响应),frsp(频域响应),vsvd(奇异值), vplot。 7 结论 从前面可见,有很多种进行 H∞控制器设计的方法。为了避免混淆,我建议 尽可能使用 mu-tools 和 RCT。如果你知道 Control System Toolbox 存在某个函数, 那么 mu-tools 也很可能存在具有相同功能的函数,只不过名称稍有些不同。如果 你清楚自己的目的,但不知道函数的名字,那么建议你浏览帮助手册中的函数索 引。 希望此处简短的介绍能够帮助你进行 H∞控制器的设计。好运! 附录 %下面的代码展示了如何在 Matlab 中进行 H-infinity 控制器的设计。此处举的例 子与混合 %S/KS 问题有些不同。此处用到的模型和权重函数见 Skogestad 和 Postlethwaite, 1996, %ed.1,p.60.权重函数并不是“最优”的。 % %大部分函数来自 mu-tools,一些来自 lmi-tools。mu-tools 和 lmi-tools 均包含在 RCT %v3.0.1 中。 %-Jorgen Johnsen 14.12.06 %------------------------------------------------------------------------- %建立子系统 4
%------------------------------------------------------------------------- %Plant:G=200/((10s+1)(0.05s+1)^2) %方法 1:直接方法,利用 mu-tools G=nd2sys(1,conv([10,1],conv([0.05,1],[0.05 1])),200); %方法 2:control system toolbox s=tf('s'); Gcst=200/((10*s+1)*(0.05*s+1)^2); [a,b,c,d]=ssdata(balreal(Gcst)); G=pck(a,b,c,d); %权重:Ws=(s/M+w0)/(s+w0*A),Wks=1 M=1.5;w0=10;A=1.e-4; Ws=nd2sys([1/M w0],[1 w0*A]); Wks=1; %------------------------------------------------------------------------- %建立广义系统 P %------------------------------------------------------------------------- %方法 0:直接方法 %/z1\ %|z2| =|0 Wks | | | %\ v/ -G / \u/ /Ws -Ws*G\ /r\ \I %传递函数表达方法 Z1=sbs(Ws,mmult(-1,Ws,G)); Z2=sbs(0,Wks); V=sbs(1,mmult(-1,G)); P0=abv(Z1,Z2,V); %通常情况下 P0 并不是最小实现,所以需要降阶 [a,b,c,d]=unpck(P0); [ab,bb,cb,db]=ssdata(balreal(minreal(ss(a,b,c,d)))); P0=pck(ab,bb,cb,db); %此时得到变量为 System 类型 %------------------------------------------------------------------------- %建立广义系统 P %------------------------------------------------------------------------- %方法 1:直接方法 %/z1\ %|z2| =|0 W2 | %\ v/ | | -G / \u/ /W1 -W1*G\ /r\ \I %子系统的 ss 实现 [A,B,C,D]=unpck(G); [A1,B1,C1,D1]=unpck(Ws); 5
[A2,B2,C2,D2]=unpck(Wks); %计算不同子系统的输入、输出变量的个数 n1=size(A1,1);[q1,p1]=size(D1); n2=size(A2,1);[q2,p2]=size(D2); n=size(A,1);[q,p]=size(D);%原文此处为[p,q]=size(D); %全系统的 ss 实现 Ap=[A1 zeros(n1,n2) -B1*C; zeros(n2,n1) A2 zeros(n2,n); zeros(n,n1) zeros(n,n2) A]; Bp=[B1 -B1*D; zeros(n2,p) B2; zeros(n,p) B]; Cp=[C1 zeros(q1,n2) -D1*C; zeros(q2,n1) C2 zeros(q2,n); zeros(q,n1) zeros(q,n2) -C]; Dp=[D1 -D1*D; zeros(q2,p) D2; eye(p) -D]; %得到均衡实现形式,以减少可能产生的计算问题 [Apb,Bpb,Cpb,Dpb]=ssdata(balreal(ss(Ap,Bp,Cp,Dp))); P1=pck(Apb,Bpb,Cpb,Dpb); %P1 与 P0 数值相近,但符号有差别 %------------------------------------------------------------------------- %建立广义系统 P %------------------------------------------------------------------------- %方法 2:利用 sysic 函数 systemnames='G Ws Wks'; inputvar='[r(1);u(1)]';%所有输入均为标量,r(2)为两维信号 outputvar='[Ws;Wks;r-G]'; input_to_G='[u]'; input_to_Ws='[r-G]'; input_to_Wks='[u]'; sysoutname='P2'; cleanupsysic='yes'; sysic %------------------------------------------------------------------------- %建立广义系统 P %------------------------------------------------------------------------- %方法 3:利用 sconnect 函数 inputs='r(1);u(1)'; outputs='Ws;Wks;e=r-G'; 6
K_in=[];%无控制器 G_in='G:u'; Ws_in='Ws:e'; Wks_in='Wks:u'; [P3,r]=sconnect(inputs,outputs,K_in,G_in,G,Ws_in,Ws,Wks_in,Wks); %------------------------------------------------------------------------- %建立广义系统 P %------------------------------------------------------------------------- %方法 4:利用 iconnect 函数 %注意 1:不再使用 mu-tools System 表达形式 %注意 2:iconnet 函数仅适用于 Robust Control Toolbox v3.0.1 及以上版本 r=icsignal(1); u=icsignal(1); ws=icsignal(1); wks=icsignal(1); e=icsignal(1); y=icsignal(1); M=iconnect; M.Input=[r;u]; M.Output=[ws;wks;e]; M.Equation{1}=equate(e,r-y); M.Equation{2}=equate(y,ss(A,B,C,D)*u); M.Equation{3}=equate(ws,ss(A1,B1,C1,D1)*e); M.Equation{4}=equate(wks,ss(A2,B2,C2,D2)*u); [ab,bb,cb,db]=ssdata(balreal(M.System)); P4=pck(ab,bb,cb,db); %------------------------------------------------------------------------- %控制器的设计 %------------------------------------------------------------------------- %下面使用的方法均基于广义系统 P 的 System 矩阵表达形式 %选择你喜欢的控制器设计方法和广义系统 P %选择广义系统 P P=P1; %P=P0;P=P1;P=P2;P=P3;P=P4; %然后设置一些参数(测量变量个数,输入变量个数,gamma 限制) nmeas=1;nu=1;gmn=0.5;gmx=20;tol=0.001; %控制器设计:选择你喜欢的设计方法,不需要的注释掉 [K,CL,gopt]=hinfsyn(P,nmeas,nu,gmn,gmx,tol); [gopt,K]=hinflmi(P,[nmeas,nu],0,tol); CL=starp(P,K,nmeas,nu); [gopt,K]=hinfric(P,[nmeas,nu],gmn,gmx);CL=starp(P,K,nmeas,nu); 7
%利用 RCT v3.0.1 进行控制器的设计 %通常不需要系统的传递函数表达式,但更需要 ss 类型 [a,b,c,d]=unpck(G); Gcst=ss(a,b,c,d); [a,b,c,d]=unpck(Ws); Wscst=ss(a,b,c,d); [a,b,c,d]=unpck(Wks); Wkscst=ss(a,b,c,d); [K,CL,gopt]=mixsyn(Gcst,Wscst,Wkscst,[]); [a,b,c,d]=ssdata(balreal(K)); K=pck(a,b,c,d); [a,b,c,d]=ssdata(balreal(CL)); CL=pck(a,b,c,d); %------------------------------------------------------------------------- %分析结果 %------------------------------------------------------------------------- %注意:此处使用 mu-tools 函数。也可以使用 control toolbox 指令,例如用 series 和 %feedback 进行子系统连接,sigma 或 freqresp,svd 和 bode 画奇异值,step 和 lsim 分析 %时域响应 %画(Weighted)闭环系统的奇异值 w=logspace(-4,6,50); CLw=vsvd(frsp(CL,w)); figure(1) vplot('liv,m',CLw) title('singular values of weighted closed loop system') %得到传递函数矩阵 [type,out,in,n]=minfo(G); I=eye(out); S=minv(madd(I,mmult(G,K))); %灵敏度函数 T=msub(I,S); %补灵敏度函数 KS=mmult(K,S); %G 的输入 GK=mmult(G,K); %回路传递函数 %频域的奇异值 Sw=vsvd(frsp(S,w)); Tw=vsvd(frsp(T,w)); Kw=vsvd(frsp(K,w)); KSw=vsvd(frsp(KS,w)); GKw=vsvd(frsp(GK,w)); %画奇异值 %注意:如果愿意的话,可以将 vplot 用 plot 代替,单位是 dB。 figure(2) 8
分享到:
收藏