Re: Simplifying inequalities
- To: mathgroup at smc.vnet.net
- Subject: [mg36809] Re: [mg36790] Simplifying inequalities
- From: Andrzej Kozlowski <andrzej at tuins.ac.jp>
- Date: Thu, 26 Sep 2002 04:57:20 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
The modification to FullSimplify that I sent earlier works correctly
only for assumptions of the form Or[a,b] (and even then not is not
always what one would like). For what it's worth here is a better (but
slow) version:
In[1]:=
Unprotect[FullSimplify];
In[2]:=
FullSimplify[expr_, x_ || y__] := FullSimplify[
FullSimplify[expr, x] || FullSimplify[expr, Or[y]]];
In[3]:=
Protect[FullSimplify];
For example:
In[4]:=
FullSimplify[Sqrt[(x - 1)^2] + Sqrt[(x - 2)^2] +
Sqrt[(x - 3)^2], x > 1 || x > 2 || x > 3]
Out[4]=
-1 + x + Abs[-3 + x] + Abs[-2 + x] ||
-3 + 2*x + Abs[-3 + x] || 3*(-2 + x)
Andrzej Kozlowski
Toyama International University
JAPAN
On Thursday, September 26, 2002, at 11:14 AM, Andrzej Kozlowski wrote:
> The reason why InequalitySolve returns it's answer in what sometimes
> turns out to be unnecessarily complicated form is that the underlying
> algorithm, Cylindrical Agebraic Decomposition (CAD) returns its
> answers in this form. Unfortunately it seems to me unlikely that a
> simplification of the kind you need can be can be accomplished in any
> general way. To see why observe the following. First of all:
>
> In[1]:=
> FullSimplify[x > 0 || x == 0]
>
> Out[1]=
> x >= 0
>
> This is fine. However:
>
> In[2]:=
> FullSimplify[x > 0 && x < 2 || x == 0 && x < 2]
>
> Out[2]=
> x == 0 || 0 < x < 2
>
> Of course what you would like is simply 0 <= x < 2. One reason why you
> can't get it is that while Mathematica can perform a "LogicalExpand",
> as in:
> In[3]:=
> LogicalExpand[(x > 0 || x == 0) && x < 2]
>
> Out[3]=
> x == 0 && x < 2 || x > 0 && x < 2
>
> There i no "LogicalFactor" or anything similar that would reverse what
> LogicalExpand does. if there was then you could perform the sort of
> simplifications you need for:
>
> In[4]:=
> FullSimplify[(x > 0 || x == 0) && x < 2]
>
> Out[4]=
> 0 <= x < 2
>
> However, it does not seem to me very likely that such "logical
> factoring" can be performed by a general enough algorithm (though I am
> no expert in this field). In any case, certainly Mathematica can't do
> this.
>
> I also noticed that Mathematica seems unable to show that the answer
> it returns to your problem is actually equivalent to your simpler one.
> In fact this looks like a possible bug in Mathematica. Let's first try
> the function ImpliesQ from the Experimental context:
>
> << Experimental`
>
> Now Mathematica correctly gives:
>
> In[6]:=
> ImpliesQ[y4 >= -1 && y6 >= -1 && y6 <= y5 <= 1 + y4 + y6,
> y4 == -1 && y6 >= -1 && y5 == y6 || y4 > -1 && y6 >= -1 && y6 <= y5
> <= 1 + y4 + y6]
>
> Out[6]=
> True
>
> However:
>
> In[7]:=
> ImpliesQ[y4 == -1 && y6 >= -1 && y5 == y6 || y4 > -1 && y6 >= -1 &&
> y6 <= y5 <= 1 + y4 + y6, y4 >= -1 && y6 >= -1 && y6 <= y5 <= 1 +
> y4 + y6]
>
> Out[7]=
> False
>
> That simply means that ImpliesQ cannot show the implication, not that
> it does not hold. ImpliesQ relies on CAD, as does FullSimplify.
> Switching to FullSimplify we see that:
>
>
>
> In[8]:=
> FullSimplify[y4 == -1 && y6 >= -1 && y5 == y6 || y4 > -1 && y6 >= -1 &&
> y6 <= y5 <= 1 + y4 + y6, y4 >= -1 && y6 >= -1 && y6 <= y5 <= 1 +
> y4 + y6]
>
> Out[8]=
> True
>
> while
>
> In[9]:=
> FullSimplify[y4 >= -1 && y6 >= -1 && y6 <= y5 <= 1 + y4 + y6,
> y4 == -1 && y6 >= -1 && y5 == y6 || y4 > -1 && y6 >= -1 && y6 <= y5
> <= 1 + y4 + y6]
>
> Out[9]=
> y4 >= -1 && y6 <= y5 <= 1 + y4 + y6
>
> On the other hand, taking just the individual summands of Or as
> hypotheses;
> In[10]:=
> FullSimplify[y4 >= -1 && y6 >= -1 && y6 <= y5 <= 1 + y4 + y6,
> y4 > -1 && y6 >= -1 && y6 <= y5 <= 1 + y4 + y6]
>
> Out[10]=
> True
>
> In[11]:=
> FullSimplify[y4 >= -1 && y6 >= -1 && y6 <= y5 <= 1 + y4 + y6,
> y4 == -1 && y6 >= -1 && y5 == y6 ]
>
> Out[11]=
> True
>
> In fact FullSimplify is unable to use Or in assumptions, which can be
> demonstrated on an abstract example:
>
>
> In[12]:=
> FullSimplify[C,(A||B)&&(C)]
>
> Out[12]=
> True
>
> In[13]:=
> FullSimplify[C,LogicalExpand[(A||B)&&(C)]]
>
> Out[13]=
> C
>
> This could be fixed by modifying FullSimplify:
>
> In[14]:=
> Unprotect[FullSimplify];
>
> In[14]:=
> FullSimplify[expr_,Or[x_,y__]]:=Or[FullSimplify[expr,x],FullSimplify[ex
> pr,y]];
>
> In[15]:=
> Protect[FullSimplify];
>
> Now at least we get as before:
>
> In[16]:=
> FullSimplify[y4 == -1 && y6 >= -1 && y5 == y6 || y4 > -1 && y6 >= -1 &&
> y6 <= y5 <= 1 + y4 + y6, y4 >= -1 && y6 >= -1 && y6 <= y5 <= 1 +
> y4 + y6]
>
> Out[16]=
> True
>
> but also:
>
> In[17]:=
> FullSimplify[y4 >= -1 && y6 >= -1 && y6 <= y5 <= 1 + y4 + y6,
> y4 == -1 && y6 >= -1 && y5 == y6 || y4 > -1 && y6 >= -1 && y6 <= y5
> <= 1 + y4 + y6]
>
> Out[17]=
> True
>
> This seems to me a possible worthwhile improvement in FullSimplify,
> though of course not really helpful for your problem.
>
>
> Andrzej Kozlowski
> Toyama International University
> JAPAN
>
>
> On Wednesday, September 25, 2002, at 02:51 PM, Vincent Bouchard wrote:
>
>> I have a set of inequalities that I solve with InequalitySolve. But
>> then
>> it gives a complete set of solutions, but not in the way I would like
>> it
>> to be! :-) For example, the simple following calculation will give:
>>
>> In[1]:= ineq = {y4 >= -1, y5 >= -1, y6 + y4 >= y5 - 1, y5 >= y6, y6
>> >= -1};
>> InequalitySolve[ineq,{y4,y6,y5}]
>>
>> Out[1]:= y4 == -1 && y6 >= -1 && y5 == y6 ||
>> y4 > -1 && y6 >= -1 && y6 <= y5 <= 1 + y4 + y6
>>
>> the result is good, but I would like it to be in the simpler but
>> equivalent form
>>
>> y4 >= -1 && y6 >= -1 && y6 <= y5 <= 1 + y4 + y6
>>
>> How can I tell InequalitySolve to do that? It is simple for this
>> example,
>> but for a large set of simple inequalities InequalitySolve gives
>> lines and
>> lines of results instead of a simple result.
>>
>> Thanks,
>>
>> Vincent Bouchard
>> DPHil student in theoretical physics in University of Oxford
>>
>>
>>
>>
>
>