File: optmiz.transcript

package info (click to toggle)
maxima 5.9.1-9
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 32,272 kB
  • ctags: 14,123
  • sloc: lisp: 145,126; fortran: 14,031; tcl: 10,052; sh: 3,313; perl: 1,766; makefile: 1,748; ansic: 471; awk: 7
file content (585 lines) | stat: -rw-r--r-- 18,707 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
(C13) BATCH (OPTMIZ, DEMO, DSK, SHARE);

(C14) /* This macsyma batch file illustrates how to use the function
STAP for determining the stationary points of a function of 1 or more
variables, either unconstrained or subject to equality &/or inequality
constraints.  As a prerequisite, see the text file  OPTMIZ USAGE.  The
examples here are chosen to be instructive, geometrically visualizable,
and easy enough to be solved by hand.  For a more thorough discussion
and results of some more demanding test cases, see the report 
"Automatic analytical optimization using computer algebraic
manipulation", by David R. Stoutemyer, (ALOHA project technical report,
University of Hawaii, Honolulu, June 1974).

Here is an example with a maximum: */

STAP(5*LOG(Y) - 3*X**2*Y - 4*Y) $

ALGSYS FASL DSK MACSYM BEING LOADED 
LOADING DONE

					5
(E14)                    STAPTS  = [Y = -, X = 0.0]
			       1        4

					 5
(E15)                     OBJSUB = 5 LOG(-) - 5.0
					 4

(E16)                       GRADSUB = [0.0, 0.0]

POLYRZ FASL DSK MACSYM BEING LOADED 
LOADING DONE

(E17)                          EIGEN = - 7.5

(E18)                          EIGEN = - 3.2
TIME= 4469 MSEC.

(C19) /* Here is an example with a saddle, which also illustrates 
that we may use subscripted variables: */

STAP(ATAN(X[1]) + ATANH(X[2]) + X[2]/X[1]) $

(E19)         STAPTS  = [X  = 0.409324944, X  = - 0.83245319]
		    1     2                 1

(E20)                      OBJSUB = - 0.75112805

(E21)              GRADSUB = [5.2154064E-8, 1.3411045E-7]

(E22)                       EIGEN = - 1.5897126

(E23)                        EIGEN = 1.93282488
TIME= 7350 MSEC.

(C24) /* Here is a famous example by Peano, for which the second-
order test reveals only that the stationary point is not a maximum.
It turns out that the stationary point is a saddle, unless A=B, in
which case it is a minimum, along with all other points on the curve
Y = C + (B*X)**2.  See "Theory of Maxima and Minima" by H. Hancock,
(Dover Press) for a discussion of how to analytically determine the
nature of a stationary point when the 2nd-order test is inconclusive. 
This example also illustrates how we may explicitly indicate the
decision variables. */

PEANO:  (Y - C - (A*X)**2)*(Y - C - (B*X)**2) $
TIME= 125 MSEC.

(C25) STAP(PEANO, [], [], [X,Y]) $

(E25)                    STAPTS  = [X = 0.0, Y = C]
			       1

(E26)                           OBJSUB = 0.0

(E27)                       GRADSUB = [0.0, 0.0]

(E28)                            EIGEN = 0

(E29)                            EIGEN = 2
TIME= 6177 MSEC.

(C30) /* Note how the answer is independent of A and B, but not C.

Now, note how when A=B, giving a non-isolated stationary point, an
extra parameter is automatically introduced to describe the stationary
curve: */

STAP(EV(PEANO,A=B), [], [], [X,Y]) $

				       2   2
				  - 2 B  R1  - 2 C
(E30)           STAPTS  = [Y = - -----------------, X = R1]
		      1                  2

				  2   2
			     - 2 B  R1  - 2 C    2   2     2
(E31)          OBJSUB = ( - ----------------- - B  R1  - C)
				    2

				     2   2
		      2         - 2 B  R1  - 2 C    2   2
(E32) GRADSUB = [- 4 B  R1 ( - ----------------- - B  R1  - C),
				       2

					     2   2
					- 2 B  R1  - 2 C    2   2
				 2 ( - ----------------- - B  R1  - C)]
					       2
SOLUTION

(E33)                            EIGEN = 0

				       4   2
(E34)                       EIGEN = 8 B  R1  + 2
TIME= 5647 MSEC.

(C35) /* Let's make certain that the GRADSUB expressions simplify to
zero: */

RADCAN(GRADSUB);
TIME= 323 MSEC.
(D35)                              [0, 0]

(C36) /* The limitations of STAP are primarily dependent upon the
limitations of the macsyma SOLVE command for solving nonlinear
equations.  SOLVE will attempt to find a closed-form solution to a
single equation that is irrational or involves elementary
transcendental functions; but as of June 1974, SOLVE is intended
to solve simultaneous equations only if they are polynomial
in the unknowns.  However, it generally converts rational equations
to this form by multiplying each equation by the least common
denominator of its terms; so it may solve simultaneous rational
equations too.  Thus, as in our first two examples, the objective may
contain any terms with rational gradients, such as ATAN(R), ATANH(R),
or LOG(R), where R is rational in the decision variables.  The clearing
of the denominator may result in a "solution" which is a pole for some
gradient components while a zero for the others.  Although not a true
solution to the equations, this is a bonus in our case, because we are 
interested in all extrema, not just stationary points.  In fact, we
are usually more interested in any poles of the proper sign than in
stationary points of the proper type with finite objective values.
Poles, if found, are usually revealed in an alarming way by one or
more large-magnitude components in GRADSUB or OBJSUB, or by an error
interrupt such as a zerodivide.

A surprising number of optimization problems can be converted to the
required form by a change of variable  For example, fractional powers
of a decision variable, X, may be eliminated by letting X = Z**Q,
where Q is the least common denominator of the fractional powers of x.
For example: */

FRAC: X**(2/3) - 2*X*Y + Y $
TIME= 55 MSEC.

(C37) EV(FRAC, X=Z**3);
TIME= 56 MSEC.
				     3    2
(D37)                         - 2 Y Z  + Z  + Y

(C38) STAP(%) $

(E38)            STAPTS  = [Z = 0.7937005, Y = 0.41997372]
		       1

(E39)                       OBJSUB = 0.62996052

(E40)             GRADSUB = [1.1920929E-7, - 8.9406967E-8]

(E41)                       EIGEN = - 4.9098093

(E42)                        EIGEN = 2.9098091
TIME= 6703 MSEC.

(C43) /* A similar technique may be used to eliminate fractional powers
of more complicated subexpressions, provided we include appropriate
supplementary equality constraints.  For example: */

SQRT(X+Y)*Y - X $
TIME= 31 MSEC.

(C44) STAP(EV(%,SQRT(X+Y)=Z), [], Z**2-X-Y) $

(E44)    STAPTS  = [X = 3.0, Y = - 2.0, Z = - 1.0, EQMULT  = - 1.0]
	       1                                         1

(E45)                          OBJSUB = - 1.0

(E46)                  GRADSUB = [0.0, 0.0, 0.0, 0.0]

(E47)                       EIGEN = - 1.4484026

(E48)                        EIGEN = 0.1150693
TIME= 9172 MSEC.

(C49) /* exponentials, hyperbolic functions, and trig functions may
often be converted to the required form by using the multiple-argument
formulas together with equality constraints such as the sum of the
squares of the sine and cosine equals 1.  For example: */

TRIGEXPAND: EXPTSUBST: TRUE $
TIME= 7 MSEC.

(C50) COS(2*X) + SIN(X)*EXP(2*Y) - EXP(Y);
TIME= 209 MSEC.
			    2 Y     Y      2         2
(D50)              SIN(X) %E    - %E  - SIN (X) + COS (X)

(C51) SUBST([SIN(X)=S, COS(X)=C, %E**Y=E], %);
TIME= 267 MSEC.
			       2    2          2
(D51)                       - S  + E  S - E + C

(C52) STAP(%, [], S**2+C**2-1) $

(E52) STAPTS  = [E = 1.25992104, C = - 0.91788341, S = 0.39685026,
	    1

						       EQMULT  = - 1.0]
							     1

(E53)                       OBJSUB = 0.055059291

(E54)        GRADSUB = [0, - 1.49011612E-8, 0.0, 8.19563865E-8]

(E55)                       EIGEN = - 4.4000479

(E56)                        EIGEN = 1.82370886

(E57) STAPTS  = [E = 1.25992104, C = 0.91788339, S = 0.39685026,
	    2

						       EQMULT  = - 1.0]
							     1

(E58)                       OBJSUB = 0.055059254

(E59)        GRADSUB = [0, - 1.49011612E-8, 0.0, 4.4703483E-8]

(E60)                       EIGEN = - 4.4000479

(E61)                        EIGEN = 1.82370886

				 9        1
(E62)       STAPTS  = [EQMULT  = -, E = - -, S = - 1.0, C = 0.0]
		  3          1   8        2

(E63)                         OBJSUB = - 0.75

(E64)                  GRADSUB = [0.0, 0.0, 0.0, 0.0]

(E65)                           EIGEN = - 2

(E66)                           EIGEN = 4.25

				   7      1
(E67)         STAPTS  = [EQMULT  = -, E = -, S = 1.0, C = 0.0]
		    4          1   8      2

(E68)                         OBJSUB = - 1.25

(E69)                  GRADSUB = [0.0, 0.0, 0.0, 0.0]

(E70)                            EIGEN = 2

(E71)                           EIGEN = 3.75
TIME= 30639 MSEC.

(C72) /* For any of the above answers, we may use LOG(E) or ?ATAN(S,C)
to compute the corresponding values of the original decision
variables, where E, S, or C are the right-hand-sides of the
appropriate components of the chosen component of STAPTS.

Now let's try the famous post-office parcel problem:  maximize the
volume of a rectangular parallelopiped parcel, subject to the
constraints that the length plus the girth can't exceed 72,
and that the length, width, and depth cannot be negative or 
exceed 42.  With three decision variables and 7 inequality constraints,
a direct approach using STAP would involve 17 simultaneous nonlinear
equations, which is beyond its present capabilities.  However, since we
are only interested in stationary points that are maxima, it is clear
that none of the non-negativity constraints will be active, and the
length-plus-girth constraint will be active.  Knowing this, we may
treat the length-plus-girth constraint as an equality, thus avoiding 
one slack variable; and we may ignore the non-negativity constraints,
rejecting any negative solutions, avoiding three multipliers and three
more slacks.  Moreover, neither the width nor depth can be 42, because
then the girth alone would exceed 72; so we may ignore these
constraints to avoid two more slacks and two more multipliers.  These
simplifications result in a simple enough system of 6 simultaneous
nonlinear equations to be solved by SOLVE in a reasonable amount
of time: */

VOL: L*W*D $
TIME= 14 MSEC.

(C73) EQCON: L + 2*W + 2*D - 72 $
TIME= 31 MSEC.

(C74) STAP(VOL, L-42, EQCON) $

(E74) STAPTS  = [RTSLACK  = 4.2426405, W = 12.0, D = 12.0, L = 24.0,
	    1           1

				      LEMULT  = 0.0, EQMULT  = - 144.0]
					    1              1

(E75)                         OBJSUB = 3456.0

(E76)       GRADSUB = [0.0, 0.0, 0.0, 0.0, - 1.66893005E-6, 0.0]

(E77)                           EIGEN = - 24

(E78)                        EIGEN = - 7.902439

				     15      15
(E79) STAPTS  = [RTSLACK  = 0.0, W = --, D = --, L = 42.0,
	    2           1            2       2

						  405              315
					LEMULT  = ---, EQMULT  = - ---]
					      1    4         1      2

(E80)                         OBJSUB = 2362.5

(E81)              GRADSUB = [0.0, 0, 0.0, 0.0, 0.0, 0.0]

(E82)                           EIGEN = - 42

(E83)                          EIGEN = 202.5
TIME= 47070 MSEC.

(C84) /* However, we may simplify the problem further, saving
additional time, by making the change of variable L=42-S**2, which
automatically satisfies  the upper bound on L; and we may solve the
equality constraint for either W or D, then eliminate it from the
objective These changes reduce the problem to two simultaneous
nonlinear equations: */

SOLVE(EQCON,W);
SOLUTION

				   L + 2 D - 72
(E84)                        W = - ------------
					2
TIME= 69 MSEC.
(D84)                              [E84]

(C85) VOLSUB: EV(VOL,%);
TIME= 66 MSEC.
			      D L (L + 2 D - 72)
(D85)                       - ------------------
				      2

(C86) EV(%, L=42-S**2);
TIME= 78 MSEC.
				 2       2
			D (42 - S ) ( - S  + 2 D - 30)
(D86)                 - ------------------------------
				      2

(C87) STAP(%) $

(E87)               STAPTS  = [S = 4.2426405, D = 12.0]
			  1

(E88)                         OBJSUB = 3456.0

(E89)            GRADSUB = [- 1.90734863E-5, 1.8310547E-4]

(E90)                       EIGEN = - 876.51387

(E91)                       EIGEN = - 35.486028

						15
(E92)                   STAPTS  = [S = 0.0, D = --]
			      2                 2

(E93)                         OBJSUB = 2362.5

(E94)                       GRADSUB = [0.0, 0.0]

(E95)                           EIGEN = - 84

(E96)                          EIGEN = 202.5
TIME= 18140 MSEC.

(C97) /* It is almost always worth solving the largest possible subset
of the equality constraints for variables that enter them linearly,
then using this solution to eliminate these variables from the
remaining constraints and from the objective.  This is also worth
doing for variables that enter nonlinearly, provided it introduces no
fractional powers in the objective or remaining constraints.
For example, to find the stationary points of  X + 3*Y - 6*Z**2,
subject to  X**2 + Y**2 + Z**2 = 1, it is well worth eliminating Z.

The change of variable for eliminating the inequality constraint
L <= 42, is equivalent to converting the inequality to an equality by
introducing a squared slack variable, solving for L, then eliminating
L from VOLSUB.  From this viewpoint, the "change of variable"
technique is seen to be applicable to a great variety of inequality
constraints, not merely upper and lower bounds as is implied in most
textbooks.  Together with applicable equality constraints, it is
generally worth including in the elimination the largest possible
subset of inequality constraints for which the eliminated variables
enter linearly, up to the number of decision variables minus the number
of equality constraints.

Another technique for treating an inequality constraint is to
solve the problem with the constraint assumed active, and also with
the constraint ignored, checking any stationary points for violation
of the constraint in the latter case: */

STAP(EV(VOLSUB,L=42)) $

				       15
(E98)                              D = --
				       2

					4725
(E99)                          OBJSUB = ----
					 2

(E100)                          GRADSUB = [0]

(E101)                          EIGEN = - 84
TIME= 1071 MSEC.

(C102) STAP(VOLSUB) $

(E102)                 STAPTS  = [L = 24.0, D = 12.0]
			     1

(E103)                         OBJSUB = 3456.0

(E104)                      GRADSUB = [0.0, 0.0]

(E105)                       EIGEN = - 51.633308

(E106)                      EIGEN = - 8.36669242

(E107)                  STAPTS  = [D = 36.0, L = 0.0]
			      2

(E108)                          OBJSUB = 0.0

(E109)                      GRADSUB = [0.0, 0.0]

(E110)                       EIGEN = - 58.249224

(E111)                       EIGEN = 22.2492234

(E112)                  STAPTS  = [L = 72.0, D = 0.0]
			      3

(E113)                          OBJSUB = 0.0

(E114)                      GRADSUB = [0.0, 0.0]

(E115)                      EIGEN = - 152.498447

(E116)                       EIGEN = 8.49844718

(E117)                  STAPTS  = [D = 0.0, L = 0.0]
			      4

(E118)                          OBJSUB = 0.0

(E119)                      GRADSUB = [0.0, 0.0]

(E120)                          EIGEN = - 36

(E121)                           EIGEN = 36
TIME= 11506 MSEC.

(C122) /* The second-order test is inadequate when
constraints have been artifically activated.  For example, the one
eigenvalue for the case  D = 15/2 above is negative, but this
stationary point is actually a saddle.  To see this, we must check the 
unactivated gradient at this point to see if it points into or out of
the feasible region: */

EV(GRAD, D=15/2, L=42);
TIME= 142 MSEC.
				       405
(D122)                           [0, - ---]
					4

(C123) DECSLKMULTS;
TIME= 1 MSEC.
(D123)                             [D, L]

(C124) /*  GRAD is a global varible bound by STAP to the
symbolic expression for the gradient, and DECSLKMULTS is bound to the
variables that the gradient is taken with respect to, in the order
of their components in GRAD.  Thus, -405/4 points in, making the
point a saddle.

The report referenced at the beginning of this demonstration
explains how to generalize this test to more than one constraint.

When there is more than one inequality constraint, each feasible
combination must be activated, unless some additional convexity
requirements are satisfied.  Nevertheless, this combinatorial
activation technique is probably capable of treating
larger problems than either the change-of-variable or the squared-
slack-variable-with-multiplier techniques of treating inequality 
constraints. 

We have already seen how STAP finds poles of the objective or gradient
only by accident.  The following examples are included as reminders
about other limitations of using calculus to find extrema:*/

STAP(X, [], X**3-Y**2) $

(E124)                   NO STATIONARY POINTS FOUND
TIME= 4727 MSEC.

(C125) /* Lagrange multipliers require the constraints to have con-
tinuous tangents, and this is violated for the above example at X=0,
Y=0, where the objective is a minimum.  A direct use of elimination
would fail too, because it results in an undefined derivative at the
minimum.  In such cases, each piece between discontinuities must be
considered a separate constraint.

The next example has a minimum at X=0, Y=0, where the two
active constraints are parallel, making them linearly dependent.
Such cusps or "wiskers" on the feasible region violate the so-called
"constraint-qualification" requirement; so the extremum is not found:*/

STAP(X, [-Y, Y-X**3]) $

(E125)                   NO STATIONARY POINTS FOUND
TIME= 17706 MSEC.

(C126) /* The following example doesn't have a strictly feasible point;
so it violates Slater's condition; and the extremum at X=0 is not
found: */

STAP(X, X**2) $

(E126)                   NO STATIONARY POINTS FOUND
TIME= 4668 MSEC.

(C127) /* Finally, it is important to remember that unbounded regions
may have nonstationary or asymptotically stationary points
at infinity, which STAP will not find.  Such situations are usually
obvious from qualitative considerations, provided the objective and
constraints are not too complicated and numerous, but the macsyma LIMIT
function can be of help.  However, it is important to remember that a
multivariate limit depends upon the way it is taken.  This is
illustrated by the following example, where you will have to type
NONZERO; in response to two interrupts: */

LIMIT(PEANO, Y, INF);

LIMIT FASL DSK MACSYM BEING LOADED 
LOADING DONE
TIME= 280 MSEC.
(D127)                               INF

(C128) LIMIT(PEANO, X, INF);
IS  A B  ZERO OR NONZERO?

NONZERO;
TIME= 402 MSEC.
(D128)                               INF

(C129) RADCAN(EV(PEANO, Y=C+(A**2+B**2)*X**2/2));
TIME= 818 MSEC.
			      4      2  2    4   4
			    (B  - 2 A  B  + A ) X
(D129)                    - ----------------------
				      4

(C130) LIMIT(%, X, INF);
IS  (B + A) (B - A)  ZERO OR NONZERO?

NONZERO;
TIME= 1085 MSEC.
(D130)                              MINF

TIME= 223257 MSEC.
(D131)                           BATCH DONE