1
- function [x ,fval ,exitFlag ,output ,lambda ] = sqsolve(Hx , f , varargin )
2
- % function [x,fval,exitFlag,output,lambda] = sqsolve(Hx , f, varargin)
1
+ function [x ,fval ,exitFlag ,output ,lambda ] = sqsolve(H , f , varargin )
2
+ % function [x,fval,exitFlag,output,lambda] = sqsolve(H , f, varargin)
3
3
%
4
4
% This function interface is similar to the MATLAB function quadprog.
5
- % However, the Hessian is provided via a user-defined function Hx.
6
5
%
7
6
% Currently, the only field recognized in the 'option's arguments are
8
7
% options.name, options.start
11
10
%
12
11
%
13
12
% Calling sequences:
14
- % x = sqsolve(Hx , f)
15
- % x = sqsolve(Hx , f, A, b)
16
- % x = sqsolve(Hx , f, A, b, Aeq, beq)
17
- % x = sqsolve(Hx , f, A, b, Aeq, beq, lb, ub)
18
- % x = sqsolve(Hx , f, A, b, Aeq, beq, lb, ub, x0)
19
- % x = sqsolve(Hx , f, A, b, Aeq, beq, lb, ub, x0, options)
20
- % x = sqsolve(Hx , f, A, b, Aeq, beq, lb, ub, x0, lambda, states, options)
13
+ % x = sqsolve(H , f)
14
+ % x = sqsolve(H , f, A, b)
15
+ % x = sqsolve(H , f, A, b, Aeq, beq)
16
+ % x = sqsolve(H , f, A, b, Aeq, beq, lb, ub)
17
+ % x = sqsolve(H , f, A, b, Aeq, beq, lb, ub, x0)
18
+ % x = sqsolve(H , f, A, b, Aeq, beq, lb, ub, x0, options)
19
+ % x = sqsolve(H , f, A, b, Aeq, beq, lb, ub, x0, lambda, states, options)
21
20
%
22
- % [x,fval] = sqsolve(Hx , f, ...)
23
- % [x,fval,exitflag] = sqsolve(Hx , f, ...)
24
- % [x,fval,exitflag,output] = sqsolve(Hx , f, ...)
25
- % [x,fval,exitflag,output,lambda] = sqsolve(Hx , f, ...)
21
+ % [x,fval] = sqsolve(H , f, ...)
22
+ % [x,fval,exitflag] = sqsolve(H , f, ...)
23
+ % [x,fval,exitflag,output] = sqsolve(H , f, ...)
24
+ % [x,fval,exitflag,output,lambda] = sqsolve(H , f, ...)
26
25
%
27
26
%
28
27
% Solve the given quadratic problem:
32
31
% Aeq*x = beq
33
32
%
34
33
% INPUT:
35
- % Hx is a user-defined function that returns the product of a
36
- % vector and the Hessian matrix of the objective
34
+ % H is a Matlab function (either a function handle or string)
35
+ % that computes H*x for a given x or a matrix (dense or sparse).
36
+ % If the problem is an LP (H = 0), then set H = 0 or H = []
37
+ % (or call lpopt).
37
38
%
38
39
% f is the linear term of the objective
39
40
%
74
75
probName = ' ' ;
75
76
start = ' Cold' ;
76
77
77
- if isnumeric( Hx ) && Hx == 0 ,
78
- warning(' No Hessian detected: the problem is an LP' );
79
- userHx = 0 ;
78
+ if isempty( H ) ,
79
+ warning(' No Hessian detected: the problem is an LP' );
80
+ userHx = 0 ;
80
81
else
81
- userHx = checkFun(Hx ,' SQOPT' ,' Hx' );
82
+ if isnumeric(H ),
83
+ if H == 0 ,
84
+ warning(' No Hessian detected: the problem is an LP' );
85
+ userHx = 0 ;
86
+ else
87
+ userHx = @(x )myHx(H ,x );
88
+ end
89
+ else
90
+ userHx = checkFun(H ,' SQOPT' ,' H' );
91
+ end
82
92
end
83
93
84
94
85
95
if nargin == 2 ,
86
- % sqsolve(Hx , f)
96
+ % sqsolve(H , f)
87
97
A = []; b = [];
88
98
Aeq = []; beq = [];
89
99
lb = []; ub = [];
93
103
astate = []; amul = [];
94
104
95
105
elseif nargin == 4 ,
96
- % sqsolve(Hx , f, A, b)
106
+ % sqsolve(H , f, A, b)
97
107
A = varargin{1 };
98
108
b = varargin{2 };
99
109
Aeq = []; beq = [];
105
115
106
116
107
117
elseif nargin == 6 ,
108
- % sqsolve(Hx , f, A, b, Aeq, beq)
118
+ % sqsolve(H , f, A, b, Aeq, beq)
109
119
A = varargin{1 };
110
120
b = varargin{2 };
111
121
Aeq = varargin{3 };
117
127
astate = []; amul = [];
118
128
119
129
elseif nargin == 8 ,
120
- % sqsolve(Hx , f, A, b, Aeq, beq, lb, ub)
130
+ % sqsolve(H , f, A, b, Aeq, beq, lb, ub)
121
131
A = varargin{1 };
122
132
b = varargin{2 };
123
133
Aeq = varargin{3 };
130
140
astate = []; amul = [];
131
141
132
142
elseif nargin == 9 ,
133
- % sqsolve(Hx , f, A, b, Aeq, beq, lb, ub, x0)
143
+ % sqsolve(H , f, A, b, Aeq, beq, lb, ub, x0)
134
144
A = varargin{1 };
135
145
b = varargin{2 };
136
146
Aeq = varargin{3 };
143
153
astate = []; amul = [];
144
154
145
155
elseif nargin == 10 || nargin == 12 ,
146
- % sqsolve(Hx , f, A, b, Aeq, beq, lb, ub, x0, options)
147
- % sqsolve(Hx , f, A, b, Aeq, beq, lb, ub, x0, lambda, states, options)
156
+ % sqsolve(H , f, A, b, Aeq, beq, lb, ub, x0, options)
157
+ % sqsolve(H , f, A, b, Aeq, beq, lb, ub, x0, lambda, states, options)
148
158
A = varargin{1 };
149
159
b = varargin{2 };
150
160
Aeq = varargin{3 };
214
224
states.linear = state(n + 1 : n + m );
215
225
lambda.linear = y(n + 1 : n + m );
216
226
end
227
+
228
+
229
+ function [Hx ] = myHx(H ,x )
230
+ Hx = H * x ;
0 commit comments