Function: math-widen-min
math-widen-min is a byte-compiled function defined in calcalg3.el.gz.
Signature
(math-widen-min EXPR A B)
Source Code
;; Defined in /usr/src/emacs/lisp/calc/calcalg3.el.gz
;;; A bracket for a minimum is a < b < c where f(b) < f(a) and f(b) < f(c).
;;; "mnbrak"
(defun math-widen-min (expr a b)
(let ((done nil)
(iters 30)
incr c va vb vc u vu r q ulim bc ba qr)
(or b (setq b (math-mul a '(float 101 -2))))
(setq va (math-min-eval expr a)
vb (math-min-eval expr b))
(if (math-lessp-float va vb)
(setq u a a b b u
vu va va vb vb vu))
(setq c (math-add-float b (math-mul-float '(float 161803 -5)
(math-sub-float b a)))
vc (math-min-eval expr c))
(while (and (not done) (math-lessp-float vc vb))
(math-working "widen" (list 'intv 0 a c))
(if (= (setq iters (1- iters)) 0)
(math-reject-arg nil (format "*Unable to find a %s near the interval"
math-min-or-max)))
(setq bc (math-sub-float b c)
ba (math-sub-float b a)
r (math-mul-float ba (math-sub-float vb vc))
q (math-mul-float bc (math-sub-float vb va))
qr (math-sub-float q r))
(if (math-lessp-float (math-abs qr) '(float 1 -20))
(setq qr (if (math-negp qr) '(float -1 -20) '(float 1 -20))))
(setq u (math-sub-float
b
(math-div-float (math-sub-float (math-mul-float bc q)
(math-mul-float ba r))
(math-mul-float '(float 2 0) qr)))
ulim (math-add-float b (math-mul-float '(float -1 2) bc))
incr (math-negp bc))
(if (if incr (math-lessp-float b u) (math-lessp-float u b))
(if (if incr (math-lessp-float u c) (math-lessp-float c u))
(if (math-lessp-float (setq vu (math-min-eval expr u)) vc)
(setq a b va vb
b u vb vu
done t)
(if (math-lessp-float vb vu)
(setq c u vc vu
done t)
(setq u (math-add-float c (math-mul-float '(float -161803 -5)
bc))
vu (math-min-eval expr u))))
(if (if incr (math-lessp-float u ulim) (math-lessp-float ulim u))
(if (math-lessp-float (setq vu (math-min-eval expr u)) vc)
(setq b c vb vc
c u vc vu
u (math-add-float c (math-mul-float
'(float -161803 -5)
(math-sub-float b c)))
vu (math-min-eval expr u)))
(setq u ulim
vu (math-min-eval expr u))))
(setq u (math-add-float c (math-mul-float '(float -161803 -5)
bc))
vu (math-min-eval expr u)))
(setq a b va vb
b c vb vc
c u vc vu))
(if (math-lessp-float a c)
(list a va b vb c vc)
(list c vc b vb a va))))