MathGroup Archive 2007

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: FindInstance puzzler

  • To: mathgroup at smc.vnet.net
  • Subject: [mg83659] Re: [mg83633] FindInstance puzzler
  • From: Adam Strzebonski <adams at wolfram.com>
  • Date: Tue, 27 Nov 2007 06:18:56 -0500 (EST)
  • References: <200711260849.DAA29897@smc.vnet.net> <55F7C11F-CAB8-47B4-AE40-DA470C74C8C1@mimuw.edu.pl>
  • Reply-to: adams at wolfram.com

Andrzej Kozlowski wrote:
> 
> On 26 Nov 2007, at 17:49, Mark Fisher wrote:
> 
>> Hi all,
>>
>> I'm puzzled by the results of FindInstance which seems to restrict its
>> results to a subregion of the valid space.
>>
>> conds = And @@
>>   Append[Thread[(Abs[L] /. Solve[1 - z1 L - z2 L^2 == 0, L]) >= 1],
>>    z1 + z2 >= 0];
>>
>> RegionPlot[conds, {z1, -.75, 2.25}, {z2, -1.25, 1.25}, PlotPoints ->
>> 90,
>>  Epilog ->  Point[{z1, z2} /. FindInstance[conds, {z1, z2}, Reals,
>> 10^3]]]
>>
>> I suppose this isn't a bug, because the results of FindInstance are
>> all valid, but nevertheless I find it unpleasing (to say the least)
>> that part of the valid space seems to get no representation. It means
>> that FindInstance is of limited use for exploring such spaces.
>>
>> --Mark
>>
>>
> 
> It seems to me that you have found a more serious problem than just 
> "unpleasing" behaviour of FindInstance. In fact, this looks to me like a 
> quite serious bug in Reduce. The easiest way to see it is this:
> 
> conds = And @@
>    Append[Thread[(Abs[L] /. Solve[1 - z1 L - z2 L^2 == 0, L]) >= 1],
>     z1 + z2 >= 0];
> 
> conds1 = Reduce[conds, {z1, z2}, Reals];
> 
> Now, conds1 ought to be equivalent (over the reals) to conds. But it is 
> not! For example:
> 
> conds /. Thread[{z1, z2} -> {3/2, -3/5}]
> True
> 
> but
> 
> conds1 /. Thread[{z1, z2} -> {3/2, -3/5}]
> False
> 
> This certianly should not happen! How is this related to your problem? 
> You can see this immediately by looking at:
> 
> 
> RegionPlot[conds1, {z1, -.75, 2.25}, {z2, -1.25, 1.25}, PlotPoints -> 
> 90,  Epilog -> Point[{z1, z2} /. FindInstance[conds1, {z1, z2}, Reals, 
> 10^3]]]
> 
> Note that conds was replaced by conds1, which ought to be equivalent to 
> it over the reals (but is not). So unless I have had a sudden attack of 
> insanity there is a serious bug in Reduce and it was not intrduced in 
> Mathematica 6 as the same behaviour is present in 5.2
> 
> 
> Andrzej Kozlowski
> 
> 
> 

There is a significant difference between

(1)  Reduce[conds, {z1, z2}, Reals]

and

(2)  Reduce[conds && Element[z1|z2, Reals], {z1, z2}]

When domain Reals is specified in Reduce or FindInstance, not only
all variables are required to be real, but also all functions
present in the input system are required to be real valued.

Let's look at conds:

In[1]:= (conds = And @@
    Append[Thread[(Abs[L] /. Solve[1 - z1 L - z2 L^2 == 0, L]) >= 1],
     z1 + z2 >= 0])//InputForm

Out[1]//InputForm=
Abs[(-z1 + Sqrt[z1^2 + 4*z2])/z2]/2 >= 1 &&
  Abs[(z1 + Sqrt[z1^2 + 4*z2])/z2]/2 >= 1 && z1 + z2 >= 0

{z1->3/2, z2->-3/5} is not an allowed solution of (1),
because Sqrt[z1^2 + 4*z2] is not real.

In[2]:= conds1 = Reduce[conds, {z1, z2}, Reals];

In[3]:= {conds1, Sqrt[z1^2 + 4*z2]} /. {z1->3/2, z2->-3/5}

                 I      3
Out[3]= {False, - Sqrt[-]}
                 2      5

In[4]:= conds2 = Reduce[conds && Element[z1|z2, Reals], {z1, z2}];
...

Unfortunately, this is a much harder problem than (1) and it does
not finish in 15 minutes (might not finish in a day either...).

Reduce uses the cylindrical algebraic decomposition (CAD) algorithm
to solve inequalities. The inequalities need to be polynomials in real
variables. Let's see what it takes to transform conds into a polynomial
system in real variables. First, we replace

Sqrt[z1^2 + 4*z2] -> s

and add an equation s^2 == z1^2 + 4*z2.
With domain Reals we assume that Sqrt[z1^2 + 4*z2] is real, so
s is a real variable, and we have an additional inequality s>=0.
Without assuming that Sqrt[z1^2 + 4*z2] is real, we need to introduce
two new real variables for Re[s] and Im[s] and add inequalities

Re[s] > 0 || Re[s] == 0 && Im[s] >= 0

Now we need to polynomialize the two Abs[_] expressions present in
conds. With domain Reals, Abs is just a piecewise function, and so
it can be eliminated using the transformation

F(Abs[e]) -> e>=0 && F(e) || e<0 && F(-e)

Over the complex domain Abs is an algebraic function

Abs[e] -> Sqrt[Re[e]^2+Im[e]^2]

and we need to introduce a new variable for each Abs[_] and add
equations and inequalities similar to those we added for s.

Hence, (1) translates to a CAD problem with 3 variables, but (2)
translates to a CAD problem with 6 variables. CAD has a doubly
exponential complexity in the number of variables, so a difference
between 3 and 6 variables may mean a difference between a simple
problem and a problem not solvable in a reasonable time.

Best Regards,

Adam Strzebonski
Wolfram Research


  • Prev by Date: Re: Possible bug in HamiltonianCycle
  • Next by Date: Re: Manipulate is sluggish?
  • Previous by thread: Re: FindInstance puzzler
  • Next by thread: Re: FindInstance puzzler