changeset 58391:4252820dfd91

(calc-curve-nvars, calc-curve-varnames, calc-curve-model) (calc-curve-coefnames): New variable. (calc-curve-fit, calc-get-fit-variables): Replace variables nvars, varnames, model and coefnames by declared variables. (math-root-widen): New variable. (math-search-root, math-find-root): Replace variable root-widen by declared variable. (var-DUMMY): Declare it. (math-root-vars, math-min-vars): Move the declarations to earlier in the file. (math-brent-min): Make d a local variable. (math-find-minimum): Replace non-existent variable. (math-ninteg-romberg): Remove unnecessary variable. (math-ninteg-temp): New variable. (math-ninteg-romberg, math-ninteg-midpoint): Replace variable integ-temp by declared variable. (math-fit-first-var, math-fit-first-coef, math-fit-new-coefs): New variables. (math-general-fit): Replace variables first-var, first-coef and new-coefs by declared variables. (calcFunc-fitvar): Replace variable first-var by declared variable. (calcFunc-fitparam): Replace variable first-coef by declared variable. (calcFunc-fitdummy): Replace variable new-coefs by declared variable. (math-all-vars-vars, math-all-vars-found): New variables. (math-all-vars-in, math-all-vars-rec): Replace variables vars and found by declared variable math-all-vars-vars.
author Jay Belanger <jay.p.belanger@gmail.com>
date Sun, 21 Nov 2004 05:55:43 +0000
parents 2c8f55b9ef8a
children f353e02ac006
files lisp/calc/calcalg3.el
diffstat 1 files changed, 195 insertions(+), 144 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/calc/calcalg3.el	Sun Nov 21 05:52:41 2004 +0000
+++ b/lisp/calc/calcalg3.el	Sun Nov 21 05:55:43 2004 +0000
@@ -3,8 +3,7 @@
 ;; Copyright (C) 1990, 1991, 1992, 1993, 2001 Free Software Foundation, Inc.
 
 ;; Author: David Gillespie <daveg@synaptics.com>
-;; Maintainers: D. Goel <deego@gnufans.org>
-;;              Colin Walters <walters@debian.org>
+;; Maintainer: Jay Belanger <belanger@truman.edu>
 
 ;; This file is part of GNU Emacs.
 
@@ -99,8 +98,15 @@
        (calc-enter-result 1 "poli" (list 'calcFunc-polint data
 					 (calc-top 1)))))))
 
+;; The variables calc-curve-nvars, calc-curve-varnames, calc-curve-model and calc-curve-coefnames are local to calc-curve-fit, but are
+;; used by calc-get-fit-variables which is called by calc-curve-fit.
+(defvar calc-curve-nvars)
+(defvar calc-curve-varnames)
+(defvar calc-curve-model)
+(defvar calc-curve-coefnames)
 
-(defun calc-curve-fit (arg &optional model coefnames varnames)
+(defun calc-curve-fit (arg &optional calc-curve-model 
+                           calc-curve-coefnames calc-curve-varnames)
   (interactive "P")
   (calc-slow-wrapper
    (setq calc-aborted-prefix nil)
@@ -108,7 +114,7 @@
 		 (if (calc-is-hyperbolic) 'calcFunc-efit
 		   'calcFunc-fit)))
 	 key (which 0)
-	 n nvars temp data
+	 n calc-curve-nvars temp data
 	 (homog nil)
 	 (msgs '( "(Press ? for help)"
 		  "1 = linear or multilinear"
@@ -120,7 +126,7 @@
 		  "g = (a/b sqrt(2 pi)) exp(-0.5*((x-c)/b)^2)"
 		  "h prefix = homogeneous model (no constant term)"
 		  "' = alg entry, $ = stack, u = Model1, U = Model2")))
-     (while (not model)
+     (while (not calc-curve-model)
        (message "Fit to model: %s:%s"
 		(nth which msgs)
 		(if homog " h" ""))
@@ -150,44 +156,50 @@
 		      (t (error "Bad prefix argument")))
 		(or (math-matrixp data) (not (cdr (cdr data)))
 		    (error "Data matrix is not a matrix!"))
-		(setq nvars (- (length data) 2)
-		      coefnames nil
-		      varnames nil)
+		(setq calc-curve-nvars (- (length data) 2)
+		      calc-curve-coefnames nil
+		      calc-curve-varnames nil)
 		nil))
 	     ((= key ?1)  ; linear or multilinear
-	      (calc-get-fit-variables nvars (1+ nvars) (and homog 0))
-	      (setq model (math-mul coefnames
-				    (cons 'vec (cons 1 (cdr varnames))))))
+	      (calc-get-fit-variables calc-curve-nvars 
+                                      (1+ calc-curve-nvars) (and homog 0))
+	      (setq calc-curve-model (math-mul calc-curve-coefnames
+				    (cons 'vec (cons 1 (cdr calc-curve-varnames))))))
 	     ((and (>= key ?2) (<= key ?9))   ; polynomial
 	      (calc-get-fit-variables 1 (- key ?0 -1) (and homog 0))
-	      (setq model (math-build-polynomial-expr (cdr coefnames)
-						      (nth 1 varnames))))
+	      (setq calc-curve-model 
+                    (math-build-polynomial-expr (cdr calc-curve-coefnames)
+                                                (nth 1 calc-curve-varnames))))
 	     ((= key ?i)  ; exact polynomial
 	      (calc-get-fit-variables 1 (1- (length (nth 1 data)))
 				      (and homog 0))
-	      (setq model (math-build-polynomial-expr (cdr coefnames)
-						      (nth 1 varnames))))
+	      (setq calc-curve-model 
+                    (math-build-polynomial-expr (cdr calc-curve-coefnames)
+                                                (nth 1 calc-curve-varnames))))
 	     ((= key ?p)  ; power law
-	      (calc-get-fit-variables nvars (1+ nvars) (and homog 1))
-	      (setq model (math-mul (nth 1 coefnames)
+	      (calc-get-fit-variables calc-curve-nvars 
+                                      (1+ calc-curve-nvars) (and homog 1))
+	      (setq calc-curve-model (math-mul (nth 1 calc-curve-coefnames)
 				    (calcFunc-reduce
 				     '(var mul var-mul)
 				     (calcFunc-map
 				      '(var pow var-pow)
-				      varnames
-				      (cons 'vec (cdr (cdr coefnames))))))))
+				      calc-curve-varnames
+				      (cons 'vec (cdr (cdr calc-curve-coefnames))))))))
 	     ((= key ?^)  ; exponential law
-	      (calc-get-fit-variables nvars (1+ nvars) (and homog 1))
-	      (setq model (math-mul (nth 1 coefnames)
+	      (calc-get-fit-variables calc-curve-nvars 
+                                      (1+ calc-curve-nvars) (and homog 1))
+	      (setq calc-curve-model (math-mul (nth 1 calc-curve-coefnames)
 				    (calcFunc-reduce
 				     '(var mul var-mul)
 				     (calcFunc-map
 				      '(var pow var-pow)
-				      (cons 'vec (cdr (cdr coefnames)))
-				      varnames)))))
+				      (cons 'vec (cdr (cdr calc-curve-coefnames)))
+				      calc-curve-varnames)))))
 	     ((memq key '(?e ?E))
-	      (calc-get-fit-variables nvars (1+ nvars) (and homog 1))
-	      (setq model (math-mul (nth 1 coefnames)
+	      (calc-get-fit-variables calc-curve-nvars 
+                                      (1+ calc-curve-nvars) (and homog 1))
+	      (setq calc-curve-model (math-mul (nth 1 calc-curve-coefnames)
 				    (calcFunc-reduce
 				     '(var mul var-mul)
 				     (calcFunc-map
@@ -198,45 +210,50 @@
 					  (^ 10 (var a var-a))))
 				      (calcFunc-map
 				       '(var mul var-mul)
-				       (cons 'vec (cdr (cdr coefnames)))
-				       varnames))))))
+				       (cons 'vec (cdr (cdr calc-curve-coefnames)))
+				       calc-curve-varnames))))))
 	     ((memq key '(?x ?X))
-	      (calc-get-fit-variables nvars (1+ nvars) (and homog 0))
-	      (setq model (math-mul coefnames
-				    (cons 'vec (cons 1 (cdr varnames)))))
-	      (setq model (if (eq key ?x)
-			      (list 'calcFunc-exp model)
-			    (list '^ 10 model))))
+	      (calc-get-fit-variables calc-curve-nvars 
+                                      (1+ calc-curve-nvars) (and homog 0))
+	      (setq calc-curve-model (math-mul calc-curve-coefnames
+				    (cons 'vec (cons 1 (cdr calc-curve-varnames)))))
+	      (setq calc-curve-model (if (eq key ?x)
+			      (list 'calcFunc-exp calc-curve-model)
+			    (list '^ 10 calc-curve-model))))
 	     ((memq key '(?l ?L))
-	      (calc-get-fit-variables nvars (1+ nvars) (and homog 0))
-	      (setq model (math-mul coefnames
+	      (calc-get-fit-variables calc-curve-nvars 
+                                      (1+ calc-curve-nvars) (and homog 0))
+	      (setq calc-curve-model (math-mul calc-curve-coefnames
 				    (cons 'vec
 					  (cons 1 (cdr (calcFunc-map
 							(if (eq key ?l)
 							    '(var ln var-ln)
 							  '(var log10
 								var-log10))
-							varnames)))))))
+							calc-curve-varnames)))))))
 	     ((= key ?q)
-	      (calc-get-fit-variables nvars (1+ (* 2 nvars)) (and homog 0))
-	      (let ((c coefnames)
-		    (v varnames))
-		(setq model (nth 1 c))
+	      (calc-get-fit-variables calc-curve-nvars 
+                                      (1+ (* 2 calc-curve-nvars)) (and homog 0))
+	      (let ((c calc-curve-coefnames)
+		    (v calc-curve-varnames))
+		(setq calc-curve-model (nth 1 c))
 		(while (setq v (cdr v) c (cdr (cdr c)))
-		  (setq model (math-add
-			       model
+		  (setq calc-curve-model (math-add
+			       calc-curve-model
 			       (list '*
 				     (car c)
 				     (list '^
 					   (list '- (car v) (nth 1 c))
 					   2)))))))
 	     ((= key ?g)
-	      (setq model (math-read-expr "(AFit / BFit sqrt(2 pi)) exp(-0.5 * ((XFit - CFit) / BFit)^2)")
-		    varnames '(vec (var XFit var-XFit))
-		    coefnames '(vec (var AFit var-AFit)
+	      (setq calc-curve-model 
+                    (math-read-expr "(AFit / BFit sqrt(2 pi)) exp(-0.5 * ((XFit - CFit) / BFit)^2)")
+		    calc-curve-varnames '(vec (var XFit var-XFit))
+		    calc-curve-coefnames '(vec (var AFit var-AFit)
 				    (var BFit var-BFit)
 				    (var CFit var-CFit)))
-	      (calc-get-fit-variables 1 (1- (length coefnames)) (and homog 1)))
+	      (calc-get-fit-variables 1 (1- (length calc-curve-coefnames)) 
+                                      (and homog 1)))
 	     ((memq key '(?\$ ?\' ?u ?U))
 	      (let* ((defvars nil)
 		     (record-entry nil))
@@ -244,74 +261,78 @@
 		    (let* ((calc-dollar-values calc-arg-values)
 			   (calc-dollar-used 0)
 			   (calc-hashes-used 0))
-		      (setq model (calc-do-alg-entry "" "Model formula: "))
-		      (if (/= (length model) 1)
+		      (setq calc-curve-model (calc-do-alg-entry "" "Model formula: "))
+		      (if (/= (length calc-curve-model) 1)
 			  (error "Bad format"))
-		      (setq model (car model)
+		      (setq calc-curve-model (car calc-curve-model)
 			    record-entry t)
 		      (if (> calc-dollar-used 0)
-			  (setq coefnames
+			  (setq calc-curve-coefnames
 				(cons 'vec
 				      (nthcdr (- (length calc-arg-values)
 						 calc-dollar-used)
 					      (reverse calc-arg-values))))
 			(if (> calc-hashes-used 0)
-			    (setq coefnames
+			    (setq calc-curve-coefnames
 				  (cons 'vec (calc-invent-args
 					      calc-hashes-used))))))
 		  (progn
-		    (setq model (cond ((eq key ?u)
+		    (setq calc-curve-model (cond ((eq key ?u)
 				       (calc-var-value 'var-Model1))
 				      ((eq key ?U)
 				       (calc-var-value 'var-Model2))
 				      (t (calc-top 1))))
-		    (or model (error "User model not yet defined"))
-		    (if (math-vectorp model)
-			(if (and (memq (length model) '(3 4))
-				 (not (math-objvecp (nth 1 model)))
-				 (math-vectorp (nth 2 model))
-				 (or (null (nth 3 model))
-				     (math-vectorp (nth 3 model))))
-			    (setq varnames (nth 2 model)
-				  coefnames (or (nth 3 model)
-						(cons 'vec
-						      (math-all-vars-but
-						       model varnames)))
-				  model (nth 1 model))
+		    (or calc-curve-model (error "User model not yet defined"))
+		    (if (math-vectorp calc-curve-model)
+			(if (and (memq (length calc-curve-model) '(3 4))
+				 (not (math-objvecp (nth 1 calc-curve-model)))
+				 (math-vectorp (nth 2 calc-curve-model))
+				 (or (null (nth 3 calc-curve-model))
+				     (math-vectorp (nth 3 calc-curve-model))))
+			    (setq calc-curve-varnames (nth 2 calc-curve-model)
+				  calc-curve-coefnames 
+                                  (or (nth 3 calc-curve-model)
+                                      (cons 'vec
+                                            (math-all-vars-but
+                                             calc-curve-model calc-curve-varnames)))
+				  calc-curve-model (nth 1 calc-curve-model))
 			  (error "Incorrect model specifier")))))
-		(or varnames
-		    (let ((with-y (eq (car-safe model) 'calcFunc-eq)))
-		      (if coefnames
-			  (calc-get-fit-variables (if with-y (1+ nvars) nvars)
-						  (1- (length coefnames))
-						  (math-all-vars-but
-						   model coefnames)
-						  nil with-y)
-			(let* ((coefs (math-all-vars-but model nil))
+		(or calc-curve-varnames
+		    (let ((with-y (eq (car-safe calc-curve-model) 'calcFunc-eq)))
+		      (if calc-curve-coefnames
+			  (calc-get-fit-variables 
+                           (if with-y (1+ calc-curve-nvars) calc-curve-nvars)
+                           (1- (length calc-curve-coefnames))
+                           (math-all-vars-but
+                            calc-curve-model calc-curve-coefnames)
+                           nil with-y)
+			(let* ((coefs (math-all-vars-but calc-curve-model nil))
 			       (vars nil)
-			       (n (- (length coefs) nvars (if with-y 2 1)))
+			       (n (- (length coefs) calc-curve-nvars (if with-y 2 1)))
 			       p)
 			  (if (< n 0)
 			      (error "Not enough variables in model"))
 			  (setq p (nthcdr n coefs))
 			  (setq vars (cdr p))
 			  (setcdr p nil)
-			  (calc-get-fit-variables (if with-y (1+ nvars) nvars)
-						  (length coefs)
-						  vars coefs with-y)))))
+			  (calc-get-fit-variables 
+                           (if with-y (1+ calc-curve-nvars) calc-curve-nvars)
+                           (length coefs)
+                           vars coefs with-y)))))
 		(if record-entry
-		    (calc-record (list 'vec model varnames coefnames)
+		    (calc-record (list 'vec calc-curve-model 
+                                       calc-curve-varnames calc-curve-coefnames)
 				 "modl"))))
 	     (t (beep))))
      (let ((calc-fit-to-trail t))
        (calc-enter-result n (substring (symbol-name func) 9)
-			  (list func model
-				(if (= (length varnames) 2)
-				    (nth 1 varnames)
-				  varnames)
-				(if (= (length coefnames) 2)
-				    (nth 1 coefnames)
-				  coefnames)
+			  (list func calc-curve-model
+				(if (= (length calc-curve-varnames) 2)
+				    (nth 1 calc-curve-varnames)
+				  calc-curve-varnames)
+				(if (= (length calc-curve-coefnames) 2)
+				    (nth 1 calc-curve-coefnames)
+				  calc-curve-coefnames)
 				data))
        (if (consp calc-fit-to-trail)
 	   (calc-record (calc-normalize calc-fit-to-trail) "parm"))))))
@@ -340,7 +361,7 @@
       (calc-invent-variables num but t base))))
 
 (defun calc-get-fit-variables (nv nc &optional defv defc with-y homog)
-  (or (= nv (if with-y (1+ nvars) nvars))
+  (or (= nv (if with-y (1+ calc-curve-nvars) calc-curve-nvars))
       (error "Wrong number of data vectors for this type of model"))
   (if (integerp defv)
       (setq homog defv
@@ -388,12 +409,12 @@
 	(error "Expected %d parameter variable%s" nc (if (= nc 1) "" "s")))
     (if homog
 	(setq coefs (cons 'vec (cons homog (cdr coefs)))))
-    (if varnames
-	(setq model (math-multi-subst model (cdr varnames) (cdr vars))))
-    (if coefnames
-	(setq model (math-multi-subst model (cdr coefnames) (cdr coefs))))
-    (setq varnames vars
-	  coefnames coefs)))
+    (if calc-curve-varnames
+	(setq calc-curve-model (math-multi-subst calc-curve-model (cdr calc-curve-varnames) (cdr vars))))
+    (if calc-curve-coefnames
+	(setq calc-curve-model (math-multi-subst calc-curve-model (cdr calc-curve-coefnames) (cdr coefs))))
+    (setq calc-curve-varnames vars
+	  calc-curve-coefnames coefs)))
 
 
 
@@ -401,6 +422,9 @@
 ;;; The following algorithms are from Numerical Recipes chapter 9.
 
 ;;; "rtnewt" with safety kludges
+
+(defvar var-DUMMY)
+
 (defun math-newton-root (expr deriv guess orig-guess limit)
   (math-working "newton" guess)
   (let* ((var-DUMMY guess)
@@ -494,14 +518,20 @@
 				   low vlow high vhigh))))))
 
 ;;; Search for a root in an interval with no overt zero crossing.
+
+;; The variable math-root-widen is local to math-find-root, but
+;; is used by math-search-root, which is called (directly and
+;; indirectly) by math-find-root.
+(defvar math-root-widen)
+
 (defun math-search-root (expr deriv low vlow high vhigh)
   (let (found)
-    (if root-widen
+    (if math-root-widen
 	(let ((iters 0)
-	      (iterlim (if (eq root-widen 'point)
+	      (iterlim (if (eq math-root-widen 'point)
 			   (+ calc-internal-prec 10)
 			 20))
-	      (factor (if (eq root-widen 'point)
+	      (factor (if (eq math-root-widen 'point)
 			  '(float 9 0)
 			'(float 16 -1)))
 	      (prev nil) vprev waslow
@@ -600,6 +630,9 @@
     (list 'vec mid vmid)))
 
 ;;; "mnewt"
+
+(defvar math-root-vars [(var DUMMY var-DUMMY)])
+
 (defun math-newton-multi (expr jacob n guess orig-guess limit)
   (let ((m -1)
 	(p guess)
@@ -624,9 +657,8 @@
 	  (math-reject-arg nil "*Newton's method failed to converge"))
       (list 'vec next expr-val))))
 
-(defvar math-root-vars [(var DUMMY var-DUMMY)])
 
-(defun math-find-root (expr var guess root-widen)
+(defun math-find-root (expr var guess math-root-widen)
   (if (eq (car-safe expr) 'vec)
       (let ((n (1- (length expr)))
 	    (calc-symbolic-mode nil)
@@ -710,7 +742,7 @@
 		    var-DUMMY guess
 		    vlow (math-evaluate-expr expr)
 		    vhigh vlow
-		    root-widen 'point)
+		    math-root-widen 'point)
 	    (if (eq (car guess) 'intv)
 		(progn
 		  (or (math-constp guess) (math-reject-arg guess 'constp))
@@ -752,6 +784,8 @@
 
 ;;; The following algorithms come from Numerical Recipes, chapter 10.
 
+(defvar math-min-vars [(var DUMMY var-DUMMY)])
+
 (defun math-min-eval (expr a)
   (if (Math-vectorp a)
       (let ((m -1))
@@ -894,7 +928,7 @@
 	(tol (list 'float 1 (- -1 prec)))
 	(zeps (list 'float 1 (- -5 prec)))
 	(e '(float 0 0))
-	u vu xm tol1 tol2 etemp p q r xv xw)
+	d u vu xm tol1 tol2 etemp p q r xv xw)
     (while (progn
 	     (setq xm (math-mul-float '(float 5 -1)
 				      (math-add-float a b))
@@ -1056,8 +1090,6 @@
     (list (math-add line-p xi) xi (nth 2 res))))
 
 
-(defvar math-min-vars [(var DUMMY var-DUMMY)])
-
 (defun math-find-minimum (expr var guess min-widen)
   (let* ((calc-symbolic-mode nil)
 	 (n 0)
@@ -1072,7 +1104,7 @@
 	(math-dimension-error))
     (while (setq var (cdr var) guess (cdr guess))
       (or (eq (car-safe (car var)) 'var)
-	  (math-reject-arg (car vg) "*Expected a variable"))
+	  (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"))
@@ -1314,6 +1346,12 @@
 
 
 ;;; Open Romberg method; "qromo" in section 4.4.
+
+;; The variable math-ninteg-temp is local to math-ninteg-romberg,
+;; but is used by math-ninteg-midpoint, which is used by 
+;; math-ninteg-romberg.
+(defvar math-ninteg-temp)
+
 (defun math-ninteg-romberg (func expr lo hi mode)
   (let ((curh '(float 1 0))
 	(h nil)
@@ -1321,7 +1359,7 @@
 	(j 0)
 	(ss nil)
 	(prec calc-internal-prec)
-	(integ-temp nil))
+	(math-ninteg-temp nil))
     (math-with-extra-prec 2
       ;; Limit on "j" loop must be 14 or less to keep "it" from overflowing.
       (or (while (and (null ss) (<= (setq j (1+ j)) 8))
@@ -1332,8 +1370,7 @@
 		  (if (math-lessp (math-abs (nth 1 res))
 				  (calcFunc-scf (math-abs (car res))
 						(- prec)))
-		      (setq math-ninteg-convergence j
-			    ss (car res)))))
+		      (setq ss (car res)))))
 	    (if (>= j 5)
 		(setq s (cdr s)
 		      h (cdr h)))
@@ -1354,15 +1391,15 @@
     res))
 
 
-(defun math-ninteg-midpoint (expr lo hi mode)    ; uses "integ-temp"
+(defun math-ninteg-midpoint (expr lo hi mode)    ; uses "math-ninteg-temp"
   (if (eq mode 'inf)
       (let ((math-infinite-mode t) temp)
 	(setq temp (math-div 1 lo)
 	      lo (math-div 1 hi)
 	      hi temp)))
-  (if integ-temp
-      (let* ((it3 (* 3 (car integ-temp)))
-	     (math-working-step-2 (* 2 (car integ-temp)))
+  (if math-ninteg-temp
+      (let* ((it3 (* 3 (car math-ninteg-temp)))
+	     (math-working-step-2 (* 2 (car math-ninteg-temp)))
 	     (math-working-step 0)
 	     (range (math-sub hi lo))
 	     (del (math-div range (math-float it3)))
@@ -1371,7 +1408,7 @@
 	     (x (math-add lo (math-mul '(float 5 -1) del)))
 	     (sum '(float 0 0))
 	     (j 0) temp)
-	(while (<= (setq j (1+ j)) (car integ-temp))
+	(while (<= (setq j (1+ j)) (car math-ninteg-temp))
 	  (setq math-working-step (1+ math-working-step)
 		temp (math-ninteg-evaluate expr x mode)
 		math-working-step (1+ math-working-step)
@@ -1379,17 +1416,17 @@
 						  expr (math-add x del2)
 						  mode)))
 		x (math-add x del3)))
-	(setq integ-temp (list it3
-			       (math-add (math-div (nth 1 integ-temp)
-						   '(float 3 0))
-					 (math-mul sum del)))))
-    (setq integ-temp (list 1 (math-mul
-			      (math-sub hi lo)
-			      (math-ninteg-evaluate
-			       expr
-			       (math-mul (math-add lo hi) '(float 5 -1))
-			       mode)))))
-  (nth 1 integ-temp))
+	(setq math-ninteg-temp (list it3
+                                     (math-add (math-div (nth 1 math-ninteg-temp)
+                                                         '(float 3 0))
+                                               (math-mul sum del)))))
+    (setq math-ninteg-temp (list 1 (math-mul
+                                    (math-sub hi lo)
+                                    (math-ninteg-evaluate
+                                     expr
+                                     (math-mul (math-add lo hi) '(float 5 -1))
+                                     mode)))))
+  (nth 1 math-ninteg-temp))
 
 
 
@@ -1427,13 +1464,21 @@
     (math-with-extra-prec 2
       (math-general-fit expr vars coefs data 'full))))
 
+;; The variables math-fit-first-var, math-fit-first-coef and
+;; math-fit-new-coefs are local to math-general-fit, but are used by
+;; calcFunc-fitvar, calcFunc-fitparam and calcFunc-fitdummy 
+;; (respectively), which are used by math-general-fit.
+(defvar math-fit-first-var)
+(defvar math-fit-first-coef)
+(defvar math-fit-new-coefs)
+
 (defun math-general-fit (expr vars coefs data mode)
   (let ((calc-simplify-mode nil)
 	(math-dummy-counter math-dummy-counter)
 	(math-in-fit 1)
 	(extended (eq mode 'full))
-	(first-coef math-dummy-counter)
-	first-var
+	(math-fit-first-coef math-dummy-counter)
+	math-fit-first-var
 	(plain-expr expr)
 	orig-expr
 	have-sdevs need-chisq chisq
@@ -1441,7 +1486,7 @@
 	(y-filter nil)
 	y-dummy
 	(coef-filters nil)
-	new-coefs
+	math-fit-new-coefs
 	(xy-values nil)
 	(weights nil)
 	(var-YVAL nil) (var-YVALX nil)
@@ -1496,8 +1541,8 @@
       (setq dummy (math-dummy-variable)
 	    expr (math-expr-subst expr (car p)
 				  (list 'calcFunc-fitparam
-					(- math-dummy-counter first-coef)))))
-    (setq first-var math-dummy-counter
+					(- math-dummy-counter math-fit-first-coef)))))
+    (setq math-fit-first-var math-dummy-counter
 	  p vars)
     (while (setq p (cdr p))
       (or (eq (car-safe (car p)) 'var)
@@ -1505,8 +1550,8 @@
       (setq dummy (math-dummy-variable)
 	    expr (math-expr-subst expr (car p)
 				  (list 'calcFunc-fitvar
-					(- math-dummy-counter first-var)))))
-    (if (< math-dummy-counter (+ first-var v))
+					(- math-dummy-counter math-fit-first-var)))))
+    (if (< math-dummy-counter (+ math-fit-first-var v))
 	(setq dummy (math-dummy-variable))) ; dependent variable may be unnamed
     (setq y-dummy dummy
 	  orig-expr expr)
@@ -1565,7 +1610,7 @@
 		  (setq sigmasqr (math-add (math-sqr (nth 2 xval))
 					   (or sigmasqr 0))
 			xval (nth 1 xval))))
-	    (set (nth 2 (aref math-dummy-vars (+ first-var j))) xval)
+	    (set (nth 2 (aref math-dummy-vars (+ math-fit-first-var j))) xval)
 	    (setq j (1+ j)))
 
 	  ;; Compute Y value for this data point.
@@ -1656,8 +1701,8 @@
 		    xy-values (cdr xy-values)))))
 
       ;; Convert coefficients back into original terms.
-      (setq new-coefs (copy-sequence beta))
-      (let* ((bp new-coefs)
+      (setq math-fit-new-coefs (copy-sequence beta))
+      (let* ((bp math-fit-new-coefs)
 	     (cp covar)
 	     (sigdat 1)
 	     (math-in-fit 3)
@@ -1673,9 +1718,9 @@
 			  (math-sqrt (math-mul (nth (setq j (1+ j))
 						    (car (setq cp (cdr cp))))
 					       sigdat))))))
-	(setq new-coefs (math-evaluate-expr coef-filters))
+	(setq math-fit-new-coefs (math-evaluate-expr coef-filters))
 	(if calc-fit-to-trail
-	    (let ((bp new-coefs)
+	    (let ((bp math-fit-new-coefs)
 		  (cp coefs)
 		  (vec nil))
 	      (while (setq bp (cdr bp) cp (cdr cp))
@@ -1695,7 +1740,7 @@
 		    (setq vec (cons (list 'calcFunc-fitparam n) vec)
 			  n (1- n)))
 		  vec)
-		(append (cdr new-coefs) (cdr vars))))
+		(append (cdr math-fit-new-coefs) (cdr vars))))
 
     ;; Package the result.
     (math-normalize
@@ -1719,20 +1764,20 @@
 (defun calcFunc-fitvar (x)
   (if (>= math-in-fit 2)
       (progn
-	(setq x (aref math-dummy-vars (+ first-var x -1)))
+	(setq x (aref math-dummy-vars (+ math-fit-first-var x -1)))
 	(or (calc-var-value (nth 2 x)) x))
     (math-reject-arg x)))
 
 (defun calcFunc-fitparam (x)
   (if (>= math-in-fit 2)
       (progn
-	(setq x (aref math-dummy-vars (+ first-coef x -1)))
+	(setq x (aref math-dummy-vars (+ math-fit-first-coef x -1)))
 	(or (calc-var-value (nth 2 x)) x))
     (math-reject-arg x)))
 
 (defun calcFunc-fitdummy (x)
   (if (= math-in-fit 3)
-      (nth x new-coefs)
+      (nth x math-fit-new-coefs)
     (math-reject-arg x)))
 
 (defun calcFunc-hasfitvars (expr)
@@ -1759,19 +1804,25 @@
     (sort (mapcar 'car vars)
 	  (function (lambda (x y) (string< (nth 1 x) (nth 1 y)))))))
 
+;; The variables math-all-vars-vars (the vars for math-all-vars) and
+;; math-all-vars-found are local to math-all-vars-in, but are used by 
+;; math-all-vars-rec which is called by math-all-vars-in.
+(defvar math-all-vars-vars)
+(defvar math-all-vars-found)
+
 (defun math-all-vars-in (expr)
-  (let ((vars nil)
-	found)
+  (let ((math-all-vars-vars nil)
+	math-all-vars-found)
     (math-all-vars-rec expr)
-    vars))
+    math-all-vars-vars))
 
 (defun math-all-vars-rec (expr)
   (if (Math-primp expr)
       (if (eq (car-safe expr) 'var)
 	  (or (math-const-var expr)
-	      (if (setq found (assoc expr vars))
-		  (setcdr found (1+ (cdr found)))
-		(setq vars (cons (cons expr 1) vars)))))
+	      (if (setq math-all-vars-found (assoc expr math-all-vars-vars))
+		  (setcdr math-all-vars-found (1+ (cdr math-all-vars-found)))
+		(setq math-all-vars-vars (cons (cons expr 1) math-all-vars-vars)))))
     (while (setq expr (cdr expr))
       (math-all-vars-rec (car expr)))))