Re: "Assuming"

*To*: mathgroup at smc.vnet.net*Subject*: [mg85620] Re: "Assuming"*From*: dh <dh at metrohm.ch>*Date*: Fri, 15 Feb 2008 06:51:56 -0500 (EST)*References*: <fp0m11$5u7$1@smc.vnet.net> <fp192b$gju$1@smc.vnet.net> <fp2khg$pka$1@smc.vnet.net>

Hi David, we all learned not to divide by zero, but things are a bit more subtle than this. You claim that (a^2 - 1)/(a - 1) should simplify to If[a == 1, Indeterminate, a + 1] and not to (a+1), but you do not give a good reason for this. Obviously (a^2 - 1)/(a - 1) is not defined for a==1, but note that the left and right limit exist and are identical. Now what harm is done if we replace the first function by a second one (a+1) that agrees with the first one where it is defined, but that is also defined for a==1? This seems to me a better aproach than your proposal, especially if we consider the implications on practical calculations. Daniel David W.Cantrell wrote: > dh <dh at metrohm.ch> wrote: >> HI Markus, >> >> I think you are fooling yourself. > > Rather, I think you, Daniel, are fooling yourself. > >> Consider Simplify[(a^2 - 1)/(a - 1)] >> >> As a^2 - 1)== (a+1)(a-1) this will give (a+1). > > Naively interpreted (as, say, a beginning calculus student should do) > > (a^2 - 1)/(a - 1) should simplify to something equivalent to > > If[a == 1, Indeterminate, a + 1] > > Whether a CAS should interpret something like (a^2 - 1)/(a - 1) in a more > sophisticated fashion is debatable, IMO. > >> This is true in general, for a==1 understood as limit. > > But of course Simplify should not -- and in fact does not -- "understand as > limit" automatically. > > Here's a simple example: > > In[2]:= Simplify[Sin[a]/a, a == 0] > Out[2]= Indeterminate > > That behavior is correct. OTOH, if Mathematica had been designed to > "understand as limit" automatically under Simplify, then Out[2] should have > been 1 instead. > >> Therefore, this has nothing to do with assumptions. > > But it arguably _should_ have had something to do with assumptions; that > was part of the point Markus was making. > >> On the other hand, (a^2 - 1)/(a - 1) /. a -> 1 can not be calculated as >> >> it gives 0/0. Note that "/. and ->" mean replacement, not limit. If >> >> you want a limit, you have to say so: Limit[(a^2 - 1)/(a - 1), a -> 1] >> >> hope this helps, Daniel > > Compare the following: > > In[8]:= Assuming[x == 0, {x/x^2, x/x, x^2/x}] > Out[8]= {1/x, 1, x} > > In[9]:= x = 0; {x/x^2, x/x, x^2/x} > Out[9]= {Indeterminate, Indeterminate, Indeterminate} > > Of course, in Mathematica, Out[9] is correct. And arguably, Out[8] should > have been the same as Out[9]. > > Here's a portion of a response of mine which appeared some years ago in > this newsgroup. It's relevant to what Markus was asking about. > > ------------------------------------------------------- > > In a sense, there is something wrong. These simplifications are what David > Stoutemyer called "misdemeanors" in his article "Crimes and Misdemeanors in > the Computer Algebra Trade", _Notices of the American Mathematical Society_ > 38:7 (1991) 778-785. > > In case anyone doesn't see why simplifying, say, x^0 to 1 is a misdemeanor: > In Mathematica, 0^0 is regarded as being Indeterminate. Thus, without > knowing that x is nonzero, Mathematica should not bluntly simplify x^0 to > 1. Rather, it would seem that, in Mathematica, x^0 should simplify to, say, > If[x == 0, Indeterminate, 1]. But such a result is normally considered to > be too cumbersome to be practical; the "misdemeanor" simplification is > considered preferable. All CASs known to me make such simplifications. > > ------------------------------------------------------- > > David W. Cantrell > > >> markusbinder wrote: >> >>> Hi, >>> I would appreciate some comments about the Assuming-function. Several >>> examples using Mathematica 6 as follows: >>> In[1]:= Assuming[a > 0, Simplify[a == -1]] >>> Out[1]= False >>> In[2]:= Assuming[a \[Element] Integers, Simplify[a == -1]] >>> Out[2]= a == -1 >>> In[3]:= Assuming[a \[Element] Integers && a > 0 && a < 2, Simplify[a^2< >>> 1.1]] >>> Out[3]= True >>> In[4]:= Assuming[a \[Element] Reals && a > 0 && a < 2, Simplify[a^2 < >>> 1.1]] >>> Out[4]= a < 1.04881 >>> So far, everything seems pretty reasonable, but >>> In[5]:= Assuming[a \[Element] Integers && a > 0 && a < 2, Simplify[(a^2 >>> - 1)/(a - 1)]] >>> Out[5]= 1 + a >>> whereas >>> In[6]:= (a^2 - 1)/(a - 1) /. a -> 1 >>> Out[6]= Indeterminate >>> I consider this as blunder (or bug?); I comprehend working with domains >>> can be pretty tricky and of course I don't expect >>> In[7]:= Simplify[(a^2 - 1)/(a - 1)] >>> to yield >>> Out[7]= "Beware, a != 1 neccessary!" >>> >>> instead of >>> >>> Out[7]= 1 + a. >>> >>> Am I tricked by some personal misconception of how Mathematica deals >>> with Assuming plus fractions as shown above, or is this a mere flaw? >>> Thanks in advance for your corrections & suggestions. >>> >>> Best regards >>> Markus Binder >