|
13 | 13 | % [...] = snsolve(obj,x0,A,b,Aeq,beq,xlow,xupp,nonlcon) |
14 | 14 | % [...] = snsolve(obj,x0,A,b,Aeq,beq,xlow,xupp,nonlcon,options) |
15 | 15 | % |
| 16 | +% [...] = snsolve(obj,x0,A,b,Aeq,beq,xlow,xupp,nonlcon,lambda,states) |
| 17 | +% [...] = snsolve(obj,x0,A,b,Aeq,beq,xlow,xupp,nonlcon,lambda,states,options) |
| 18 | +% |
| 19 | +% |
16 | 20 | % Output from snsolve: |
17 | 21 | % [x,fval,exitflag,output,lambda,states] = snsolve(...) |
18 | 22 | % |
|
38 | 42 | % output.majors the total number of major iterations |
39 | 43 | % |
40 | 44 | % lambda are the final multipliers |
41 | | -% lambda.lower lower bounds |
42 | | -% lambda.upper upper bounds |
| 45 | +% lambda.x variables |
43 | 46 | % lambda.ineqnonlin nonlinear inequalities |
44 | 47 | % lambda.eqnonlin nonlinear equalities |
45 | 48 | % lambda.ineqlin linear inequalities |
46 | 49 | % lambda.eqlin linear equalities |
47 | 50 | % |
48 | 51 | % states are the final states |
49 | | -% states.lower lower bounds |
50 | | -% states.upper upper bounds |
| 52 | +% states.x variables |
51 | 53 | % states.ineqnonlin nonlinear inequalities |
52 | 54 | % states.eqnonlin nonlinear equalities |
53 | 55 | % states.ineqlin linear inequalities |
|
65 | 67 | myobj = checkFun(obj,'SNOPT',[1]); |
66 | 68 |
|
67 | 69 | % Deal with options |
68 | | -if nargin == 5 || nargin == 7 || nargin == 9 || nargin == 10, |
| 70 | +if nargin == 5 || nargin == 7 || nargin == 9 || ... |
| 71 | + nargin == 10 || nargin == 12, |
69 | 72 | optionsLoc = nargin - 4; |
70 | 73 | if isstruct(varargin{optionsLoc}), |
71 | 74 | options = varargin{optionsLoc}; |
|
109 | 112 | nonlin_eq = 0; |
110 | 113 | nonlcon = 0; |
111 | 114 |
|
| 115 | + |
112 | 116 | if nargin == 4 || nargin == 5, |
113 | 117 | % snsolve(obj,x0,A,b) |
114 | 118 | % snsolve(obj,x0,A,b,options) |
115 | 119 |
|
116 | 120 | Aeq = []; beq = []; |
117 | 121 | xlow = []; xupp = []; |
118 | 122 | c = []; ceq = []; |
| 123 | + xmul = []; xstate = []; |
| 124 | + Fmul = []; Fstate = []; |
| 125 | + |
119 | 126 |
|
120 | 127 | elseif nargin == 6 || nargin == 7, |
121 | 128 | % snsolve(obj,x0,A,b,Aeq,beq) |
|
127 | 134 |
|
128 | 135 | xlow = []; xupp = []; |
129 | 136 | c = []; ceq = []; |
| 137 | + xmul = []; xstate = []; |
| 138 | + Fmul = []; Fstate = []; |
130 | 139 |
|
131 | 140 | elseif nargin == 8 || (nargin == 9 && optionsLoc ~=0), |
132 | 141 | % snsolve(obj,x0,A,b,Aeq,beq,xlow,xupp) |
|
138 | 147 | xupp = varargin{4}; |
139 | 148 | linear_eq = size(Aeq,1); |
140 | 149 | c = []; ceq = []; |
| 150 | + xmul = []; xstate = []; |
| 151 | + Fmul = []; Fstate = []; |
141 | 152 |
|
142 | | -elseif nargin == 9 || nargin == 10, |
| 153 | +elseif nargin >= 9 && nargin <= 12, |
143 | 154 | % snsolve(obj,x0,A,b,Aeq,beq,xlow,xupp,nonlcon) |
144 | 155 | % snsolve(obj,x0,A,b,Aeq,beq,xlow,xupp,nonlcon,options) |
| 156 | + % snsolve(obj,x0,A,b,Aeq,beq,xlow,xupp,nonlcon,lambda,states) |
| 157 | + % snsolve(obj,x0,A,b,Aeq,beq,xlow,xupp,nonlcon,lambda,states,options) |
145 | 158 |
|
146 | 159 | Aeq = varargin{1}; |
147 | 160 | beq = varargin{2}; |
148 | 161 | xlow = varargin{3}; |
149 | 162 | xupp = varargin{4}; |
150 | 163 | nonlc = varargin{5}; |
151 | 164 | linear_eq = size(Aeq,1); |
| 165 | + xmul = []; xstate = []; |
| 166 | + Fmul = []; Fstate = []; |
| 167 | + |
| 168 | + if nargin == 11 || nargin == 12, |
| 169 | + lambda = varargin{6}; |
| 170 | + states = varargin{7}; |
| 171 | + |
| 172 | + xmul = lambda.x; xstate = states.x; |
| 173 | + Fmul = [ 0; lambda.ineqnonlin; lambda.eqnonlin; |
| 174 | + lambda.ineqlin; lambda.eqlin]; |
| 175 | + Fstate = [ 0; states.ineqnonlin; states.eqnonlin; |
| 176 | + states.ineqlin; states.eqlin]; |
| 177 | + |
| 178 | + end |
152 | 179 |
|
153 | 180 | nonlcon = checkFun(nonlc,'SNOPT'); |
154 | 181 |
|
|
228 | 255 | @(x,needF,needG)snfun(x,needF,needG,myobj, ... |
229 | 256 | nonlcon,iGfun,jGvar), ... |
230 | 257 | x0, ... |
231 | | - xlow, xupp, [], [], ... |
232 | | - Flow, Fupp, [], [], ... |
| 258 | + xlow, xupp, xmul, xstate, ... |
| 259 | + Flow, Fupp, Fmul, Fstate, ... |
233 | 260 | ObjAdd, ObjRow, ... |
234 | 261 | Aij, iAfun, jAvar, iGfun, jGvar); |
235 | 262 | else |
|
238 | 265 | istart, stopFun, probName, ... |
239 | 266 | @(x,needF,needG)snfun(x,needF,needG,myobj), ... |
240 | 267 | x0, ... |
241 | | - xlow, xupp, [], [], ... |
242 | | - Flow, Fupp, [], [], ... |
| 268 | + xlow, xupp, xmul, xstate, ... |
| 269 | + Flow, Fupp, Fmul, Fstate, ... |
243 | 270 | ObjAdd, ObjRow, ... |
244 | 271 | Aij, iAfun, jAvar, iGfun, jGvar); |
245 | 272 | end |
246 | 273 |
|
247 | 274 | fval = F(1); |
248 | 275 | zero = zeros(n,1); |
249 | 276 | states.x = xstate(1:n); |
250 | | -lambda.lower = max(xmul(1:n),zero); |
251 | | -lambda.upper = min(xmul(1:n),zero); |
| 277 | +lambda.x = xmul(1:n); |
252 | 278 |
|
253 | 279 | if nonlin_ineq > 0, |
254 | 280 | i1 = 1+1; i2 = i1-1 + nonlin_ineq; |
|
0 commit comments