| 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 | | } |