Re: bad performance of Reduce (5.2)
- To: mathgroup at smc.vnet.net
- Subject: [mg77789] Re: [mg77773] bad performance of Reduce (5.2)
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Sun, 17 Jun 2007 05:57:12 -0400 (EDT)
- References: <200706160734.DAA26018@smc.vnet.net>
On 16 Jun 2007, at 16:34, dimitris wrote:
> Hello.
>
> $VersionNumer
> 5.2
>
> o=Sin[ArcTan[z] + ArcTan[2*z]] -1/Sqrt[2] ;
>
> The equation o=0 has two roots in the real positive axis
>
> Plot[Sin[ArcTan[z] + ArcTan[2*z]] - 1/Sqrt[2], {z, 0, 5}]
>
> In[1]:=
> Needs["NumericalMath`IntervalRoots`"]
>
> In[21]:=
> IntervalBisection[Sin[ArcTan[z] + ArcTan[2*z]] - 1/Sqrt[2], z,
> Interval[{0, 5}], 0.1]
> List @@ %
> (FindRoot[Sin[ArcTan[z] + ArcTan[2*z]] - 1/Sqrt[2] == 0, {z, #1[[1]],
> #1[[2]]}, WorkingPrecision -> 30,
> PrecisionGoal -> 20] & ) /@ %
>
> Out[21]=
> Interval[{0.23437500000000014, 0.31250000000000033}, {1.71875,
> 1.7968750000000009}]
>
> Out[22]=
> {{0.23437500000000014, 0.31250000000000033}, {1.71875,
> 1.7968750000000009}}
>
> Out[23]=
> {{z -> 0.28077640640441513745535298432248087547755357014`30.}, {z ->
> 1.780776406404415137455352463993519256286808059355`30.}}
>
> Solve returns the correct roots.
>
> In[21]:=
> Off[N::meprec]
>
> In[22]:=
> Solve[Sin[ArcTan[z] + ArcTan[2*z]] == 1/Sqrt[2], z]
> FullSimplify[Sin[ArcTan[z] + ArcTan[2*z]] == 1/Sqrt[2] /. %]
>
> Out[22]=
> {{z -> (1/4)*(-3 + Sqrt[17])}, {z -> (1/4)*(3 + Sqrt[17])}}
>
> Out[23]=
> {True, True}
>
> However, it is well known that Solve is not proper for equations like
> o=0.
>
> Let's use Reduce
>
> In[24]:=
> Reduce[Sin[ArcTan[z] + ArcTan[2*z]] == 1/Sqrt[2], z, Reals]
> (*ommited output*)
>
> Let's be more specifically!
>
> In[25]:=
> Reduce[Sin[ArcTan[z] + ArcTan[2*z]] == 1/Sqrt[2] && z > 0, z, Reals]
>
> Out[25]=
> ((-Pi + 4*ArcTan[(1/4)*(-3 + Sqrt[17])] + 4*ArcTan[(1/2)*(-3 +
> Sqrt[17])])/(8*Pi) Integers && z == (1/4)*(-3 + Sqrt[17])) ||
> ((-3*Pi + 4*ArcTan[(1/4)*(3 + Sqrt[17])] + 4*ArcTan[(1/2)*(3 +
> Sqrt[17])])/(8*Pi) Integers && z == (1/4)*(3 + Sqrt[17]))
>
> The roots are correct but it appears a strange condition
>
> ((-Pi + 4*ArcTan[(1/4)*(-3 + Sqrt[17])] + 4*ArcTan[(1/2)*(-3 +
> Sqrt[17])])/(8*Pi) Integers
>
> Any comments?
>
> Dimitris
>
>
First note the answer that Mathematica 6.0 gives:
Reduce[Sin[ArcTan[z] + ArcTan[2*z]] == 1/Sqrt[2] && z > 0, z, Reals]
Reduce::ztest:Unable to decide whether numeric quantities {1/4 (-4
tan-1(1/4 (Power(<<2>>)-3))-4 tan-1(1/2 (Power(<<2>>)-3))+=B9),1/4 (-4 tan-1(1/4 (Power(<<2>>)+3))-4 tan-1(1/2 (Power(<<2>>)+3))+3 =B9)} are
equal to zero. Assuming they are.
z == (1/4)*(-3 + Sqrt[17]) || z == (1/4)*(3 + Sqrt[17])
Do you like it better than the one 5.2 gives? Actually, I think it
equivalent. The quantity about which 6.0 cannot decide if it is ==0
or not is (probably) the same as the one that appears in the answer
to 5.2, where it it is assumed to be an integer. One way to read that
answer is "if certain quantities are integers than the answers are
given below".
I would not call this "bad performance", even when compared with
Solve, unless you would prefer to get no answer at all from Reduce.
Unlike Solve, Reduce is now allowed to give you a "special case" as
an answer; it has to give a "complete answer" or none. But in this
case, it would be able to give a complete answer if it could prove
that certain quantities are integers (or zero in the case of
Mathematica 6). Since Reduce cannot decide this, it has only two
choices: either to return a message "the methods available to Reduce
are insufficient..." etc or to return some kind of conditional
answer. It takes the second course, but the way it does it has been
changed. In version 5, the condition was inserted into the solution.
In version 6, a different approach is used . A message appears saying
that Reduce could not decide something so it is assuming it to be
true and is returning the complete answer but valid only under this
assumption. I personally prefer the approach used by 5.2, because
one can at least try to test the condition that Reduce assumed
numerically. But in version 6 the condition is printed only as part
of a message and because it is long, it is printed in an short form,
so you actually can't tell exactly what the condition that is being
assumed is. In fact, now that I started to think about it, it seems
to me almost a bug, which I hope will be fixed. If some conditions
are being assumed by Reduce they should be available to the user for
farther testing. Is there a way to make Reduce print out this message
in such a way that the complete condition can at least be seen and
copied?
Andrzej Kozlowski
- References:
- bad performance of Reduce (5.2)
- From: dimitris <dimmechan@yahoo.com>
- bad performance of Reduce (5.2)