Function: math-find-minimum
math-find-minimum is an autoloaded and byte-compiled function defined
in calcalg3.el.gz.
Signature
(math-find-minimum EXPR VAR GUESS MIN-WIDEN)
Source Code
;; Defined in /usr/src/emacs/lisp/calc/calcalg3.el.gz
(defun math-find-minimum (expr var guess min-widen)
(let* ((calc-symbolic-mode nil)
(n 0)
(var-DUMMY nil)
(isvec (math-vectorp var))
guesses) ;; g
(or (math-vectorp var)
(setq var (list 'vec var)))
(or (math-vectorp guess)
(setq guess (list 'vec guess)))
(or (= (length var) (length guess))
(math-dimension-error))
(while (setq var (cdr var) guess (cdr guess))
(or (eq (car-safe (car var)) 'var)
(math-reject-arg (car var) "*Expected a variable"))
(or (math-expr-contains expr (car var))
(math-reject-arg (car var)
"*Formula does not contain specified variable"))
(while (>= (1+ n) (length math-min-vars))
(let ((symb (intern (concat "math-min-v"
(int-to-string
(length math-min-vars))))))
(setq math-min-vars (vconcat math-min-vars
(vector (list 'var symb symb))))))
(set (nth 2 (aref math-min-vars n)) nil)
(set (nth 2 (aref math-min-vars (1+ n))) nil)
(if (math-complexp (car guess))
(setq expr (math-expr-subst expr
(car var)
(list '+ (aref math-min-vars n)
(list '*
(aref math-min-vars (1+ n))
'(cplx 0 1))))
guesses (let ((g (math-float (math-complex (car guess)))))
(cons (list (nth 2 g) nil nil)
(cons (list (nth 1 g) nil nil t)
guesses)))
n (+ n 2))
(setq expr (math-expr-subst expr
(car var)
(aref math-min-vars n))
guesses (cons (if (math-realp (car guess))
(list (math-float (car guess)) nil nil)
(if (and (eq (car-safe (car guess)) 'intv)
(math-constp (car guess)))
(list (math-mul
(math-add (nth 2 (car guess))
(nth 3 (car guess)))
'(float 5 -1))
(math-float (nth 2 (car guess)))
(math-float (nth 3 (car guess)))
(car guess))
(math-reject-arg (car guess) 'realp)))
guesses)
n (1+ n))))
(setq guesses (nreverse guesses)
expr (math-evaluate-expr expr))
(if (= n 1)
(let* ((params (if (nth 1 (car guesses))
(if min-widen
(math-widen-min expr
(nth 1 (car guesses))
(nth 2 (car guesses)))
(math-narrow-min expr
(nth 1 (car guesses))
(nth 2 (car guesses))
(nth 3 (car guesses))))
(math-widen-min expr
(car (car guesses))
nil)))
(prec calc-internal-prec)
(res (if (cdr (cdr params))
(math-with-extra-prec (+ calc-internal-prec 2)
(apply 'math-brent-min expr prec params))
(cons 'vec params))))
(if isvec
(list 'vec (list 'vec (nth 1 res)) (nth 2 res))
res))
(let* ((prec calc-internal-prec)
(res (math-with-extra-prec (+ calc-internal-prec 2)
(math-powell-min expr n guesses prec)))
(p (nth 1 res))
(vec (list 'vec)))
(while (setq p (cdr p))
(if (nth 3 (car guesses))
(progn
(nconc vec (list (math-normalize
(list 'cplx (car p) (nth 1 p)))))
(setq p (cdr p)
guesses (cdr guesses)))
(nconc vec (list (car p))))
(setq guesses (cdr guesses)))
(if isvec
(list 'vec vec (nth 2 res))
(list 'vec (nth 1 vec) (nth 2 res)))))))