[Date Index]
[Thread Index]
[Author Index]
Re: FindInstance puzzler
*To*: mathgroup at smc.vnet.net
*Subject*: [mg83753] Re: FindInstance puzzler
*From*: Andrzej Kozlowski <akoz at mimuw.edu.pl>
*Date*: Thu, 29 Nov 2007 06:39:59 -0500 (EST)
*References*: <20071129005504.373$Gf_-_@newsreader.com>
On 29 Nov 2007, at 14:55, David W. Cantrell wrote:
>
> Andrzej Kozlowski <akoz at mimuw.edu.pl> wrote:
>> On 28 Nov 2007, at 05:40, Adam Strzebonski wrote:
>>
>>> Andrzej Kozlowski wrote:
>>>> *This message was transferred with a trial version of
>>>> CommuniGate(tm) Pro*
>>>> On 27 Nov 2007, at 17:05, Andrzej Kozlowski wrote:
>>>>> Reduce[2*y*I*Sqrt[x] + 2*(y - I*Sqrt[x]) == 0, {x, y}, Reals]
>>>> This should have been:
>>>> In[17]:= Reduce[2*y*I*Sqrt[x] + 2*(y - y*I*Sqrt[x]) == 0,
>>>> {x, y}, Reals]
>>>> During evaluation of In[17]:= Reduce::nddc:The system 2 \
>>>> [ImaginaryI] Sqrt[x] y+2 (y-\[ImaginaryI] Sqrt[x] y)\[LongEqual]0
>>>> contains a nonreal constant 2 \[ImaginaryI]. With the domain \
>>>> [DoubleStruckCapitalR] specified, all constants should be real. >>
>>>> Out[17]= Reduce[2*I*Sqrt[x]*y + 2*(y - I*Sqrt[x]*y) == 0,
>>>> {x, y}, Reals]
>>>> but it other than that it does not change anything. Note that:
>>>> Reduce[Simplify[2*y*I*Sqrt[x] + 2*(y - y*I*Sqrt[x]) == 0], {x, y},
>>>> Reals]
>>>> y==0
>>>> What I really mean tto say is: wouldn't it be a litte better to
>>>> first automatically apply Simplify in such situation to see if
>>>> the =
>>
>>>> I's could be got rid of?
>>>> Andrzej Kozlowski
>>>
>>> It think this behaviour is correct. Reduce should disallow any non-
>>> real
>>> subexpressions when the domain Reals is specified. The fact that it
>>> cannot detect potentially non-real functions that cancel during
>>> input
>>> processing is more problematic, but hard to avoid.
>>>
>>> Adam Strzebonski
>>
>> Well yes, but... There are plenty of real valued functions for which
>> it is hard to give an explicit expression not involving complex
>> numbers.
>
> Agreed, but the function below is not a very good example since it's
> just
> Sqrt[Abs[Sin[x]]]. Does anyone know how to get Mathematica to make
> that
> simplification when x is real?
>
>> For example, the function
>>
>> g[x_] := Sec[(1/2)*Arg[I*Sin[x]]]*(Sqrt[I*Sin[x]] -
>> I*Sqrt[Abs[Sin[x]]]*Sin[(1/2)*Arg[I*Sin[x]]])
>>
>> is always real valued for real x. In fact, Mathematica is able to
>> show
>> that this is so:
>>
>> ComplexExpand[Im[g[x]], TargetFunctions -> {Re, Im}]
>> 0
>>
>> Moreover, Mathematica can even solve (well, almost) the following:
>>
>> Reduce[g[x] == 1 && Element[x, Reals], x]
>>
>> Reduce::ztest:Unable to decide whether numeric quantities {1/8 (-8
>> tan-1(1-Power(<<2>>))-=CF=80)} are equal to zero. Assuming they
>> are. >>
>>
>> Element[C[1], Integers] && (x == (1/2)*(4*Pi*C[1] - Pi) || x ==
>> (1/2)*(4*Pi*C[1] + 3*Pi) || x == (1/2)*(4*Pi*C[1] + Pi))
>>
>> But even so, it won't even touch:
>>
>> Reduce[g[x] == 1, x,Reals]
>
> OTOH, Mathematica (at least version 5.2) does the following without
> complaint:
>
> In[6]:= Reduce[Sqrt[Abs[Sin[x]]] == 1, x, Reals]
>
> Out[6]= Element[C[1], Integers] && (x == -(Pi/2) + 2*Pi*C[1] ||
> x == (3*Pi)/2 + 2*Pi*C[1] || x == Pi/2 + 2*Pi*C[1])
>
> That result is obviously equivalent to just
>
> Element[C[1], Integers] && x == Pi/2 + Pi*C[1].
>
> I would guess that there might be an easy way to get
> Mathematica to simplify Out[6] to something like
> Element[C[1], Integers] && x == Pi/2 + Pi*C[1]. Is there such a way?
>
> David W. Cantrell
I don't think there is any "general" way to "simplify" expressions
like this because they involve integers (C[1]) and algorithms on
which "symbolic deduction" is based, such as quantifier elimination,
CAD etc, work over the reals (or the complexes). Of course some
"simplifications" of this kind can be implemented using
"heuristics" (and indeed, are in other places in Mathematica) but as
this would be of limited use it seems to me unlikely to have been done.
In a way it is somewhat counter-intuitive that "deduction" is so much
harder when integers are involved rather than reals or complexes. Here
is an illustration (although it has almost nothing to do with your
question, it is meant to illustrate that "deduction" with integers is
"hard" for computer programs)
Mathematica can do this:
Resolve[ForAll[y, Element[y, Reals], Exists[x, Element[x, Reals],
x^2 == y]]]
False
and it also can do this:
Resolve[ForAll[y, Element[y, Reals], Exists[x, Element[x, Complexes],
x^2 == y]]]
True
But, perhaps surprisingly, it cannot do this:
Resolve[ForAll[y, Element[y, Integers], Exists[x, Element[x, Integers],
x^2 == y]]]
ForAll[y, Element[y, Integers],
Exists[x, Element[x, Integers], x^2 == y]]
One could argue that this ought to be trivial since Integers are Reals
and the answer for Reals is False. Indeed, this particular case and
similar ones could be implemented in Mathematica by simply replacing
Integers everywhere with Reals. If the answer is False for Reals so it
must be for Integers. But as this would only work for a small subset
of problems of this type it was (probably) felt not worth implementing.
In your case, of course, the problem is not equivalent to one about
Reals and, although something probably could be done to deal with such
simple cases, I think it was also felt that the lack of general
methods does not make doing this worth the effort.
(Of course I am only guessing and it may even turn out that there is
some clever way to do what you want. )
Andrzej Kozlowski
Prev by Date:
**Re: optimization routine using conjugate gradient (or other) method?**
Next by Date:
**Re: FindInstance puzzler**
Previous by thread:
**Re: FindInstance puzzler**
Next by thread:
**Re: FindInstance puzzler**
| |