Re: Re: Re: solve and Abs
- To: mathgroup at smc.vnet.net
- Subject: [mg69531] Re: [mg69456] Re: [mg69398] Re: solve and Abs
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Thu, 14 Sep 2006 06:57:30 -0400 (EDT)
On 14 Sep 2006, at 14:32, Andrzej Kozlowski wrote:
>
> On 14 Sep 2006, at 08:21, Andrzej Kozlowski wrote:
>
>>
>> On 13 Sep 2006, at 23:51, Daniel Lichtblau wrote:
>>
>>> Andrzej Kozlowski wrote:
>>>> On 12 Sep 2006, at 20:40, Peter Pein wrote:
>>>>> Andrzej Kozlowski schrieb:
>>>>>
>>>>>>
>>>>>> On 10 Sep 2006, at 20:20, Peter Pein wrote:
>>>>>>
>>>>>>
>>>>>>> Richard J. Fateman schrieb:
>>>>>>>
>>>>>>>> Is there a reason (in 5.1) for Solve[x-Abs[x]==0,x] to
>>>>>>>> return {{}}?
>>>>>>>> This supposedly means all variables can have all possible
>>>>>>>> values.
>>>>>>>>
>>>>>>>> Reduce does better.
>>>>>>>>
>>>>>>>
>>>>>>> Oops, I should have read further...
>>>>>>> Help says
>>>>>>> "Solve gives {{}} if all variables can have all possible
>>>>>>> values."
>>>>>>> I would consider this a bug, not a feature.
>>>>>>>
>>>>>>> Sorry for overhasty posting,
>>>>>>> Peter
>>>>>>>
>>>>>>
>>>>>> However, the documentation does not say "Solve gives {{}} if
>>>>>> and only if all variables can have all possible values."
>>>>>> There are other cases when Solve returns {{}}. For example,
>>>>>> Solve also gives {{}} when, for example, there is no
>>>>>> "generic" solution. (This is stated in the Help also). In
>>>>>> addition, although this does not seem to be stated, Solve
>>>>>> never returns solutions that would have to be given in
>>>>>> conditional form (like the solution returned in this example
>>>>>> by Reduce). This does not appear to be stated in the help but
>>>>>> has been pointed out several times on this list.
>>>>>>
>>>>>> Andrzej Kozlowski
>>>>>> Tokyo, Japan
>>>>>>
>>>>>
>>>>> all variables can have all possible values =:AVAPV
>>>>> solve rteurns {{}} =:SRE
>>>>>
>>>>> But if AVAPV=>SRE but not SRE=>AVAPV, what use has SRE? It
>>>>> would be better to admit "no solutions found" (by returning {}).
>>>>> Or am I completely wrong?
>>>>>
>>>>> Confused greetings,
>>>>> Peter
>>>> Oops, I think you are right. In fact, when Solve can find no
>>>> generic solutions it returns {} and not {{}}.
>>>> Solve[{x + y == 1, x + y == a}, {x, y}]
>>>> {}
>>>> So it does seem that {} has a different meaning from {{}},
>>>> which makes me now also confused ;-)
>>>> Andrzej
>>>
>>> An empty result, {}, indicates that either there are no generic
>>> solutions (as in the case above, because all solutions force a
>>> parameter constraint a==1), or else that Solve found no
>>> solutions (can happen e.g. with transcendentals that get
>>> "algebraicized" but then fail to yield viable solutions using
>>> Solve's creaky technology).
>>>
>>> An AVAPV result, in the terminology above, is a different fish.
>>> It means any value for the solve variable(s) will satisfy the
>>> "polynomialized" problem. So what does that mean? In the simple
>>> case that began this thread, Abs[x] is converted to Sqrt[x^2]
>>> (which many will realize is already a mistake off the real line.
>>> C'est la vie.) We make a new variable y which "encapsulates" Sqrt
>>> [x^2], and new equation y^2==(Sqrt[x^2])^2==x^2. So we are doing,
>>> in effect,
>>>
>>> Solve[{x==y,y^2==x^2}, x, y]
>>>
>>> (that is, eliminating y).
>>>
>>> This correctly returns {{}}. Ordinarily when radicals are present
>>> Solve understands that parasite solutions may be found, and makes
>>> an attempt to check them. But in this case what can it check,
>>> when every possible value is a viable solution? So {{}} is the
>>> returned result.
>>>
>>> Generally speaking, {{}} will be returned if there is some
>>> continuum on which all values are viable results. This is because
>>> a continuum of solutions implies (e.g. by the identity theorem of
>>> complex analysis) that, after polynomialization, all values are
>>> solutions. Even worse, there can be cases where all solutions
>>> will be parasites but algebraicization caused a continuum of
>>> apparent solutions to appear, etc. etc.
>>>
>>>
>>> Daniel Lichtblau
>>> Wolfram Research
>>
>>
>> Would it not be better, however, to be less ambitious here and
>> also return the usual message about the presence of "non-algebraic
>> functions"? Perhaps, this ought to be done as soon as the presence
>> of Abs in the equations is detected. At least this might avoid
>> postings like the one that started this thread.
>>
>> Andrzej Kozlowski
>
> Now that I have looked at this a little more closely, the situation
> looks even more confusing ;-)
>
> I guess, in the strictest sense, the correct behaviour of Solve in
> this situation is what we get when we evaluate:
>
>
> Solve[Sqrt[Im[x]^2 + Re[x]^2] == x, x]
>
> The difference between this and what Mathematica actually does in
> the example that started this thread can be expressed in the
> following way: when Solve sees Abs[x] it replaces it by
> ComplexExpand[Abs[x],TargetFunctions->{Re,Im}] while strictly
> speaking it should use ComplexExpand[Abs[x],{x},TargetFunctions->
> {Re,Im}].
>
> But compare the above with the following example:
>
>
> Solve[Abs[x] == 1, x]
>
> Solve::"Inverse functions are being used by Solve so some
> solutions may not be found; use
> Reduce for complete solution information.
>
> {{x -> -1}, {x -> 1}}
>
> Note that this time we get the "inverse functions" message, which
> is also somewhat confusing. What "inverse functions"? Presumably
> the "inverse functions" of x->Abs[x] referred to are the functions
> x->x and x->-x. If the same method were to be used in the original
> problem the answer should be some kind of "union" of the following
> two.
>
> Solve[x == x, x]
> {{}}
> Solve[x == -x, x]
> {{x -> 0}}
>
> It is not clear to me whether that ought to be {{}} or {{x->0}} or
> what. Moreover, note that
>
>
> Solve[Sqrt[x^2] == 1, x]
>
> {{x -> -1}, {x -> 1}}
>
> with no message, so this time Abs[x] is clearly not replaced by Sqrt
> [x]^2 (ComplexExpand[Abs[x],TargetFunctions->{Re,Im}]).
>
> Of course Daniel has already acknowledged replacing Abs[x] by Sqrt
> [x]^2 is a "mistake of the real line". Presumably the original
> justification for this is based on Mathematica's basic principle:
> it is better to return a partially correct answer than no answer at
> all. Since considering Abs[x] in the complex plane would
> practically guarantee that no useful answer will be returned, one
> might as well make the tacit assumption that x is real and try to
> see if an answer can be given.
> However, it seems to me that this approach, which was very natural
> in early versions of Mathematica, is less appropriate now, when
> computing power is much greater and Reduce can often return full
> and rigorous answers to such problems. I would argue that the right
> approach for Solve nowadays is this: when given a polynomial
> equation (or one that is equivalent to a polynomial equation) try
> to give a complete solution (with the provision of non-generic
> solutions and "equations satisifed for all values of the variables,
> like Solve[x==x,x]). When given an equation an algebraic involving
> radicals and parameters a message about possible parasite solutions
> should be issued. With any equation involving non-algebric
> functions including Abs is given a message about the presence of
> non-algebriac functions and a disclaimer concerning the possibility
> of additional solutions as well as the possibility of "parasite"
> solutions should be issued and, if possible, some kind of solution
> should be returned, on the principle "better this than
> nothing" (with the user having the full knowledge that this is what
> he is getting). However, using this principle the solution {{x-
> >0}} would appear to me to be better than the solution {{}}.
> Admittedly, the latter is not quite "nothing" ( compare it with
> Solve[x==x,x]) but it is certainly nothing in particular. And it
> seems to me that "something" is a little better than "nothing in
> particular".
>
> Andrzej Kozlowski
>
>
An additional reason for using the solution {{x->0}} has occurred to
me: it can actually be verified, unlike the solution {{}}, which is
of course false on the whole real line. So yes, it seems to me that a
message about non-algebraic functions (or inverse functions) and the
solution {{x->0}} would be one reasonable way to handle this problem.
The other would be just the message and the empty solution set.
Andrzej Kozlowski