Re: declaring variables

*To*: mathgroup at smc.vnet.net*Subject*: [mg4800] Re: declaring variables*From*: danl (Daniel Lichtblau)*Date*: Mon, 16 Sep 1996 23:51:24 -0400*Organization*: Wolfram Research, Inc.*Sender*: owner-wri-mathgroup at wolfram.com

> Burkhardt Goedde wrote: > > > > Dear math users, > > just a simple problem, but I got no answer from thew book. > > > > Re[x + I y] gives > > > > Re[x + I y] > > > > whereas > > > > Re[2 + 3 I] > > > > gives 2 > > > > How could I tell Mathematica that x and y are real numbers? > > I think this is in some FAQ file. Where it lives I do not know. Anyway, I've seen a response posted that uses ComplexExpand In[1]:= ComplexExpand[Re[x + I y]] Out[1]= x and also a method that uses the standard package Algebra`ReIm`. I think the former method is to be preferred. let me explain why. First, we really do not maintain Algebra`ReIm` any more. If it works, fine. If not, we may look into bug reports but we will not look very hard. Second, it tends to be much slower on problems of any difficulty. In[4]:= Timing[ComplexExpand[Re[(x-I*y)^3/(Exp[x]*(x^3-x*y+y^2)^2)]]] // InputForm Out[4]//InputForm= {0.15626*Second, x^3/(E^x*(x^3 - x*y + y^2)^2) - (3*x*y^2)/(E^x*(x^3 - x*y + y^2)^2)} vs. (different session) In[2]:= Needs["Algebra`ReIm`"] In[3]:= Im[x]^=0; In[4]:= Im[y]^=0; In[5]:= Re[x + I y] Out[5]= x In[10]:= Timing[Re[(x-I*y)^3/(Exp[x]*(x^3-x*y+y^2)^2)]] // InputForm Out[10]//InputForm= {12.41520599999999*Second, (-2*x*y^2 + x*(x^2 - y^2))/ (E^x*(x^3 - x*y + y^2)^2)} Third, Algebra`ReIm` is not as powerful as ComplexExpand. For example, In[6]:= ComplexExpand[Log[Exp[x]]] Out[6]= x In[7]:= ComplexExpand[Sign[x^2+1]] Out[7]= 1 vs (in session with Algebra`ReIm` loaded and Im[x]^=0) In[11]:= Log[Exp[x]] x Out[11]= Log[E ] In[13]:= Sign[x^2+1] 2 Out[13]= Sign[1 + x ] Fourth, I've seen at least one bug report to the effect that Algebra`ReIm` does not get along with ComplexExpand. The gist was that preloading Algebra`ReIm` caused a seemingly benign ComplexExpand invocation to go into infinite recursion. Finally, my opinion (not necessarily shared by others) is that global assumptions are dangerous. Once we make declarations about variables e.g. x^=0, these may be used elsewhere, or not, depending on what code is invoked. Worse still, we may forget we made the assumptions and have later code perform "simplifications" we do not want. ComplexExpand localizes assumptions, regarding which variables are real, to its arguments. Once it returns the assumptions are no longer valid. Daniel Lichtblau Wolfram Research, Inc. danl at wolfram.com ==== [MESSAGE SEPARATOR] ====