Function: math-newton-search-root
math-newton-search-root is a byte-compiled function defined in
calcalg3.el.gz.
Signature
(math-newton-search-root EXPR DERIV GUESS VGUESS OSTEP OOSTEP LOW VLOW HIGH VHIGH)
Source Code
;; Defined in /usr/src/emacs/lisp/calc/calcalg3.el.gz
;;; Inspired by "rtsafe"
(defun math-newton-search-root (expr deriv guess vguess ostep oostep
low vlow high vhigh)
(let ((var-DUMMY guess)
(better t)
pos step next vnext)
(if guess
(math-working "newton" (list 'intv 0 low high))
(math-working "bisect" (list 'intv 0 low high))
(setq ostep (math-mul-float (math-sub-float high low)
'(float 5 -1))
guess (math-add-float low ostep)
var-DUMMY guess
vguess (math-evaluate-expr expr))
(or (Math-realp vguess)
(progn
(setq ostep (math-mul-float ostep '(float 6 -1))
guess (math-add-float low ostep)
var-DUMMY guess
vguess (math-evaluate-expr expr))
(or (math-realp vguess)
(progn
(setq ostep (math-mul-float ostep '(float 123456 -5))
guess (math-add-float low ostep)
var-DUMMY guess
vguess nil))))))
(or vguess
(setq vguess (math-evaluate-expr expr)))
(or (Math-realp vguess)
(math-reject-arg guess "*Newton's method encountered a singularity"))
(setq vguess (math-float vguess))
(if (eq (Math-negp vlow) (setq pos (Math-posp vguess)))
(setq high guess
vhigh vguess)
(if (eq (Math-negp vhigh) pos)
(setq low guess
vlow vguess)
(setq better nil)))
(if (or (Math-zerop vguess)
(math-nearly-equal low high))
(list 'vec guess vguess)
(setq step (math-evaluate-expr deriv))
(if (and (Math-realp step)
(not (Math-zerop step))
(setq step (math-div-float vguess (math-float step))
next (math-sub-float guess step))
(not (math-lessp-float high next))
(not (math-lessp-float next low)))
(progn
(setq var-DUMMY next
vnext (math-evaluate-expr expr))
(if (or (Math-zerop vnext)
(math-nearly-equal next guess))
(list 'vec next vnext)
(if (and better
(math-lessp-float (math-abs (or oostep
(math-sub-float
high low)))
(math-abs
(math-mul-float '(float 2 0)
step))))
(math-newton-search-root expr deriv nil nil nil ostep
low vlow high vhigh)
(math-newton-search-root expr deriv next vnext step ostep
low vlow high vhigh))))
(if (or (and (Math-posp vlow) (Math-posp vhigh))
(and (Math-negp vlow) (Math-negp vhigh)))
(math-search-root expr deriv low vlow high vhigh)
(math-newton-search-root expr deriv nil nil nil ostep
low vlow high vhigh))))))