Function: math-solve-system-rec
math-solve-system-rec is a byte-compiled function defined in
calcalg2.el.gz.
Signature
(math-solve-system-rec EQN-LIST VAR-LIST SOLNS)
Source Code
;; Defined in /usr/src/emacs/lisp/calc/calcalg2.el.gz
(defun math-solve-system-rec (eqn-list var-list solns)
(if var-list
(let ((v var-list)
(math-solve-system-res nil))
;; Try each variable in turn.
(while
(and
v
(let* ((math-solve-system-vv (car v))
(e eqn-list)
(elim (eq (car-safe math-solve-system-vv) 'calcFunc-elim)))
(if elim
(setq math-solve-system-vv (nth 1 math-solve-system-vv)))
;; Try each equation in turn.
(while
(and
e
(let ((e2 (car e))
(eprev nil)
res2)
(setq math-solve-system-res nil)
;; Try to solve for math-solve-system-vv the list of equations e2.
(while (and e2
(setq res2 (or (and (eq (car e2) eprev)
res2)
(math-solve-for (car e2) 0
math-solve-system-vv
math-solve-full))))
(setq eprev (car e2)
math-solve-system-res (cons (if (eq math-solve-full 'all)
(cdr res2)
(list res2))
math-solve-system-res)
e2 (cdr e2)))
(if e2
(setq math-solve-system-res nil)
;; Found a solution. Now try other variables.
(setq math-solve-system-res (nreverse math-solve-system-res)
math-solve-system-res (math-solve-system-rec
(mapcar
'math-solve-system-subst
(delq (car e)
(copy-sequence eqn-list)))
(delq (car v) (copy-sequence var-list))
(let ((math-solve-simplifying nil)
(s (mapcar
(lambda (x)
(cons
(car x)
(math-solve-system-subst
(cdr x))))
solns)))
(if elim
s
(cons (cons
math-solve-system-vv
(apply 'append math-solve-system-res))
s)))))
(not math-solve-system-res))))
(setq e (cdr e)))
(not math-solve-system-res)))
(setq v (cdr v)))
math-solve-system-res)
;; Eliminated all variables, so now put solution into the proper format.
(setq solns (sort solns
(lambda (x y)
(not (memq (car x) (memq (car y) math-solve-vars))))))
(if (eq math-solve-full 'all)
(math-transpose
(math-normalize
(cons 'vec
(if solns
(mapcar (lambda (x) (cons 'vec (cdr x))) solns)
(mapcar (lambda (x) (cons 'vec x)) eqn-list)))))
(math-normalize
(cons 'vec
(if solns
(mapcar (lambda (x) (cons 'calcFunc-eq x)) solns)
(mapcar #'car eqn-list)))))))