aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorColin Walters2001-11-24 22:34:26 +0000
committerColin Walters2001-11-24 22:34:26 +0000
commit906bd0efe9cfb93cde4b6423b046971b1fce2390 (patch)
tree8cdbf159ed4676665cccd17f7576297c75fb1312
parent4fdb78a13a6d4539877b4d93676e16a0b1e37e2d (diff)
downloademacs-906bd0efe9cfb93cde4b6423b046971b1fce2390.tar.gz
emacs-906bd0efe9cfb93cde4b6423b046971b1fce2390.zip
(Commentary): Cleanup, and add logistic curve fitting suggestion from
Robert J. Chassell <bob@rattlesnake.com>.
-rw-r--r--lisp/ChangeLog3
-rw-r--r--lisp/calc/calc.el320
2 files changed, 177 insertions, 146 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 8de62adfeb4..128c512c5a7 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -3,6 +3,9 @@
3 * calc/calc-ext.el (calc-init-extensions): Update the rest of the 3 * calc/calc-ext.el (calc-init-extensions): Update the rest of the
4 autoload names to match files renamed on initial calc import. 4 autoload names to match files renamed on initial calc import.
5 5
6 * calc/calc.el (Commentary): Cleanup, and add logistic curve
7 fitting suggestion from Robert J. Chassell <bob@rattlesnake.com>.
8
62001-11-23 Colin Walters <walters@debian.org> 92001-11-23 Colin Walters <walters@debian.org>
7 10
8 * Makefile.in (finder_setwins, setwins): Include Calc again. 11 * Makefile.in (finder_setwins, setwins): Include Calc again.
diff --git a/lisp/calc/calc.el b/lisp/calc/calc.el
index fe6af71471e..4d7a11955b0 100644
--- a/lisp/calc/calc.el
+++ b/lisp/calc/calc.el
@@ -26,52 +26,183 @@
26 26
27;;; Commentary: 27;;; Commentary:
28 28
29;;; Calc is split into many files. This file is the main entry point. 29;; Calc is split into many files. This file is the main entry point.
30;;; This file includes autoload commands for various other basic Calc 30;; This file includes autoload commands for various other basic Calc
31;;; facilities. The more advanced features are based in calc-ext, which 31;; facilities. The more advanced features are based in calc-ext, which
32;;; in turn contains autoloads for the rest of the Calc files. This 32;; in turn contains autoloads for the rest of the Calc files. This
33;;; odd set of interactions is designed to make Calc's loading time 33;; odd set of interactions is designed to make Calc's loading time
34;;; be as short as possible when only simple calculations are needed. 34;; be as short as possible when only simple calculations are needed.
35 35
36;;; Suggested usage: 36;; Original author's address:
37;;; 37;; Dave Gillespie, daveg@synaptics.com, uunet!synaptx!daveg.
38;;; (autoload 'calc-dispatch "calc" "Emacs Calculator" t nil) 38;; Synaptics, Inc., 2698 Orchard Parkway, San Jose, CA 95134.
39;;; (global-set-key "\e#" 'calc-dispatch) 39;;
40;;; Type `M-# M-#' to start. 40;; The old address daveg@csvax.cs.caltech.edu will continue to
41;;; 41;; work for the foreseeable future.
42;;; The Calc home directory must be added to the Emacs load-path: 42;;
43;;; 43;; Bug reports and suggestions are always welcome! (Type M-x
44;;; (setq load-path (cons "/x/y/z/calc" load-path)) 44;; report-calc-bug to send them).
45;;; 45
46;;; where "/x/y/z/calc" represents the full name of the Calc home directory. 46;; All functions, macros, and Lisp variables defined here begin with one
47;;; 47;; of the prefixes "math", "Math", or "calc", with the exceptions of
48;;; See the file INSTALL for a complete list of recommeded autoload 48;; "full-calc", "full-calc-keypad", "another-calc", "quick-calc",
49;;; commands (though only calc-dispatch is absolutely necessary). 49;; "report-calc-bug", and "defmath". User-accessible variables begin
50 50;; with "var-".
51 51
52;;; Author's address: 52;;; TODO:
53;;; Dave Gillespie, daveg@synaptics.com, uunet!synaptx!daveg. 53
54;;; Synaptics, Inc., 2698 Orchard Parkway, San Jose, CA 95134. 54;; Fix rewrite mechanism to do less gratuitous rearrangement of terms.
55;;; 55;; Implement a pattern-based "refers" predicate.
56;;; The old address daveg@csvax.cs.caltech.edu will continue to 56;;
57;;; work for the foreseeable future. 57;; Make it possible to Undo a selection command.
58;;; 58;; Figure out how to allow selecting rows of matrices.
59;;; The latest version of Calc is always available from anonymous FTP 59;; If cursor was in selection before, move it after j n, j p, j L, etc.
60;;; on csvax.cs.caltech.edu [131.215.131.131]; look in ~ftp/pub/calc*. 60;; Consider reimplementing calc-delete-selection using rewrites.
61;;; It should also be available on prep.ai.mit.edu. 61;;
62;;; 62;; Implement line-breaking in non-flat compositions (is this desirable?).
63;;; Bug reports and suggestions are always welcome! 63;; Implement matrix formatting with multi-line components.
64 64;;
65 65;; Have "Z R" define a user command based on a set of rewrite rules.
66;;; All functions, macros, and Lisp variables defined here begin with one 66;; Support "incf" and "decf" in defmath definitions.
67;;; of the prefixes "math", "Math", or "calc", with the exceptions of 67;; Have defmath generate calls to calc-binary-op or calc-unary-op.
68;;; "full-calc", "full-calc-keypad", "another-calc", "quick-calc", 68;; Make some way to define algebraic functions using keyboard macros.
69;;; "report-calc-bug", and "defmath". User-accessible variables begin 69;;
70;;; with "var-". 70;; Allow calc-word-size=0 => Common Lisp-style signed bitwise arithmetic.
71;; Consider digamma function (and thus arb. prec. Euler's gamma constant).
72;; May as well make continued-fractions stuff available to the user.
73;;
74;; How about matrix eigenvalues, SVD, pseudo-inverse, etc.?
75;; Should cache matrix inverses as well as decompositions.
76;; If dividing by a non-square matrix, use least-squares automatically.
77;; Consider supporting matrix exponentials.
78;;
79;; Have ninteg detect and work around singularities at the endpoints.
80;; Use an adaptive subdivision algorithm for ninteg.
81;; Provide nsum and nprod to go along with ninteg.
82;;
83;; Handle TeX-mode parsing of \matrix{ ... } where ... contains braces.
84;; Support AmS-TeX's \{d,t,}frac, \{d,t,}binom notations.
85;; Format and parse sums and products in Eqn and Math modes.
86;;
87;; Get math-read-big-expr to read sums, products, etc.
88;; Change calc-grab-region to use math-read-big-expr.
89;; Have a way to define functions using := in Embedded Mode.
90;;
91;; Support polar plotting with GNUPLOT.
92;; Make a calc-graph-histogram function.
93;;
94;; Replace hokey formulas for complex functions with formulas designed
95;; to minimize roundoff while maintaining the proper branch cuts.
96;; Test accuracy of advanced math functions over whole complex plane.
97;; Extend Bessel functions to provide arbitrary precision.
98;; Extend advanced math functions to handle error forms and intervals.
99;; Provide a better implementation for math-sin-cos-raw.
100;; Provide a better implementation for math-hypot.
101;; Provide a better implementation for math-make-frac.
102;; Provide a better implementation for calcFunc-prfac.
103;; Provide a better implementation for calcFunc-factor.
104;;
105;; Provide more examples in the tutorial section of the manual.
106;; Cover in the tutorial: simplification modes, declarations,
107;; bitwise stuff, selections, matrix mapping, financial functions.
108;; Provide more Lisp programming examples in the manual.
109;; Finish the Internals section of the manual (and bring it up to date).
110;;
111;; Tim suggests adding spreadsheet-like features.
112;; Implement language modes for Gnuplot, Lisp, Ada, APL, ...?
113;;
114;; For atan series, if x > tan(pi/12) (about 0.268) reduce using the identity
115;; atan(x) = atan((x * sqrt(3) - 1) / (sqrt(3) + x)) + pi/6.
116;;
117;; A better integration algorithm:
118;; Use breadth-first instead of depth-first search, as follows:
119;; The integral cache allows unfinished integrals in symbolic notation
120;; on the righthand side. An entry with no unfinished integrals on the
121;; RHS is "complete"; references to it elsewhere are replaced by the
122;; integrated value. More than one cache entry for the same integral
123;; may exist, though if one becomes complete, the others may be deleted.
124;; The integrator works by using every applicable rule (such as
125;; substitution, parts, linearity, etc.) to generate possible righthand
126;; sides, all of which are entered into the cache. Now, as long as the
127;; target integral is not complete (and the time limit has not run out)
128;; choose an incomplete integral from the cache and, for every integral
129;; appearing in its RHS's, add those integrals to the cache using the
130;; same substitition, parts, etc. rules. The cache should be organized
131;; as a priority queue, choosing the "simplest" incomplete integral at
132;; each step, or choosing randomly among equally simple integrals.
133;; Simplicity equals small size, and few steps removed from the original
134;; target integral. Note that when the integrator finishes, incomplete
135;; integrals can be left in the cache, so the algorithm can start where
136;; it left off if another similar integral is later requested.
137;; Breadth-first search would avoid the nagging problem of, e.g., whether
138;; to use parts or substitution first, and which decomposition is best.
139;; All are tried, and any path that diverges will quickly be put on the
140;; back burner by the priority queue.
141;; Note: Probably a good idea to call math-simplify-extended before
142;; measuring a formula's simplicity.
143
144;; From: "Robert J. Chassell" <bob@rattlesnake.com>
145;; Subject: Re: fix for `Cannot open load file: calc-alg-3'
146;; To: walters@debian.org
147;; Date: Sat, 24 Nov 2001 21:44:21 +0000 (UTC)
148;;
149;; Could you add logistic curve fitting to the current list?
150;;
151;; (I guess the key binding for a logistic curve would have to be `s'
152;; since a logistic curve is an `s' curve; both `l' and `L' are already
153;; taken for logarithms.)
154;;
155;; Here is the current list for curve fitting;
156;;
157;; `1'
158;; Linear or multilinear. a + b x + c y + d z.
159;;
160;; `2-9'
161;; Polynomials. a + b x + c x^2 + d x^3.
162;;
163;; `e'
164;; Exponential. a exp(b x) exp(c y).
165;;
166;; `E'
167;; Base-10 exponential. a 10^(b x) 10^(c y).
168;;
169;; `x'
170;; Exponential (alternate notation). exp(a + b x + c y).
171;;
172;; `X'
173;; Base-10 exponential (alternate). 10^(a + b x + c y).
174;;
175;; `l'
176;; Logarithmic. a + b ln(x) + c ln(y).
177;;
178;; `L'
179;; Base-10 logarithmic. a + b log10(x) + c log10(y).
180;;
181;; `^'
182;; General exponential. a b^x c^y.
183;;
184;; `p'
185;; Power law. a x^b y^c.
186;;
187;; `q'
188;; Quadratic. a + b (x-c)^2 + d (x-e)^2.
189;;
190;; `g'
191;; Gaussian. (a / b sqrt(2 pi)) exp(-0.5*((x-c)/b)^2).
192;;
193;;
194;; Logistic curves are used a great deal in ecology, and in predicting
195;; human actions, such as use of different kinds of energy in a country
196;; (wood, coal, oil, natural gas, etc.) or the number of scientific
197;; papers a person publishes, or the number of movies made.
198;;
199;; (The less information on which to base the curve, the higher the error
200;; rate. Theodore Modis ran some Monte Carlo simulations and produced
201;; what may be useful set of confidence levels for different amounts of
202;; initial information.)
71 203
72;;; Code: 204;;; Code:
73 205
74
75(provide 'calc) 206(provide 'calc)
76(require 'calc-macs) 207(require 'calc-macs)
77 208
@@ -112,111 +243,8 @@ This can safely be nil as long as the Calc files are on the load-path.")
112;; If NIL, only DEL itself is mapped to calc-pop. 243;; If NIL, only DEL itself is mapped to calc-pop.
113(defvar calc-scan-for-dels t) 244(defvar calc-scan-for-dels t)
114 245
115
116
117(defvar calc-extensions-loaded nil) 246(defvar calc-extensions-loaded nil)
118 247
119
120;;; IDEAS:
121;;;
122;;; Fix rewrite mechanism to do less gratuitous rearrangement of terms.
123;;; Implement a pattern-based "refers" predicate.
124;;;
125;;; Make it possible to Undo a selection command.
126;;; Figure out how to allow selecting rows of matrices.
127;;; If cursor was in selection before, move it after j n, j p, j L, etc.
128;;; Consider reimplementing calc-delete-selection using rewrites.
129;;;
130;;; Implement line-breaking in non-flat compositions (is this desirable?).
131;;; Implement matrix formatting with multi-line components.
132;;;
133;;; Have "Z R" define a user command based on a set of rewrite rules.
134;;; Support "incf" and "decf" in defmath definitions.
135;;; Have defmath generate calls to calc-binary-op or calc-unary-op.
136;;; Make some way to define algebraic functions using keyboard macros.
137;;;
138;;; Allow calc-word-size=0 => Common Lisp-style signed bitwise arithmetic.
139;;; Consider digamma function (and thus arb. prec. Euler's gamma constant).
140;;; May as well make continued-fractions stuff available to the user.
141;;;
142;;; How about matrix eigenvalues, SVD, pseudo-inverse, etc.?
143;;; Should cache matrix inverses as well as decompositions.
144;;; If dividing by a non-square matrix, use least-squares automatically.
145;;; Consider supporting matrix exponentials.
146;;;
147;;; Have ninteg detect and work around singularities at the endpoints.
148;;; Use an adaptive subdivision algorithm for ninteg.
149;;; Provide nsum and nprod to go along with ninteg.
150;;;
151;;; Handle TeX-mode parsing of \matrix{ ... } where ... contains braces.
152;;; Support AmS-TeX's \{d,t,}frac, \{d,t,}binom notations.
153;;; Format and parse sums and products in Eqn and Math modes.
154;;;
155;;; Get math-read-big-expr to read sums, products, etc.
156;;; Change calc-grab-region to use math-read-big-expr.
157;;; Have a way to define functions using := in Embedded Mode.
158;;;
159;;; Support polar plotting with GNUPLOT.
160;;; Make a calc-graph-histogram function.
161;;;
162;;; Replace hokey formulas for complex functions with formulas designed
163;;; to minimize roundoff while maintaining the proper branch cuts.
164;;; Test accuracy of advanced math functions over whole complex plane.
165;;; Extend Bessel functions to provide arbitrary precision.
166;;; Extend advanced math functions to handle error forms and intervals.
167;;; Provide a better implementation for math-sin-cos-raw.
168;;; Provide a better implementation for math-hypot.
169;;; Provide a better implementation for math-make-frac.
170;;; Provide a better implementation for calcFunc-prfac.
171;;; Provide a better implementation for calcFunc-factor.
172;;;
173;;; Provide more examples in the tutorial section of the manual.
174;;; Cover in the tutorial: simplification modes, declarations,
175;;; bitwise stuff, selections, matrix mapping, financial functions.
176;;; Provide more Lisp programming examples in the manual.
177;;; Finish the Internals section of the manual (and bring it up to date).
178;;;
179;;; Tim suggests adding spreadsheet-like features.
180;;; Implement language modes for Gnuplot, Lisp, Ada, APL, ...?
181;;;
182
183
184;;; For atan series, if x > tan(pi/12) (about 0.268) reduce using the identity
185;;; atan(x) = atan((x * sqrt(3) - 1) / (sqrt(3) + x)) + pi/6.
186
187
188;;; A better integration algorithm:
189;;; Use breadth-first instead of depth-first search, as follows:
190;;; The integral cache allows unfinished integrals in symbolic notation
191;;; on the righthand side. An entry with no unfinished integrals on the
192;;; RHS is "complete"; references to it elsewhere are replaced by the
193;;; integrated value. More than one cache entry for the same integral
194;;; may exist, though if one becomes complete, the others may be deleted.
195;;; The integrator works by using every applicable rule (such as
196;;; substitution, parts, linearity, etc.) to generate possible righthand
197;;; sides, all of which are entered into the cache. Now, as long as the
198;;; target integral is not complete (and the time limit has not run out)
199;;; choose an incomplete integral from the cache and, for every integral
200;;; appearing in its RHS's, add those integrals to the cache using the
201;;; same substitition, parts, etc. rules. The cache should be organized
202;;; as a priority queue, choosing the "simplest" incomplete integral at
203;;; each step, or choosing randomly among equally simple integrals.
204;;; Simplicity equals small size, and few steps removed from the original
205;;; target integral. Note that when the integrator finishes, incomplete
206;;; integrals can be left in the cache, so the algorithm can start where
207;;; it left off if another similar integral is later requested.
208;;; Breadth-first search would avoid the nagging problem of, e.g., whether
209;;; to use parts or substitution first, and which decomposition is best.
210;;; All are tried, and any path that diverges will quickly be put on the
211;;; back burner by the priority queue.
212;;; Note: Probably a good idea to call math-simplify-extended before
213;;; measuring a formula's simplicity.
214
215
216
217
218
219
220;; Calculator stack. 248;; Calculator stack.
221;; Entries are 3-lists: Formula, Height (in lines), Selection (or nil). 249;; Entries are 3-lists: Formula, Height (in lines), Selection (or nil).
222(defvar calc-stack '((top-of-stack 1 nil))) 250(defvar calc-stack '((top-of-stack 1 nil)))