Reduce and Indeterminate
- To: mathgroup at smc.vnet.net
- Subject: [mg87766] Reduce and Indeterminate
- From: Szabolcs Horvát <szhorvat at gmail.com>
- Date: Wed, 16 Apr 2008 22:30:04 -0400 (EDT)
- Organization: University of Bergen
If a complex number appears in an inequality, Reduce issues a warning:
Reduce[I > 0]
This is useful (to avoid mistakes). But if Indeterminate appears in an
inequality, Reduce will immediately say False:
Reduce[Indeterminate > 0]
While it is debatable what is the correct thing to do mathematically, I
naively believe that it would be useful if Reduce at least gave a
warning. It is true that it is not a good idea to manipulate
expressions completely blindly (without paying attention to what they
contain), but some functions may return very large expressions ... and
the main advantage of using computers is that they can do large and
tedious calculations quickly.
What do MathGroup readers think about this?
Here's a somewhat artificial example:
In[1]:= Integrate[1/x, {x, a, b}]
Out[1]= If[(-Im[b] Re[a] + Im[a] Re[b])/(Im[a] - Im[b]) >=
0 && ((Re[a/(-a + b)] >= 0 && a/(-a + b) != 0) ||
Re[a/(a - b)] >= 1 || Im[a/(-a + b)] != 0), -Log[a] + Log[b],
Integrate[1/x, {x, a, b},
Assumptions -> ! ((-Im[b] Re[a] + Im[a] Re[b])/(Im[a] - Im[b]) >=
0 && ((Re[a/(-a + b)] >= 0 && a/(-a + b) != 0) ||
Re[a/(a - b)] >= 1 || Im[a/(-a + b)] != 0))]]
In[2]:= First[%]
Out[2]= (-Im[b] Re[a] + Im[a] Re[b])/(Im[a] - Im[b]) >=
0 && ((Re[a/(-a + b)] >= 0 && a/(-a + b) != 0) ||
Re[a/(a - b)] >= 1 || Im[a/(-a + b)] != 0)
In[3]:= Reduce[% && (a | b) \[Element] Reals]
Out[3]= False
Note that unlike Reduce, FullSimplify gives a warning:
In[4]:= FullSimplify[%%, (a | b) \[Element] Reals]
During evaluation of In[4]:= FullSimplify::infd: Expression (-Im[b] \
Re[a]+Im[a] Re[b])/(Im[a]-Im[b]) simplified to Indeterminate. >>
Out[4]= Indeterminate >=
0 && (Im[a/(-a + b)] != 0 ||
Re[a/(a - b)] >= 1 || (a/(a - b) != 0 && Re[a/(-a + b)] >= 0))
In[5]:= Reduce[Rest[%] && (a | b) \[Element] Reals, {a, b}]
Out[5]= (a < 0 && (b < a || a < b <= 0)) || (a >
0 && (0 <= b < a || b > a))