Clean up implementation of printing options table
[maxima.git] / share / pdiff / pdiff-doc.tex
blobaf0a5e2cf1453a90ba16e74019a22ecc41646009
1 % TeX code generated by batTeX. Don't edit this file; edit the
2 % input file pdiff.tex instead.
3 \documentclass[12pt]{article}
4 \usepackage{mathptm}
5 \usepackage{battex}
6 \usepackage{color}
8 \title{A positional derivative package for Maxima}
9 \author{Barton Willis \\
10 University of Nebraska at Kearney \\
11 Kearney Nebraska}
12 \date{September 10, 2002\footnote{With minor updates November, 2006.}}
14 \begin{document}
16 \maketitle
18 \subsection*{Introduction}
20 \noindent Working with derivatives of unknown functions\footnote{By
21 {\em unknown function\/}, we mean a function that isn't bound to a formula and
22 that has a derivative that isn't known to Maxima.} can be cumbersome in Maxima.
23 If we want, for example, the first order Taylor polynomial of
24 $f(x + x^2)$ about $x = 1$, we get
27 \begin{mcline}{c1}
28 taylor(f(x + x^2),x,1,1);
29 \end{mcline}
33 \begin{mdline}{d1}
34 f\left(2\right)+\left(\left.{{d}\over{d\,x}}\,f\left(x^2+x\right)
35 \right|_{x=1}\right)\,\left(x-1\right)+\cdots
36 \end{mdline}
38 \noindent To ``simplify'' the Taylor polynomial, we must assign a gradient to $f$
40 \begin{mcline}{c2}
41 gradef(f(x),df(x))$
42 \end{mcline}
44 \begin{mcline}{c3}
45 taylor(f(x+x^2),x,1,1);
46 \end{mcline}
48 \begin{mdline}{d3}
49 f\left(2\right)+3\,df\left(2\right)\,\left(x-1\right)+\cdots
50 \end{mdline}
52 This method works well for simple problems, but it
53 is tedious for functions of several variables or high order
54 derivatives. The positional derivative package {\tt pdiff} gives
55 an alternative to using {\tt gradef} when working with derivatives
56 of unknown functions.
58 \subsection*{Usage}
60 To use the positional derivative package, first load it from the Maxima input prompt.
62 \begin{mcline}{c1}
63 load(pdiff)$
64 \end{mcline}
67 \noindent Loading
68 {\tt pdiff.lisp} sets the option variable {\tt use\_pdiff} to true;
69 when {\tt use\_diff} is true, Maxima will
70 indicate derivatives of unknown functions positionally. To illustrate,
71 the first three derivatives of $f$ are
74 \begin{mcline}{c2}
75 [diff(f(x),x),
76 diff(f(x),x,2),
77 diff(f(x),x,3)];
78 \end{mcline}
82 \begin{mdline}{d2}
83 \left[ f_{\left(1\right)}(x),f_{\left(2\right)}(x),f_{\left(3
84 \right)}(x) \right]
85 \end{mdline}
87 The subscript indicates the order of the derivative; since $f$ is a function of
88 one variable, the subscript has only one index. When a function has more
89 than one variable, the subscript has an index for each variable
92 \begin{mcline}{c3}
93 [diff(f(x,y),x,0,y,1), diff(f(y,x),x,0,y,1)];
94 \end{mcline}
96 \begin{mdline}{d3}
97 \left[ f_{\left(0,1\right)}(x,y),f_{\left(1,0\right)}(y,x)
98 \right]
99 \end{mdline}
101 \noindent Setting {\tt use\_pdiff} to false (either locally or globally) inhibits
102 derivatives from begin computed positionally
105 \begin{mcline}{c4}
106 diff(f(x,x^2),x), use_pdiff : false;
107 \end{mcline}
111 \begin{mdline}{d4}
112 {{d}\over{d\,x}}\,f\left(x,x^2\right)
113 \end{mdline}
115 \begin{mcline}{c5}
116 diff(f(x,x^2),x), use_pdiff : true;
117 \end{mcline}
121 \begin{mdline}{d5}
122 f_{\left(1,0\right)}(x,x^2)+2\,x\,f_{\left(0,1\right)}(x,x^2)
123 \end{mdline}
126 Taylor polynomials of unknown functions can be found without using
127 {\tt gradef}. An example
130 \begin{mcline}{c6}
131 taylor(f(x+x^2),x,1,2);
132 \end{mcline}
136 \begin{mdline}{d6}
137 f\left(2\right)+3\,f_{\left(1\right)}(2)\,\left(x-1\right)+{{
138 \left(2\,f_{\left(1\right)}(2)+9\,f_{\left(2\right)}(2)\right)\,
139 \left(x-1\right)^2}\over{2}}+\cdots
140 \end{mdline}
142 \noindent Additionally, we can verify that $ y = f(x-c \, t) + g(x+c \,t)$ is
143 a solution to a wave equation without using {\tt gradef}
146 \begin{mcline}{c7}
147 y : f(x-c*t) + g(x+c*t)$
148 \end{mcline}
150 \begin{mcline}{c8}
151 ratsimp(diff(y,t,2) - c^2 * diff(y,x,2));
152 \end{mcline}
156 \begin{mdline}{d8}
158 \end{mdline}
160 \begin{mcline}{c9}
161 remvalue(y)$
162 \end{mcline}
164 \noindent Expressions involving positional derivatives can be differentiated
166 \begin{mcline}{c10}
167 e : diff(f(x,y),x);
168 \end{mcline}
171 \begin{mdline}{d10}
172 f_{\left(1,0\right)}(x,y)
173 \end{mdline}
175 \begin{mcline}{c11}
176 diff(e,y);
177 \end{mcline}
181 \begin{mdline}{d11}
182 f_{\left(1,1\right)}(x,y)
183 \end{mdline}
186 \noindent The chain rule is applied when needed
189 \begin{mcline}{c12}
190 [diff(f(x^2),x), diff(f(g(x)),x)];
191 \end{mcline}
195 \begin{mdline}{d12}
196 \left[ 2\,x\,f_{\left(1\right)}(x^2),g_{\left(1\right)}(x)\,f_{
197 \left(1\right)}(g\left(x\right)) \right]
198 \end{mdline}
201 The positional derivative package doesn't alter the way known functions
202 are differentiated
205 \begin{mcline}{c13}
206 diff(exp(-x^2),x);
207 \end{mcline}
211 \begin{mdline}{d13}
212 -2\,x\,e^ {- x^2 }
213 \end{mdline}
216 \noindent To convert positional derivatives to standard Maxima derivatives,
217 use {\tt convert\_to\_diff}
220 \begin{mcline}{c14}
221 e : [diff(f(x),x), diff(f(x,y),x,1,y,1)];
222 \end{mcline}
226 \begin{mdline}{d14}
227 \left[ f_{\left(1\right)}(x),f_{\left(1,1\right)}(x,y) \right]
228 \end{mdline}
230 \begin{mcline}{c15}
231 e : convert_to_diff(e);
232 \end{mcline}
236 \begin{mdline}{d15}
237 \left[ {{d}\over{d\,x}}\,f\left(x\right),{{d^2}\over{d\,y\,d\,x}}
238 \,f\left(x,y\right) \right]
239 \end{mdline}
241 \noindent To convert back to a positional derivative, use {\tt ev} with {\tt diff}
242 as an argument
245 \begin{mcline}{c16}
246 ev(e,diff);
247 \end{mcline}
251 \begin{mdline}{d16}
252 \left[ f_{\left(1\right)}(x),f_{\left(1,1\right)}(x,y) \right]
253 \end{mdline}
255 \noindent Conversion to standard derivatives sometimes requires the
256 introduction of a dummy variable. Here's an example
259 \begin{mcline}{c17}
260 e : diff(f(x,y),x,1,y,1);
261 \end{mcline}
265 \begin{mdline}{d17}
266 f_{\left(1,1\right)}(x,y)
267 \end{mdline}
269 \begin{mcline}{c18}
270 e : subst(p(s),y,e);
271 \end{mcline}
275 \begin{mdline}{d18}
276 f_{\left(1,1\right)}(x,p\left(s\right))
277 \end{mdline}
279 \begin{mcline}{c19}
280 e : convert_to_diff(e);
281 \end{mcline}
285 \begin{mdline}{d19}
286 \left.{{d^2}\over{d\,\%x_0\,d\,x}}\,f\left(x,\%x_0\right)\right|_{
287 \left[ \%x_0=p\left(s\right) \right] }
288 \end{mdline}
290 Dummy variables have the form ci, where i=0,1,2\dots and c is the
291 value of the option variable {\tt dummy\_char}. The default value
292 for {\tt dummy\_char} is {\tt \%x}. If a user variable conflicts with a
293 dummy variable, the conversion process can give an
294 incorrect value. To convert the previous expression back to a positional derivative,
295 use {\tt ev} with {\tt diff} and {\tt at} as arguments
298 \begin{mcline}{c20}
299 ev(e,diff,at);
300 \end{mcline}
304 \begin{mdline}{d20}
305 f_{\left(1,1\right)}(x,p\left(s\right))
306 \end{mdline}
309 Maxima correctly evaluates expressions involving positional derivatives
310 if a formula is later given to the function. (Thus converting an unknown
311 function into a known one.) Here is an example; let
314 \begin{mcline}{c21}
315 e : diff(f(x^2),x);
316 \end{mcline}
320 \begin{mdline}{d21}
321 2\,x\,f_{\left(1\right)}(x^2)
322 \end{mdline}
324 \noindent Now, give $f$ a formula
327 \begin{mcline}{c22}
328 f(x) := x^5;
329 \end{mcline}
333 \begin{mdline}{d22}
334 f\left(x\right):=x^5
335 \end{mdline}
337 \noindent and evaluate {\tt e}
340 \begin{mcline}{c23}
341 ev(e);
342 \end{mcline}
346 \begin{mdline}{d23}
347 10\,x^9
348 \end{mdline}
351 \noindent This result is the same as
355 \begin{mcline}{c24}
356 diff(f(x^2),x);
357 \end{mcline}
361 \begin{mdline}{d24}
362 10\,x^9
363 \end{mdline}
365 \noindent In this calculation, Maxima first evaluates $f(x)$ to $x^{10}$ and then
366 does the derivative. Additionally, we can substitute a value for $x$
367 before evaluating
371 \begin{mcline}{c25}
372 ev(subst(2,x,e));
373 \end{mcline}
377 \begin{mdline}{d25}
378 5120
379 \end{mdline}
382 \noindent We can duplicate this with
386 \begin{mcline}{c26}
387 subst(2,x,diff(f(x^2),x));
388 \end{mcline}
392 \begin{mdline}{d26}
393 5120
394 \end{mdline}
396 \begin{mcline}{c27}
397 remfunction(f);
398 \end{mcline}
402 \begin{mdline}{d27}
403 \left[ f \right]
404 \end{mdline}
407 \noindent We can also evaluate a positional derivative using a local
408 function definition
411 \begin{mcline}{c28}
412 e : diff(g(x),x);
413 \end{mcline}
417 \begin{mdline}{d28}
418 g_{\left(1\right)}(x)
419 \end{mdline}
421 \begin{mcline}{c29}
422 e, g(x) := sqrt(x);
423 \end{mcline}
427 \begin{mdline}{d29}
428 {{1}\over{2\,\sqrt{x}}}
429 \end{mdline}
431 \begin{mcline}{c30}
432 e, g = sqrt;
433 \end{mcline}
437 \begin{mdline}{d30}
438 {{1}\over{2\,\sqrt{x}}}
439 \end{mdline}
441 \begin{mcline}{c31}
442 e, g = h;
443 \end{mcline}
447 \begin{mdline}{d31}
448 h_{\left(1\right)}(x)
449 \end{mdline}
451 \begin{mcline}{c32}
452 e, g = lambda([t],t^2);
453 \end{mcline}
457 \begin{mdline}{d32}
458 2\,x
459 \end{mdline}
462 \subsection*{The {\tt pderivop} function}
464 If $F$ is an atom and $i_1, i_2, \dots i_n$ are nonnegative
465 integers, then $ \mbox{pderivop}(F,i_1,i_2, \dots i_n)$, is the
466 function that has the formula
468 \frac{\partial^{i_1 + i_2 + \cdots + i_n}}{\partial x_1^{i_1}
469 \partial x_2^{i_2} \cdots \partial x_n^{i_n}} F(x_1,x_2, \dots x_n).
471 If any of the derivative arguments are not nonnegative integers,
472 we'll get an error
475 \begin{mcline}{c33}
476 pderivop(f,2,-1);
477 \end{mcline}
479 Each derivative order must be a nonnegative integer
482 \noindent The {\tt pderivop} function can be composed with itself
484 \begin{mcline}{c34}
485 pderivop(pderivop(f,3,4),1,2);
486 \end{mcline}
490 \begin{mdline}{d34}
491 f_{\left(4,6\right)}
492 \end{mdline}
493 \noindent If the number of derivative arguments between two calls
494 to {\tt pderivop} isn't the same, Maxima gives an error
496 \begin{mcline}{c35}
497 pderivop(pderivop(f,3,4),1);
498 \end{mcline}
500 The function f expected 2 derivative argument(s), but it received 1
503 When {\tt pderivop} is applied to a known function, the result is
504 a lambda form\footnote{If you repeat theses calculations, you
505 may get a different prefix for the {\tt gensym} variables.}
507 \begin{mcline}{c37}
508 f(x) := x^2;
509 \end{mcline}
513 \begin{mdline}{d37}
514 f\left(x\right):=x^2
515 \end{mdline}
517 \begin{mcline}{c38}
518 df : pderivop(f,1);
519 \end{mcline}
523 \begin{mdline}{d38}
524 \lambda\left(\left[ Q_{1253} \right] ,2\,Q_{1253}\right)
525 \end{mdline}
527 \begin{mcline}{c39}
528 apply(df,[z]);
529 \end{mcline}
533 \begin{mdline}{d39}
534 2\,z
535 \end{mdline}
537 \begin{mcline}{c40}
538 ddf : pderivop(f,2);
539 \end{mcline}
543 \begin{mdline}{d40}
544 \lambda\left(\left[ Q_{1254} \right] ,2\right)
545 \end{mdline}
547 \begin{mcline}{c41}
548 apply(ddf,[10]);
549 \end{mcline}
553 \begin{mdline}{d41}
555 \end{mdline}
557 \begin{mcline}{c42}
558 remfunction(f);
559 \end{mcline}
563 \begin{mdline}{d42}
564 \left[ f \right]
565 \end{mdline}
568 If the first argument to {\tt pderivop} is a lambda form, the
569 result is another lambda form
573 \begin{mcline}{c43}
574 f : pderivop(lambda([x],x^2),1);
575 \end{mcline}
579 \begin{mdline}{d43}
580 \lambda\left(\left[ Q_{1255} \right] ,2\,Q_{1255}\right)
581 \end{mdline}
583 \begin{mcline}{c44}
584 apply(f,[a]);
585 \end{mcline}
589 \begin{mdline}{d44}
590 2\,a
591 \end{mdline}
593 \begin{mcline}{c45}
594 f : pderivop(lambda([x],x^2),2);
595 \end{mcline}
599 \begin{mdline}{d45}
600 \lambda\left(\left[ Q_{1256} \right] ,2\right)
601 \end{mdline}
603 \begin{mcline}{c46}
604 apply(f,[a]);
605 \end{mcline}
609 \begin{mdline}{d46}
611 \end{mdline}
613 \begin{mcline}{c47}
614 f : pderivop(lambda([x],x^2),3);
615 \end{mcline}
619 \begin{mdline}{d47}
620 \lambda\left(\left[ Q_{1257} \right] ,0\right)
621 \end{mdline}
623 \begin{mcline}{c48}
624 apply(f,[a]);
625 \end{mcline}
629 \begin{mdline}{d48}
631 \end{mdline}
633 \begin{mcline}{c49}
634 remvalue(f)$
635 \end{mcline}
638 If the first argument to {\tt pderivop} isn't an atom or
639 a lambda form, Maxima will signal an error
643 \begin{mcline}{c50}
644 pderivop(f+g,1);
645 \end{mcline}
647 Non-atom g+f used as a function
650 You may use {\tt tellsimpafter} together with {\tt pderivop} to
651 give a value to a derivative of a function at a point; an
652 example
655 \begin{mcline}{c51}
656 tellsimpafter(pderivop(f,1)(1),1)$
657 \end{mcline}
659 \begin{mcline}{c52}
660 tellsimpafter(pderivop(f,2)(1),2)$
661 \end{mcline}
663 \begin{mcline}{c53}
664 diff(f(x),x,2) + diff(f(x),x)$
665 \end{mcline}
667 \begin{mcline}{c54}
668 subst(1,x,%);
669 \end{mcline}
671 \begin{mdline}{d54}
673 \end{mdline}
675 This technique works for functions of several variables as well
677 \begin{mcline}{c55}
678 kill(rules)$
679 \end{mcline}
682 \begin{mcline}{c56}
683 tellsimpafter(pderivop(f,1,0)(0,0),a)$
684 \end{mcline}
686 \begin{mcline}{c57}
687 tellsimpafter(pderivop(f,0,1)(0,0),b)$
688 \end{mcline}
690 \begin{mcline}{c58}
691 sublis([x = 0, y = 0], diff(f(x,y),x) + diff(f(x,y),y));
692 \end{mcline}
696 \begin{mdline}{d58}
698 \end{mdline}
701 \subsection*{\TeX{}-ing positional derivatives}
703 Several option variables control how positional derivatives
704 are converted to \TeX{}. When the option variable
705 {\tt tex\_uses\_prime\_for\_derivatives} is true (default false),
706 makes functions of one variable \TeX{} as superscripted primes
709 \begin{mcline}{c59}
710 tex_uses_prime_for_derivatives : true$
711 \end{mcline}
713 \begin{mcline}{c60}
714 tex(makelist(diff(f(x),x,i),i,1,3))$
715 \end{mcline}
717 \begin{mdline}{d60}
718 \left[ f^{\prime}(x),f^{\prime\prime}(x),f^{\prime\prime\prime}(x)
719 \right]
720 \end{mdline}
722 \begin{mcline}{c61}
723 tex(makelist(pderivop(f,i),i,1,3))$
724 \end{mcline}
727 \left[ f^{\prime},f^{\prime\prime},f^{\prime\prime\prime} \right]
730 When the derivative order exceeds the value of the option
731 variable {\tt tex\_prime\_limit}, (default 3)
732 derivatives are indicated with parenthesis delimited superscripts
735 \begin{mcline}{c62}
736 tex(makelist(pderivop(f,i),i,1,5)), tex_prime_limit : 0$
737 \end{mcline}
740 \left[ f^{(1)},f^{(2)},f^{(3)},f^{(4)},f^{(5)} \right]
743 \begin{mcline}{c63}
744 tex(makelist(pderivop(f,i),i,1,5)), tex_prime_limit : 5$
745 \end{mcline}
749 \left[ f^{\prime},f^{\prime\prime},f^{\prime\prime\prime},f^{\prime
750 \prime\prime\prime},f^{\prime\prime\prime\prime\prime} \right]
753 The value of {\tt tex\_uses\_prime\_for\_derivatives} doesn't change the way
754 functions of two or more variables are converted to \TeX{}.
757 \begin{mcline}{c64}
758 tex(pderivop(f,2,1));
759 \end{mcline}
762 f_{\left(2,1\right)}
767 When the option variable {\tt tex\_uses\_named\_subscripts\_for\_derivatives}
768 (default false) is true, a derivative with respect to the i-th argument is
769 indicated by a subscript that is the i-th element of the option variable
770 {\tt tex\_diff\_var\_names}. An example is the clearest way to
771 describe this.
774 \begin{mcline}{c65}
775 tex_uses_named_subscripts_for_derivatives : true$
776 \end{mcline}
778 \begin{mcline}{c66}
779 tex_diff_var_names;
780 \end{mcline}
784 \begin{mdline}{d66}
785 \left[ x,y,z \right]
786 \end{mdline}
788 \begin{mcline}{c67}
790 tex([pderivop(f,1,0), pderivop(f,0,1), pderivop(f,1,1), pderivop(f,2,0)]);
791 \end{mcline}
793 $$\left[ f_{x},f_{y},f_{xy},f_{xx} \right] $$
796 \begin{mcline}{c68}
797 tex_diff_var_names : [a,b];
798 \end{mcline}
802 \begin{mdline}{d68}
803 \left[ a,b \right]
804 \end{mdline}
806 \begin{mcline}{c69}
808 tex([pderivop(f,1,0), pderivop(f,0,1), pderivop(f,1,1), pderivop(f,2,0)]);
809 \end{mcline}
811 $$\left[ f_{a},f_{b},f_{ab},f_{aa} \right] $$
815 \begin{mcline}{c70}
816 tex_diff_var_names : [x,y,z];
817 \end{mcline}
821 \begin{mdline}{d70}
822 \left[ x,y,z \right]
823 \end{mdline}
825 \begin{mcline}{c71}
826 tex([diff(f(x,y),x), diff(f(y,x),y)]);
827 \end{mcline}
829 $$\left[ f_{x}(x,y),f_{x}(y,x) \right] $$
833 When the derivative order exceeds {tt tex\_prime\_limit}, revert to the default
834 method for converting to \TeX{}
837 \begin{mcline}{c72}
838 tex(diff(f(x,y,z),x,1,y,1,z,1)), tex_prime_limit : 4$
839 \end{mcline}
842 f_{xyz}(x,y,z)
845 \begin{mcline}{c73}
846 tex(diff(f(x,y,z),x,1,y,1,z,1)), tex_prime_limit : 1$
847 \end{mcline}
849 $$f_{\left(1,1,1\right)}(x,y,z)$$
850 \subsection*{A longer example}
852 We'll use the positional derivative package to change the independent
853 variable of the differential equation
856 \begin{mcline}{c74}
857 de : 4*x^2*'diff(y,x,2) + 4*x*'diff(y,x,1) + (x-1)*y = 0;
858 \end{mcline}
862 \begin{mdline}{d74}
863 4\,x^2\,\left({{d^2}\over{d\,x^2}}\,y\right)+4\,x\,\left({{d
864 }\over{d\,x}}\,y\right)+\left(x-1\right)\,y=0
865 \end{mdline}
867 With malice aforethought, we'll assume a solution of the form
868 $ y = g(x^n)$, where $n$ is a number. Substituting $y \rightarrow g(x^n)$
869 in the differential equation gives
872 \begin{mcline}{c75}
873 de : subst(g(x^n),y,de);
874 \end{mcline}
878 \begin{mdline}{d75}
879 4\,x^2\,\left({{d^2}\over{d\,x^2}}\,g\left(x^{n}\right)\right)+4\,
880 x\,\left({{d}\over{d\,x}}\,g\left(x^{n}\right)\right)+\left(x-1
881 \right)\,g\left(x^{n}\right)=0
882 \end{mdline}
884 \begin{mcline}{c76}
885 de : ev(de, diff);
886 \end{mcline}
890 \begin{mdline}{d76}
891 4\,x^2\,\left(n^2\,x^{2\,n-2}\,g^{\prime\prime}(x^{n})+\left(n-1
892 \right)\,n\,x^{n-2}\,g^{\prime}(x^{n})\right)+4\,n\,x^{n}\,g^{\prime
893 }(x^{n})+\left(x-1\right)\,g\left(x^{n}\right)=0
894 \end{mdline}
896 Now let $x \rightarrow t^{1/n}$
899 \begin{mcline}{c77}
900 de : radcan(subst(x^(1/n),x, de));
901 \end{mcline}
905 \begin{mdline}{d77}
906 4\,n^2\,x^2\,g^{\prime\prime}(x)+4\,n^2\,x\,g^{\prime}(x)+\left(x
907 ^{{{1}\over{n}}}-1\right)\,g\left(x\right)=0
908 \end{mdline}
910 Setting $n \rightarrow 1/2$, we recognize that $g$ is the order 1 Bessel
911 equation
914 \begin{mcline}{c78}
915 subst(1/2,n, de);
916 \end{mcline}
920 \begin{mdline}{d78}
921 x^2\,g^{\prime\prime}(x)+x\,g^{\prime}(x)+\left(x^2-1\right)\,g
922 \left(x\right)=0
923 \end{mdline}
926 \subsection*{Limitations}
928 \begin{itemize}
929 \item Positional derivatives of subscripted functions are not allowed.
931 \item Derivatives of unknown functions with symbolic orders are not
932 computed positionally.
934 \item The {\tt pdiff.lisp} code alters the Maxima functions {\tt mqapply}
935 and {\tt sdiffgrad} Although I'm unaware of any problems associated
936 with these altered functions, there may be some. Setting {\tt use\_pdiff} to
937 false should restore {\tt mqapply} and {\tt sdiffgrad} to their
938 original functioning.
940 \end{itemize}
942 \subsection*{Conclusion}
944 The {\tt pdiff} package provides a simple way of working with
945 derivatives of unknown functions. If you find a bug in the package,
946 or if you have a comment or a question, please send it to
947 {\tt willisb@unk.edu}.
949 The {\tt pdiff} package could serve as a basis for a Maxima package
950 differential and integral operators.
952 \end{document}