0
$\begingroup$

This question has to do with error handling, I guess.

I am using Brent's Method in order to numerically find the root of a function. This is just an example of what I am doing:

functionexample[a_, b_, c_, x_] := Sin[a*x] + Cos[b*x] + Log[c*x]
rootexample[a_, b_, c_, result_] := 
 FindRoot[functionexample[a, b, c, x] == result, {x, 1, 12}, 
    Method -> "Brent", PrecisionGoal -> 16][[1]][[2]]
a = 1
b = 1
c = 1
Plot[{functionexample[a, b, c, x], 2, 4}, {x, 1, 12}, 
 PlotRange -> Automatic]
rootexample[a, b, c, 2]
rootexample[a, b, c, 4]

And this is what I get:

MWE Mathematica

So, at the end rootexample[1, 1, 1, 4] (that's when Brent's Method returns an error message) seems to take value 4.

I would like to define rootexample[a_, b_, c_, result_] in such a way that when an error arises in the root finding procedure, an special value is assigned to the result of the function (something like "" or Null or None or something similar).

[EDIT: The idea is: if there is a root, then return the root; if not, then return None.]

I mean, I would like to properly control/handle possible errors coming from Brent's Method within the definition of the function rootexample.

I have no idea about how to do this.

$\endgroup$
0
1
$\begingroup$

Like stated in the duplicate's link:

functionexample[a_, b_, c_, x_] := Sin[a*x] + Cos[b*x] + Log[c*x]
rootexample[a_, b_, c_, result_] := 
  FindRoot[functionexample[a, b, c, x] == result, {x, 1, 12}, 
    Method -> "Brent", PrecisionGoal -> 16][[1, 2]]
a = 1; b = 1; c = 1;
Quiet[Table[
  Check[rootexample[a, b, c, i], "NaN", {FindRoot::bbrac}], {i, -5, 5}],
  {FindRoot::bbrac}]

{NaN,NaN,NaN,NaN,NaN,NaN,NaN,5.68433,NaN,NaN,NaN}

Or if you want it as a function:

quietrootexample[a_, b_, c_, result_] := 
  Quiet@Check[rootexample[a, b, c, result], "NaN", {FindRoot::bbrac}]
quietrootexample[a, b, c, #] & /@ Range@5

{NaN,5.68433,NaN,NaN,NaN}

$\endgroup$
3
  • $\begingroup$ Thank you. I don't know what to do about the "duplicating" issue. I think the other question is very similar, but I wanted it to be applied to a function. In fact, even if I had seen that possible duplicate, I would still have asked my question. And, actually... I still have to check and understand what is the meaning of that syntax, with @ and so on —I am still a beginner on Mathematica. $\endgroup$
    – Vicent
    Jul 10 '14 at 14:47
  • 2
    $\begingroup$ @Vicent Quiet[...] is equivalent to Quiet@... $\endgroup$
    – Öskå
    Jul 10 '14 at 14:50
  • $\begingroup$ Thank you! I find the syntax of Mathematica a little bit strange sometimes, but it is very powerful, I think. $\endgroup$
    – Vicent
    Jul 10 '14 at 15:08

Not the answer you're looking for? Browse other questions tagged or ask your own question.