re: Specifying rules OR "How to do complex math in Mathematica"
- To: mathgroup at yoda.physics.unc.edu
- Subject: re: Specifying rules OR "How to do complex math in Mathematica"
- From: Simon Chandler <simonc at hpcpbla.bri.hp.com>
- Date: Mon, 27 Jun 1994 13:15:00 +0100
27/6/94 Dear MathGroup, Marnix Van Daele writes >Hello, I have a problem with complex numbers ! > I want to tell Mma that a is real, such that > Im[a+I] will give 1, > but I do not get this result. > I have tried > a /: Im[a]=0 > Can anyone help me ? There have been several replies already, suggesting the package Algebra`ReIm` is the answer - which indeed it is to the question asked. Here is a more general description of how to 'teach' Mathematica about complex maths, including the functions Abs and Arg. I wrote the notes as a reminder for myself, so forgive me if they're a bit patronizing or cynical. Dr Simon Chandler Hewlett-Packard Ltd (CPB) Filton Road Stoke Gifford Bristol BS12 6QZ Tel: 0272 228109 Fax: 0272 236091 email: simonc at bri.hp.com -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 10/3/94 Complex Algebra with Mathematica ================================ What's the problem ? -------------------- The built in functions Re, Im, Conjugate, Abs and Arg evaluate for numbers only. What's the solution ? --------------------- The package algebra`ReIm` extends Re, Im and Conjugate to symbols and expressions. Another package, AbsArg.m, extends Abs and Arg in addition to Re, Im and Conjugate. What does all this mean ? ------------------------- Firstly, the raw Mathematica kernel is pretty stupid at doing complex algebra of anything that contains symbols rather than just numbers. For example... In[1]:= res1 = Re[1/a] only gives 1 Out[1]= Re[-] and similarly a In[2]:= res2 = Re[(a + z)^2] only gives 2 Out[2]= Re[(a + z) ] Pretty dull ! BUT, with the algebra`ReIm` package loaded the inputs are expanded (simplified ?). i.e., In[3]:= Needs["algebra`ReIm`"]; In[4]:= res1 now gives Re[a] Out[4]= --------------- and 2 2 Im[a] + Re[a] In[5]:= res2 now gives 2 2 Out[5]= -(Im[a] + Im[z]) + (Re[a] + Re[z]) Mathematica does not know a priori if a symbol stands for a real or a complex number, so is assuming that both parts may be present. A symbol can be declared as real by: z /: Im[a] = 0; or, equivalently, by: Im[z] ^= 0; If the symbol has been declared in this way then raw Mathematica (without the algebra`ReIm` package) still can't do complex algebra. So, again, you'd get the dull results. i.e., In[6]:= CleanSlate["algebra`ReIm`"]; (* Note: this just gets rid of the algebra`ReIm` package *) In[1]:= Im[a]^=0; (* declares a as real *) In[2]:= res1 again gives 1 Out[2]= Re[-] and a In[3]:= res2 again gives 2 Out[3]= Re[(a + z) ] With the algebra`ReIm` package loaded the 'realness' of a is taken into account In[4]:= Needs["algebra`ReIm`"] (* load the package again *) In[5]:= res1 1 Out[5]= - a In[6]:= res2 2 2 Out[6]= -Im[z] + (a + Re[z]) Even with the algebra`ReIm` package, Mathematica doesn't know how to simplify expressions involving Abs[] and Arg[]. For example In[7]:= Abs[a] gives Out[7]= Abs[a] To expand Mathematica's knowledge about complex arithmetic to take the Abs[] and Arg[] functions into account you must load another package, algebra`AbsArg` (actually the 'teaching process' is done in one step by loading this package, since it automatically loads algebra`ReIm` too - see my summary below). In[8]:= Needs["algebra`AbsArg`"] Then, Abs[] also produces expansions and takes into account properties of symbols. In[9]:= Abs[a] now gives 2 Out[9]= Sqrt[a ] Further simplification may be possible if information about the positivity of symbols is given. This can be done with the functions Positive, Negative and NonNegative (or with NonNegativeQ from the package algebra`NonNegativeQ`, which is also loaded-in automatically when you load in algebra`AbsArg` ) In[10]:= Positive[a] ^= True; In[11]:= Abs[a] Out[11]= a That was a trivial example, here something more substancial. With no knowledge about x and y In[12]:= Abs[ x y] gives 2 2 Out[12]= Sqrt[(Im[y] Re[x] + Im[x] Re[y]) + (-(Im[x] Im[y]) + Re[x] Re[y]) ] With a few declared properties In[13]:= Positive[x] ^= True; Negative[y] ^= True; this simplifies to In[15]:= Abs[ x y] Out[15]= -(x y) Note that using Positive[x], declares x as both real and > 0, so In[16]:= Re[x] now gives Out[16]= x In[17]:= Im[x] Out[17]= 0 Summary ------- The bottom line is: if you want to do any complex algebra with Mathematica then you must teach it how to. Just load in the package algebra`AbsArg` with Needs["algebra`AbsArg`"] Not only does this teach Mathematica about Abs and Arg, it also loads in the algebra`ReIm` package, so teaching it about Re and Im etc. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Here endeth the first lesson.