| Description of sls_alloc |
sls_alloc
PURPOSE 
SLS_ALLOC - Control allocation using sequential least squares.
SYNOPSIS 
function [u,W,iter] = sls_alloc(B,v,umin,umax,Wv,Wu,ud,u,W,imax)
DESCRIPTION 
CROSS-REFERENCE INFORMATION 
This function calls:
- pinv_sol PINV_SOL - Compute pseudoinverse solution.
This function is called by:
- alloc_sim ALLOC_SIM - Control allocation simulation.
- qp_ca_sl Wrapper used in the QP control allocation Simulink block.
SOURCE CODE 
0001 function [u,W,iter] = sls_alloc(B,v,umin,umax,Wv,Wu,ud,u,W,imax)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044 tol = 1e-10;
0045
0046
0047
0048 coplanar = ~isreal(B);
0049 B = real(B);
0050
0051
0052
0053 [k,m] = size(B);
0054
0055
0056 if nargin < 10
0057 imax = 100;
0058 if nargin < 9, u = (umin+umax)/2; W = zeros(m,1); end
0059 if nargin < 7, ud = zeros(m,1); end
0060 if nargin < 6, Wu = eye(m); end
0061 if nargin < 5, Wv = eye(k); end
0062 end
0063
0064
0065 phase = 1;
0066
0067
0068 A = Wv*B;
0069 d = Wv*(v-B*u);
0070
0071
0072
0073 for iter = 1:imax
0074
0075
0076
0077
0078
0079 i_free = W==0;
0080
0081 m_free = sum(i_free);
0082
0083 if phase == 1
0084
0085
0086
0087
0088
0089 A_free = A(:,i_free);
0090
0091
0092
0093
0094 if coplanar
0095
0096
0097 p_free = pinv_sol(A_free,d);
0098 else
0099
0100
0101 if m_free <= k
0102
0103 p_free = A_free\d;
0104 else
0105
0106 [Q1,R1] = qr(A_free',0);
0107 p_free = Q1*(R1'\d);
0108 end
0109 end
0110
0111
0112 p = zeros(m,1);
0113 p(i_free) = p_free;
0114
0115 else
0116
0117
0118
0119
0120
0121 i_fixed = find(W);
0122
0123 m_fixed = length(i_fixed);
0124
0125 C0 = zeros(m_fixed,m);
0126 for i = 1:m_fixed
0127 C0(i,i_fixed(i)) = -W(i_fixed(i));
0128 end
0129
0130
0131
0132 E = [B ; C0];
0133
0134
0135 k_c = k + m_fixed;
0136
0137
0138
0139
0140
0141 [Q,R] = qr(E');
0142 Q1 = Q(:,1:k_c);
0143 Q2 = Q(:,k_c+1:end);
0144 R1 = R(1:k_c,:);
0145
0146 q2 = (A*Q2)\d;
0147 p = Q2*q2;
0148
0149 end
0150
0151
0152
0153
0154
0155
0156 u_opt = u + p;
0157 if ~any(u_opt(i_free) < umin(i_free) | u_opt(i_free) > umax(i_free))
0158
0159
0160
0161
0162
0163
0164 u = u_opt;
0165
0166 d = d - A*p;
0167
0168
0169
0170
0171
0172 if (~coplanar) & (phase == 1) & (m_free >= k)
0173
0174
0175
0176 phase = 2;
0177
0178 A = Wu;
0179 d = A*(ud-u);
0180 else
0181
0182
0183
0184 g = -A'*d;
0185
0186
0187 if phase == 1
0188
0189 lambda = -W.*g;
0190 else
0191
0192 Lambda = R1\(Q1'*g);
0193
0194 lambda = zeros(m,1);
0195 lambda(i_fixed) = Lambda(k+1:end);
0196 end
0197
0198 if lambda >= -tol
0199
0200 if coplanar & (phase == 1)
0201
0202
0203 phase = 2;
0204
0205
0206 A = Wu;
0207 d = Wu*(ud-u);
0208
0209
0210
0211
0212
0213
0214
0215
0216 W = zeros(m,1);
0217 else
0218
0219
0220
0221 return;
0222 end
0223 else
0224
0225
0226
0227
0228
0229
0230
0231 [lambda_neg,i_neg] = min(lambda);
0232 W(i_neg) = 0;
0233 end
0234 end
0235 else
0236
0237
0238
0239
0240
0241
0242
0243 dist = ones(m,1);
0244 i_min = i_free & p<-tol;
0245 i_max = i_free & p>tol;
0246
0247 dist(i_min) = (umin(i_min) - u(i_min)) ./ p(i_min);
0248 dist(i_max) = (umax(i_max) - u(i_max)) ./ p(i_max);
0249
0250
0251 [alpha,i_alpha] = min(dist);
0252
0253 u = u + alpha*p;
0254 d = d - A*alpha*p;
0255
0256
0257 W(i_alpha) = sign(p(i_alpha));
0258
0259 end
0260
0261 end
Generated on Wed 25-Aug-2004 14:38:35 by m2html © 2003
|
|