58 | | |
59 | | /** |
60 | | * x(t+1) = Ax(t) + Bu(t) + C |
61 | | * @param horizont |
62 | | * @param C |
63 | | * @return L: u(t) = L [ x(t) 1 ] |
64 | | */ |
65 | | mat L( const int horizont, const mat & C ) { |
66 | | it_warning("Nijak se tam C neprojevuje!!!"); |
67 | | int xdim = A.cols(); |
68 | | int udim = B.cols(); |
69 | | mat sqQ = sqrt(Q); |
70 | | mat sqR = sqrt(R); |
71 | | mat M0, M; |
72 | | mat qrQ; |
73 | | mat Lall, Lc1, Lc2, Lc3, Lx1, Lx2, Lu, L; |
74 | | M0 = concat_vertical( |
75 | | concat_vertical( |
76 | | concat_horizontal( sqQ * B, concat_horizontal( sqQ * A, zeros(xdim, udim) ) ), |
77 | | concat_horizontal( sqR, concat_horizontal( zeros( udim, xdim ), zeros(udim, udim) ) ) |
78 | | ), |
79 | | concat_horizontal( zeros( xdim, xdim + udim ) , sqQ * C) |
80 | | ); |
81 | | |
82 | | M = M0; |
83 | | for (int h = horizont; h >= 0; h --) { |
84 | | qr(M, Lall); |
85 | | |
86 | | Lu = Lall(0, udim-1, 0, udim-1 ); |
87 | | Lx1 = Lall(0, udim-1, udim, udim+xdim-1); |
88 | | Lc1 = Lall(0, udim-1, udim+xdim, udim+xdim ); |
89 | | Lx2 = Lall(udim, udim+xdim-1, udim, udim+xdim-1); |
90 | | Lc2 = Lall(udim, udim+xdim-1, udim+xdim, udim+xdim); |
91 | | Lc3 = Lall(udim+xdim, udim+xdim+xdim-1, udim+xdim, udim+xdim); |
92 | | M = concat_vertical( |
93 | | M0, |
94 | | concat_vertical( |
95 | | concat_horizontal( Lx2 * B, concat_horizontal( Lx2 * A, Lc2 ) ), |
96 | | concat_horizontal( zeros(xdim, xdim + udim), Lc3 ) |
97 | | ) |
98 | | ); |
99 | | } |
100 | | L = concat_horizontal( - inv(Lu) * Lx1, - inv(Lu) * Lc1); |
101 | | return L; |
102 | | } |