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