Function: math-derivative
math-derivative is a byte-compiled function defined in calcalg2.el.gz.
Signature
(math-derivative EXPR)
Source Code
;; Defined in /usr/src/emacs/lisp/calc/calcalg2.el.gz
(defun math-derivative (expr)
(cond ((equal expr math-deriv-var)
1)
((or (Math-scalarp expr)
(eq (car expr) 'sdev)
(and (eq (car expr) 'var)
(or (not math-deriv-total)
(math-const-var expr)
(progn
(math-setup-declarations)
(memq 'const (nth 1 (or (assq (nth 2 expr)
math-decls-cache)
math-decls-all)))))))
0)
((eq (car expr) '+)
(math-add (math-derivative (nth 1 expr))
(math-derivative (nth 2 expr))))
((eq (car expr) '-)
(math-sub (math-derivative (nth 1 expr))
(math-derivative (nth 2 expr))))
((memq (car expr) '(calcFunc-eq calcFunc-neq calcFunc-lt
calcFunc-gt calcFunc-leq calcFunc-geq))
(list (car expr)
(math-derivative (nth 1 expr))
(math-derivative (nth 2 expr))))
((eq (car expr) 'neg)
(math-neg (math-derivative (nth 1 expr))))
((eq (car expr) '*)
(math-add (math-mul (nth 2 expr)
(math-derivative (nth 1 expr)))
(math-mul (nth 1 expr)
(math-derivative (nth 2 expr)))))
((eq (car expr) '/)
(math-sub (math-div (math-derivative (nth 1 expr))
(nth 2 expr))
(math-div (math-mul (nth 1 expr)
(math-derivative (nth 2 expr)))
(math-sqr (nth 2 expr)))))
((eq (car expr) '^)
(let ((du (math-derivative (nth 1 expr)))
(dv (math-derivative (nth 2 expr))))
(or (Math-zerop du)
(setq du (math-mul (nth 2 expr)
(math-mul (math-normalize
(list '^
(nth 1 expr)
(math-add (nth 2 expr) -1)))
du))))
(or (Math-zerop dv)
(setq dv (math-mul (math-normalize
(list 'calcFunc-ln (nth 1 expr)))
(math-mul expr dv))))
(math-add du dv)))
((eq (car expr) '%)
(math-derivative (nth 1 expr))) ; a reasonable definition
((eq (car expr) 'vec)
(math-map-vec 'math-derivative expr))
((and (memq (car expr) '(calcFunc-conj calcFunc-re calcFunc-im))
(= (length expr) 2))
(list (car expr) (math-derivative (nth 1 expr))))
((and (memq (car expr) '(calcFunc-subscr calcFunc-mrow calcFunc-mcol))
(= (length expr) 3))
(let ((d (math-derivative (nth 1 expr))))
(if (math-numberp d)
0 ; assume x and x_1 are independent vars
(list (car expr) d (nth 2 expr)))))
(t (or (and (symbolp (car expr))
(if (= (length expr) 2)
(let ((handler (get (car expr) 'math-derivative)))
(and handler
(let ((deriv (math-derivative (nth 1 expr))))
(if (Math-zerop deriv)
deriv
(math-mul (funcall handler (nth 1 expr))
deriv)))))
(let ((handler (get (car expr) 'math-derivative-n)))
(and handler
(funcall handler expr)))))
(and (not (eq math-deriv-symb 'pre-expand))
(let ((exp (math-expand-formula expr)))
(and exp
(or (let ((math-deriv-symb 'pre-expand))
(catch 'math-deriv (math-derivative expr)))
(math-derivative exp)))))
(if (or (Math-objvecp expr)
(eq (car expr) 'var)
(not (symbolp (car expr))))
(if math-deriv-symb
(throw 'math-deriv nil)
(list (if math-deriv-total 'calcFunc-tderiv 'calcFunc-deriv)
expr
math-deriv-var))
(let ((accum 0)
(arg expr)
(n 1)
derv)
(while (setq arg (cdr arg))
(or (Math-zerop (setq derv (math-derivative (car arg))))
(let ((func (intern (concat (symbol-name (car expr))
"'"
(if (> n 1)
(int-to-string n)
""))))
(prop (cond ((= (length expr) 2)
'math-derivative-1)
((= (length expr) 3)
'math-derivative-2)
((= (length expr) 4)
'math-derivative-3)
((= (length expr) 5)
'math-derivative-4)
((= (length expr) 6)
'math-derivative-5))))
(setq accum
(math-add
accum
(math-mul
derv
(let ((handler (get func prop)))
(or (and prop handler
(apply handler (cdr expr)))
(if (and math-deriv-symb
(not (get func
'calc-user-defn)))
(throw 'math-deriv nil)
(cons func (cdr expr))))))))))
(setq n (1+ n)))
accum))))))