|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
如下为NAG library里面e04wc的程序,是别人文章里给的,用来求某函数最小值的,但是我运行时会说错误使用e04wc,输出参数太多,球球大佬怎么搞?
% u1 ~' |/ j1 Q9 F# w
+ a# K# e/ I3 D1 V9 q
# _+ `' S: { X: V7 F7 o# G `function e04wc_example
7 J: V2 S! H" l: }& t) _7 ~
5 }0 V5 |& Z. |* h* j- Afprintf('e04wc example results\n\n');
9 g) \' U4 M, z3 @8 j% E/ la = [1, 1, 1, 1];' k' p4 H3 f- u
bl = [1, 1, 1, 1, -1e25, -1e25, 25];
4 _' Y& |, X, cbu = [5, 5, 5, 5, 20, 40, 1e25];* D. z9 ^- W: N" h5 E
istate = zeros(7, 1, 'int64');
5 Z' W+ |; E* j4 }ccon = zeros(2,1);. l/ y6 c, |0 J, x- }7 H! }8 x
cjac = zeros(2,4);/ E6 V j+ O& j5 N. W. f
clamda = zeros(7,1);. t5 h3 T" A; ]$ _. K& w
hess = zeros(4,4);
2 U0 p9 o9 @' j% t5 w) dx = [1; 5; 5; 1];, b( U) s( x0 V' x6 e1 V6 ^; C
[iw,rw,ifail]=e04wc;
6 y3 v$ n7 E# Q# W[majits, istate, ccon, cjac, clamda, objf, grad, hess, x, ...
8 i6 T' @9 [) F' d iw, rw, user, ifail] = ...
; m; e7 V$ k ?9 T7 X6 x e04wd(...; K# B/ C% C$ A1 j1 P4 \! g5 ]
a, bl, bu, @confun, @objfun, istate, ccon, cjac, clamda, ...2 p; D: ?! ^$ I) h
hess, x, iw, rw);
6 a3 b4 u9 Y- j/ efprintf('Final objective value : %8.1f\n',objf);7 W, g8 D: u/ y+ p) J: a
fprintf('Optimal values for x : ');
4 x9 Y9 Q5 U3 e- p. z" L) C% O! Yfprintf(' %9.2f',x);
3 g4 q/ B% f8 h5 hfprintf('\nGradients at x : ');
, m9 B) I3 I7 ?# ?fprintf(' %9.2f',grad);
6 n8 G# I& t+ r% e& b' b0 j6 }fprintf('\nConstraint functions at x: ');0 }; n1 H/ j" c/ _
fprintf(' %9.2f',ccon);
3 {! `) C0 O4 Cfprintf('\nNumber of major iterations = %5d\n',majits);
' b8 I& W5 l% E$ h1 G/ F' P$ _9 I% `
function [mode, ccon, cjac, user] = ...1 n$ d* ^6 b) Y- G6 |
confun(mode, ncnln, n, ldcj, needc, x, cjac, nstate, user)
* b0 @( W( c- I! l! g ccon = zeros(ncnln, 1);* S: X+ Q6 W6 T' h: Z0 e$ W
if (nstate == 1)+ R7 l! [* {6 B# y/ `; @/ U5 }
% first call to confun. set all jacobian elements to zero.& I8 ^+ Q) I" q, T' \
% note that this will only work when 'derivative level = 3') `: O/ o+ l! L3 U Y' c& b
% (the default; see section 11.2).
8 D! Z* e1 r6 r$ [" r. {* r3 S cjac = zeros(ncnln, n);
$ p2 q$ V. [: @% W5 b end s0 J+ B9 _" S7 ]4 b
if (needc(1) > 0)
/ k) P- l6 X8 O; B+ ` if (mode == 0 || mode == 2)/ O& f/ H- j3 }. @0 w* n0 N% k# n
ccon(1) = x(1)^2 + x(2)^2 + x(3)^2 + x(4)^2;
. y! ^9 `: o- q* Z end0 A& ?; j) F& y; `
if (mode == 1 || mode == 2)( ^# | `. H8 B* Z1 @- N) L
cjac(1,1) = 2*x(1);
+ a* F n8 K0 z: `1 K cjac(1,2) = 2*x(2);( ^ R( t; o3 J1 f3 W
cjac(1,3) = 2*x(3);
# r- m# D0 @ N( U cjac(1,4) = 2*x(4);
% C- ^. K0 H. w1 ^ end% z- ?$ ^! f& e; H( V7 r$ ^
end
$ M" U8 C/ E) }( T0 o U6 W if (needc(2) > 0)4 V! G9 K' G5 z- \& M9 M/ C2 v
if (mode == 0 || mode == 2)
2 z7 Z9 D/ Z8 l, r! Y ccon(2) = x(1)*x(2)*x(3)*x(4);, s, n. a0 @% i
end' O3 N4 U% g$ a c$ |) z& n6 k
if (mode == 1 || mode == 2)9 S0 ?, z5 n7 d2 o' w
cjac(2,1) = x(2)*x(3)*x(4);
+ U& f! E; v% Q; {5 ~ cjac(2,2) = x(1)*x(3)*x(4);5 h: A; G0 J9 C. n8 P; a& h8 s0 }
cjac(2,3) = x(1)*x(2)*x(4);
: |+ P" Z6 L5 s6 I cjac(2,4) = x(1)*x(2)*x(3);
5 d3 |* I: o2 D% y0 w+ J end! S# H- I, B- L5 W1 b% Q
end# {$ J* `9 y6 h
9 ], s5 \- ~; W0 H* ^3 \
function [mode, objf, grad, user] = objfun(mode, n, x, grad, nstate, user)
) B# ~5 D% C% l+ U( ? if (mode == 0 || mode == 2) \- y) R* l1 v6 p* Z
objf = x(1)*x(4)*(x(1)+x(2)+x(3)) + x(3);- S N9 S3 R! k; X& ^
end
9 q$ q! | ^$ F$ K if (mode == 1 || mode == 2)
% A; Y/ n4 `5 t1 r grad(1) = x(4)*(2*x(1)+x(2)+x(3));
( B8 Z# M8 F! O% d7 O' f" i0 G grad(2) = x(1)*x(4);
8 q- K9 ?, ~2 K3 F8 _" m# K grad(3) = x(1)*x(4) + 1;
7 P O1 y+ G4 P grad(4) = x(1)*(x(1)+x(2)+x(3)); a: J# B* K1 d8 q" [& m) R( ?( ?
end
( u! S/ [# M" L9 P; f |
|