]> www.ginac.de Git - ginac.git/blobdiff - doc/tutorial/ginac.texi
* Fix citation.
[ginac.git] / doc / tutorial / ginac.texi
index 717d5b107909c665b06ad461cd98aded5bfcc4c8..54a373433ab5615281dd3f598cec62b1e69bf3d4 100644 (file)
@@ -931,10 +931,22 @@ int main()
     numeric trott("1.0841015122311136151E-2");
     
     std::cout << two*p << std::endl;  // floating point 6.283...
+    ...
+@end example
+
+@cindex @code{I}
+@cindex complex numbers
+The imaginary unit in GiNaC is a predefined @code{numeric} object with the
+name @code{I}:
+
+@example
+    ...
+    numeric z1 = 2-3*I;                    // exact complex number 2-3i
+    numeric z2 = 5.9+1.6*I;                // complex floating point number
 @}
 @end example
 
-It may be tempting to construct numbers writing @code{numeric r(3/2)}.
+It may be tempting to construct fractions by writing @code{numeric r(3/2)}.
 This would, however, call C's built-in operator @code{/} for integers
 first and result in a numeric holding a plain integer 1.  @strong{Never
 use the operator @code{/} on integers} unless you know exactly what you
@@ -1866,9 +1878,9 @@ indices into a canonical order which allows for some immediate simplifications:
      // -> 2*A.j.i
     cout << indexed(B, sy_anti(), i, j)
           + indexed(B, sy_anti(), j, i) << endl;
-     // -> -B.j.i
+     // -> 0
     cout << indexed(B, sy_anti(), i, j, k)
-          + indexed(B, sy_anti(), j, i, k) << endl;
+          - indexed(B, sy_anti(), j, k, i) << endl;
      // -> 0
     ...
 @end example
@@ -1883,8 +1895,8 @@ not dummy indices are called @dfn{free indices}. Numeric indices are neither
 dummy nor free indices.
 
 To be recognized as a dummy index pair, the two indices must be of the same
-class and dimension and their value must be the same single symbol (an index
-like @samp{2*n+1} is never a dummy index). If the indices are of class
+class and their value must be the same single symbol (an index like
+@samp{2*n+1} is never a dummy index). If the indices are of class
 @code{varidx} they must also be of opposite variance; if they are of class
 @code{spinidx} they must be both dotted or both undotted.
 
@@ -3443,9 +3455,34 @@ int ex::degree(const ex & s);
 int ex::ldegree(const ex & s);
 @end example
 
-which also work reliably on non-expanded input polynomials (they even work
-on rational functions, returning the asymptotic degree). To extract
-a coefficient with a certain power from an expanded polynomial you use
+These functions only work reliably if the input polynomial is collected in
+terms of the object @samp{s}. Otherwise, they are only guaranteed to return
+the upper/lower bounds of the exponents. If you need accurate results, you
+have to call @code{expand()} and/or @code{collect()} on the input polynomial.
+For example
+
+@example
+> a=(x+1)^2-x^2;
+(1+x)^2-x^2;
+> degree(a,x);
+2
+> degree(expand(a),x);
+1
+@end example
+
+@code{degree()} also works on rational functions, returning the asymptotic
+degree:
+
+@example
+> degree((x+1)/(x^3+1),x);
+-2
+@end example
+
+If the input is not a polynomial or rational function in the variable @samp{s},
+the behavior of @code{degree()} and @code{ldegree()} is undefined.
+
+To extract a coefficient with a certain power from an expanded
+polynomial you use
 
 @example
 ex ex::coeff(const ex & s, int n);
@@ -3861,14 +3898,14 @@ Only calling the series method makes the last output simplify to
 @math{1-v^2/c^2+O(v^10)}, without that call we would just have a long
 series raised to the power @math{-2}.
 
-@cindex M@'echain's formula
+@cindex Machin's formula
 As another instructive application, let us calculate the numerical 
 value of Archimedes' constant
 @tex
 $\pi$
 @end tex
 (for which there already exists the built-in constant @code{Pi}) 
-using M@'echain's amazing formula
+using Machin's amazing formula
 @tex
 $\pi=16$~atan~$\!\left(1 \over 5 \right)-4$~atan~$\!\left(1 \over 239 \right)$.
 @end tex
@@ -3886,7 +3923,7 @@ the order term off:
 #include <ginac/ginac.h>
 using namespace GiNaC;
 
-ex mechain_pi(int degr)
+ex machin_pi(int degr)
 @{
     symbol x;
     ex pi_expansion = series_to_poly(atan(x).series(x,degr));
@@ -3901,7 +3938,7 @@ int main()
     using std::endl;  // ...dealing with this namespace std.
     ex pi_frac;
     for (int i=2; i<12; i+=2) @{
-        pi_frac = mechain_pi(i);
+        pi_frac = machin_pi(i);
         cout << i << ":\t" << pi_frac << endl
              << "\t" << pi_frac.evalf() << endl;
     @}
@@ -4261,19 +4298,22 @@ and have the @samp{x} and @samp{y} correspond to the symbols @code{x} and
 desired symbols to the @code{>>} stream input operator.
 
 Instead, GiNaC lets you construct an expression from a string, specifying the
-list of symbols to be used:
+list of symbols and indices to be used:
 
 @example
 @{
-    symbol x("x"), y("y");
-    ex e("2*x+sin(y)", lst(x, y));
+    symbol x("x"), y("y"), p("p");
+    idx i(symbol("i"), 3);
+    ex e("2*x+sin(y)+p.i", lst(x, y, p, i));
 @}
 @end example
 
 The input syntax is the same as that used by @command{ginsh} and the stream
-output operator @code{<<}. The symbols in the string are matched by name to
-the symbols in the list and if GiNaC encounters a symbol not specified in
-the list it will throw an exception.
+output operator @code{<<}. The symbols and indices in the string are matched
+by name to the symbols and indices in the list and if GiNaC encounters a
+symbol or index not specified in the list it will throw an exception. Only
+indices whose values are single symbols can be used (i.e. numeric indices
+or compound indices as in "A.(2*n+1)" are not allowed).
 
 With this constructor, it's also easy to implement interactive GiNaC programs: