1
function [k,x,err]=leqr(p12,vx)
2
//h-infinity lqr gain for full-state lq problem
3
//(discrete or continuous)
6
// |i -vx 0| | a 0 b| |i 0 0| | a vx b |
7
// z|0 a' 0| - |-c'c i -s| s|0 i 0| - |-c'c -a' -s |
8
// |0 b' 0| | s' 0 d'd| |0 0 0| | s' -b' d'd|
13
if p121(1)<>'lss' then error('leqr: state-space only!');end
14
[a,b2,c1,d12]=p12(2:5);
20
warning('leqr: time domain (p12(7)) is not defined (assumed continuous)')
26
q=c1'*c1;r=d12'*d12;s=c1'*d12;
34
[bige,biga,dummy,z]=balanc(bige,biga);
35
[w,k]=gschur(biga,bige,'c');
36
if k<>n then warning('leqr: stable subspace too small!');...
37
k=[];w=[];err=[];return;
42
if rcond(x12) < 1.d-6 then warning('leqr: bad conditioning!');end
43
k=ws(2*n+1:2*n+nu,:)/x12;
45
if lhs~=3 then return;end
47
err=norm((a-b2*ri*s')'*x+x*(a-b2*ri*s')-x*(b2*ri*b2'-vx)*x+q-s*ri*s',1)
52
q=c1'*c1;r=d12'*d12;s=c1'*d12;
53
bige=[i,-vx,zeros(b2);
55
zeros(b2'),-b2',zeros(b2'*b2)];
59
[bige,biga,dummy,z]=balanc(bige,biga);
60
[w,k]=gschur(biga,bige,'d');
61
if k<>n then warning('leqr: stable subspace too small!');...
62
k=[];w=[];err=[];return;end
65
if rcond(x12) <1.d-6 then warning('leqr: bad conditioning!');...
68
k=ws(2*n+1:2*n+nu,:)/x12;
70
if norm(x-x',1)>0.0001 then
71
warning('leqr: x non symmetric!');...
75
//a'*x*a-(a'*x*b2+c1'*d12)*pinv(b2'*x*b2+d12'*d12)*(b2'*x*a+d12'*c1)+c1'*c1
76
if lhs~=3 then return;end
80
err=norm(x-(abar'*inv((inv(x)+b2*ri*b2'-vx))*abar+qbar),1);
81
//k=-ri*(b2'*inv(inv(x)+b2*ri*b2'-vx)*abar+s')