Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I have the following piece of code:

    y[x_] := (x - 3)^2 + 2
    x[a_] := Sort[Select[x /. NSolve[a == y[x], x], #  ∈ Reals && # > 0 &],Less][[1]]
    x[2]

(* 3 *)

    xx[a_] := Piecewise[{{x[a], a >= 2}}]
    NSolve[xx[a] == 3, a]
(* Part::partw: Part 1 of {} does not exist. >>*) 

(* {} *)

So if $a\geq2$ then x picks the smallest from the list of $2$ elements and xx is just x on the domain where x is defined. Now I want NSolve to return the value of $a$ for which xx[a]=3. Why does the above error show up? If I give the input xx[2] then I get the output 3 as required, but if I put xx[2] in NSolve it apparently evaluates xx[a] first (rather than immediately putting in numerical values for a), which yields the error. How can I fix this, so that NSolve returns the value 2?

I tried Reduce and FindRoot as well, which give the same error.

Note: this seems like a huge hassle for such an easy function, but I'm applying it to some more complicated functions which seemed irrelevant to mention here.

Edit: apparently the problem lies in the Select (and then Sort) part, since NSolve (and all other equation solvers) first puts in a variable a, then computes x[a] (so that selecting the positive reals does not make sense since a is not yet a number) and only then starts putting in the values of a... So the solution would be to create another equation solving function than the ones Mathematica has.

share|improve this question
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Browse other questions tagged or ask your own question.