PDL::Complex
Complex(x)     User Contributed Perl Documentation     Complex(x)



NAME
       PDL::Complex - handle complex numbers

SYNOPSIS
         use PDL;
         use PDL::Complex;


DESCRIPTION
       This module features a growing number of functions manipu-
       lating complex numbers. These are usually represented as a
       pair "[ real imag ]" or "[ angle phase ]". If not explic-
       itly mentioned, the functions can work inplace (not yet
       implemented!!!) and require rectangular form.

       While there is a procedural interface available ("$a/$b*$c
       <=" Cmul (Cdiv $a, $b), $c)>), you can also opt to cast
       your pdl's into the "PDL::Complex" datatype, which works
       just like your normal piddles, but with all the normal
       perl operators overloaded.

       The latter means that "sin($a) + $b/$c" will be evaluated
       using the normal rules of complex numbers, while other pdl
       functions (like "max") just treat the piddle as a real-
       valued piddle with a lowest dimension of size 2, so "max"
       will return the maximum of all real and imaginary parts,
       not the "highest" (for some definition)

TIPS, TRICKS & CAVEATS
       o   "i" is a constant exported by this module, which rep-
           resents "-1**0.5", i.e. the imaginary unit. it can be
           used to quickly and conviniently write complex con-
           stants like this: "4+3*i".

       o   Use "r2C(real-values)" to convert from real to com-
           plex, as in "$r = Cpow $cplx, r2C 2". The overloaded
           operators automatically do that for you, all the other
           functions, do not. So "Croots 1, 5" will return all
           the fifths roots of 1+1*i (due to threading).

       o   use "cplx(real-valued-piddle)" to cast from normal
           piddles intot he complex datatype. Use "real(com-
           plex-valued-piddle)" to cast back. This requires a
           copy, though.

       o   BEWARE: This module has not been extensively tested.
           Watch out and send me bugreports!

EXAMPLE WALK-THROUGH
       The complex constant five is equal to "pdl(1,0)":

          perldl> p $x = r2C 5
          [5 0]

       Now calculate the three roots of of five:

          perldl> p $r = Croots $x, 3





          [
           [  1.7099759           0]
           [-0.85498797   1.4808826]
           [-0.85498797  -1.4808826]
          ]

       Check that these really are the roots of unity:

          perldl> p $r ** 3

          [
           [             5              0]
           [             5 -3.4450524e-15]
           [             5 -9.8776239e-15]
          ]

       Duh! Could be better. Now try by multiplying $r three
       times with itself:

          perldl> p $r*$r*$r

          [
           [             5              0]
           [             5 -2.8052647e-15]
           [             5 -7.5369398e-15]
          ]

       Well... maybe "Cpow" (which is used by the "**" operator)
       isn't as bad as I thought. Now multiply by "i" and negate,
       which is just a very expensive way of swapping real and
       imaginary parts.

          perldl> p -($r*i)

          [
           [         -0   1.7099759]
           [  1.4808826 -0.85498797]
           [ -1.4808826 -0.85498797]
          ]

       Now plot the magnitude of (part of) the complex sine.
       First generate the coefficients:

          perldl> $sin = i * zeroes(s)->xlinvals(2,4)
                           + zeroes(s)->xlinvals(0,7)

       Now plot the imaginary part, the real part and the magni-
       tude of the sine into the same diagram:

          perldl> line im sin $sin; hold
          perldl> line re sin $sin
          perldl> line abs sin $sin

       Sorry, but I didn't yet try to reproduce the diagram in
       this text. Just run the commands yourself, making sure
       that you have loaded "PDL::Complex" (and "PDL::Graph-
       ics::PGPLOT").

FUNCTIONS
       cplx real-valued-pdl

       Cast a real-valued piddle to the complex datatype. The
       first dimension of the piddle must be of size 2. After
       this the usual (complex) arithmetic operators are applied
       to this pdl, rather than the normal elementwise pdl opera-
       tors.  Dataflow to the complex parent works. Use "sever"
       on the result if you don't want this.

       real cplx-valued-pdl

       Cast a complex vlaued pdl back to the "normal" pdl
       datatype. Afterwards the normal elementwise pdl operators
       are used in operations. Dataflow to the real parent works.
       Use "sever" on the result if you don't want this.

       r2C

         Signature: (r(); [o]c(m=2))

       convert real to complex, assuming an imaginary part of
       zero

       i2C

         Signature: (r(); [o]c(m=2))

       convert imaginary to complex, assuming a real part of zero

       Cr2p

         Signature: (r(m=2); float+ [o]p(m=2))

       convert complex numbers in rectangular form to polar
       (mod,arg) form

       Cp2r

         Signature: (r(m=2); [o]p(m=2))

       convert complex numbers in polar (mod,arg) form to rectan-
       gular form

       Cmul

         Signature: (a(m=2); b(m=2); [o]c(m=2))

       complex multiplication

       Cscale

         Signature: (a(m=2); b(); [o]c(m=2))

       mixed complex/real multiplication

       Cdiv

         Signature: (a(m=2); b(m=2); [o]c(m=2))

       complex division

       Ccmp

         Signature: (a(m=2); b(m=2); [o]c())

       Complex comparison oeprator (spaceship). It orders by real
       first, then by imaginary.

       Cconj

         Signature: (a(m=2); [o]c(m=2))

       complex conjugation

       Cabs

         Signature: (a(m=2); [o]c())

       complex "abs()" (also known as modulus)

       Cabs2

         Signature: (a(m=2); [o]c())

       complex squared "abs()" (also known squared modulus)

       Carg

         Signature: (a(m=2); [o]c())

       complex argument function ("angle")

       Csin

         Signature: (a(m=2); [o]c(m=2))

         sin (a) = 1/(2*i) * (exp (a*i) - exp (-a*i))


       Ccos

         Signature: (a(m=2); [o]c(m=2))

         cos (a) = 1/2 * (exp (a*i) + exp (-a*i))


       Ctan a [not inplace]

         tan (a) = -i * (exp (a*i) - exp (-a*i)) / (exp (a*i) + exp (-a*i))


       Cexp

         Signature: (a(m=2); [o]c(m=2))

       exp (a) = exp (real (a)) * (cos (imag (a)) + i * sin (imag
       (a)))

       Clog

         Signature: (a(m=2); [o]c(m=2))

       log (a) = log (cabs (a)) + i * carg (a)

       Cpow

         Signature: (a(m=2); b(m=2); [o]c(m=2))

       complex "pow()" ("**"-operator)

       Csqrt

         Signature: (a(m=2); [o]c(m=2))


       Casin

         Signature: (a(m=2); [o]c(m=2))


       Cacos

         Signature: (a(m=2); [o]c(m=2))


       Catan cplx [not inplace]

       Return the complex "atan()".

       Csinh

         Signature: (a(m=2); [o]c(m=2))

         sinh (a) = (exp (a) - exp (-a)) / 2


       Ccosh

         Signature: (a(m=2); [o]c(m=2))

         cosh (a) = (exp (a) + exp (-a)) / 2


       Ctanh

         Signature: (a(m=2); [o]c(m=2))


       Casinh

         Signature: (a(m=2); [o]c(m=2))


       Cacosh

         Signature: (a(m=2); [o]c(m=2))


       Catanh

         Signature: (a(m=2); [o]c(m=2))


       Cproj

         Signature: (a(m=2); [o]c(m=2))

       compute the projection of a complex number to the riemann
       sphere

       Croots

         Signature: (a(m=2); [o]c(m=2,n); int n => n)

       Compute the "n" roots of "a". "n" must be a positive inte-
       ger. The result will always be a complex type!

       re cplx, im cplx

       Return the real or imaginary part of the complex number(r)
       given. These are slicing operators, so data flow works.
       The real and imaginary parts are returned as piddles (ref
       eq PDL).



       rCpolynomial

         Signature: (coeffs(s); x(c=2,m); [o]out(c=2,m))

       evaluate the polynomial with (real) coefficients "coeffs"
       at the (complex) position(n) "x". "coeffs[0]" is the con-
       stant term.

AUTHOR
       Copyright (C) 2000 Marc Lehmann <pcg@goof.com>.  All
       rights reserved. There is no warranty. You are allowed to
       redistribute this software / documentation as described in
       the file COPYING in the PDL distribution.

SEE ALSO
       perl(l), PDL.



perl v5.6.1                 2002-04-08                 Complex(x)