Function: math-poly-interp
math-poly-interp is an autoloaded and byte-compiled function defined
in calcalg3.el.gz.
Signature
(math-poly-interp XA YA X RATP)
Source Code
;; Defined in /usr/src/emacs/lisp/calc/calcalg3.el.gz
(defun math-poly-interp (xa ya x ratp)
(let ((n (length xa))
(dif nil)
(ns nil)
(xax nil)
(c (copy-sequence ya))
(d (copy-sequence ya))
(i 0)
(m 0)
y dy (xp xa) xpm cp dp temp)
(while (<= (setq i (1+ i)) n)
(setq xax (cons (math-sub (car xp) x) xax)
xp (cdr xp)
temp (math-abs (car xax)))
(if (or (null dif) (math-lessp temp dif))
(setq dif temp
ns i)))
(setq xax (nreverse xax)
ns (1- ns)
y (nth ns ya))
(if (math-zerop dif)
(list y 0)
(while (< (setq m (1+ m)) n)
(setq i 0
xp xax
xpm (nthcdr m xax)
cp c
dp d)
(while (<= (setq i (1+ i)) (- n m))
(if ratp
(let ((t2 (math-div (math-mul (car xp) (car dp)) (car xpm))))
(setq temp (math-div (math-sub (nth 1 cp) (car dp))
(math-sub t2 (nth 1 cp))))
(setcar dp (math-mul (nth 1 cp) temp))
(setcar cp (math-mul t2 temp)))
(if (math-equal (car xp) (car xpm))
(math-reject-arg (cons 'vec xa) "*Duplicate X values"))
(setq temp (math-div (math-sub (nth 1 cp) (car dp))
(math-sub (car xp) (car xpm))))
(setcar dp (math-mul (car xpm) temp))
(setcar cp (math-mul (car xp) temp)))
(setq cp (cdr cp)
dp (cdr dp)
xp (cdr xp)
xpm (cdr xpm)))
(if (< (+ ns ns) (- n m))
(setq dy (nth ns c))
(setq ns (1- ns)
dy (nth ns d)))
(setq y (math-add y dy)))
(list y dy))))