Group Abstract Group Abstract

Message Boards Message Boards

0
|
9.4K Views
|
6 Replies
|
3 Total Likes
View groups...
Share
Share this post:

why does FindRoot with Integrate inside not always work correctly

Posted 11 years ago

I would like, for a function that I have defined, to find a limit of integration that results in a given value of integration. I am using findroot to find the limit of integration but one way of calling findroot works and another does not and I do not understand the difference in the two ways of calling findroot. With one way of calling I get

findroot fails

and the other way I get

findroot works

The only difference in the two ways of calling is that I changed the format of the call from

FindRoot[f[x]==a,{x,x0}]

to

FindRoot[f[x]-a,{x,x0}]

Can anyone explain why there is a difference in the way Mathematica responds?

POSTED BY: Mike Luntz
6 Replies

For reference, the related discussion is probably http://community.wolfram.com/groups/-/m/t/415464.

POSTED BY: Bruce Miller
Posted 11 years ago

Thanks for the help Daniel. Although I am no longer a youngster I started using Mathematica only recently and am still a novice in its use, a fact that may be obvious from my questions. I will need to think about your replies and those of a similar question I posed on the forum recently before I fully comprehend all the implications of the answers.

POSTED BY: Mike Luntz

Thank you, that is much better.

I played around with this and I can say a couple of things.

(1) This next variant works as expected.

threshold = FindRoot[Integrate[
    fSum[y] /. Catenate[{setb, setp}], {y, detThresh, \[Infinity]}, 
    Assumptions -> Element[detThresh, Reals]] == pfa, {detThresh, initThresh}]

I suspect this means FindRoot has a problem in this case with the ConditionalExpression result from that Integrate (without the Assumptions specification). Offhand I do not know why. I'll poke around if I get a chance.

(2) As I believe was noted in a related thread, it might be better to define the function as a "black box" that only exists when given explicitly numeric input. That would forestall any issues FindRoot might be having with the symbolic Integrate result.

Upshot: there may be a bug, and there are definitely workarounds.

POSTED BY: Daniel Lichtblau

Michael Trott suggests the following variant, as it can be used to handle the issue of ConditionalExpression swallowing Equal.

threshold = FindRoot[Integrate[
    fSum[y] /. Catenate[{setb, setp}], {y, detThresh, \[Infinity]}, 
    Assumptions -> Element[detThresh, Reals]] == pfa, {detThresh, initThresh}, Evaluated->False]

It seems that this Evaluated option is not documented though.

POSTED BY: Daniel Lichtblau
Posted 11 years ago

Daniel,

Sorry for the terse initial post. I mistakenly assumed that the remainder of the code was irrelevant, Here is an example of the complete code.

In[1]:= Clear["Global`*"]

In[2]:= f[x_, b_, p_] = 
 DiracDelta[x] (1 - Exp[-b/p]) + Exp[-(x + b)/p]/p

Out[2]= E^((-b - x)/p)/p + (1 - E^(-(b/p))) DiracDelta[x]

In[3]:= capF[s_] = 
 Assuming[b \[Element] Reals && b > 0, 
  Simplify[LaplaceTransform[f[x, b, p], x, s]]]

Out[3]= (1 + p s - E^(-(b/p)) p s)/(1 + p s)

In[4]:= g[s_, k_] = 
 capF[s] /. {b -> Subscript[b, k], p -> Subscript[p, k]}

Out[4]= (1 + s Subscript[p, k] - 
 E^(-(Subscript[b, k]/Subscript[p, k])) s Subscript[p, k])/(1 + 
 s Subscript[p, k])

In[5]:= fSum[y_] = 
  InverseLaplaceTransform[Expand[Product[g[s, k], {k, 1, 6}]], s, y];

In[6]:= bdb = {83, 92, 96, 99, 100, 95} - 15 - 80  

Out[6]= {-12, -3, 1, 4, 5, 0}

In[7]:= setb = Table[Subscript[b, k] -> 10^(.1 bdb[[k]]), {k, 1, 6}]

Out[7]= {Subscript[b, 1] -> 0.0630957, Subscript[b, 2] -> 0.501187, 
 Subscript[b, 3] -> 1.25893, Subscript[b, 4] -> 2.51189, 
 Subscript[b, 5] -> 3.16228, Subscript[b, 6] -> 1.}

In[8]:= setp = 
 Table[Subscript[p, k] -> 10^(.1 (bdb[[k]] + 15)), {k, 1, 6}] 

Out[8]= {Subscript[p, 1] -> 1.99526, Subscript[p, 2] -> 15.8489, 
 Subscript[p, 3] -> 39.8107, Subscript[p, 4] -> 79.4328, 
 Subscript[p, 5] -> 100., Subscript[p, 6] -> 31.6228}

In[9]:= pfa = .01;
initThresh = 700

Out[10]= 700

In[11]:= threshold = 
 FindRoot[Integrate[
    fSum[y] /. Catenate[{setb, setp}], {y, detThresh, \[Infinity]}] ==
    pfa, {detThresh, initThresh}]

During evaluation of In[11]:= FindRoot::nlnum: The function value {False} is not a list of numbers with dimensions {1} at {detThresh} = {700.}. >>

During evaluation of In[11]:= FindRoot::nlnum: The function value {False} is not a list of numbers with dimensions {1} at {detThresh} = {700.}. >>

Out[11]= FindRoot[\!\(
\*SubsuperscriptBox[\(\[Integral]\), \(detThresh\), \
\(\[Infinity]\)]\(\((fSum[y] /.  
      Catenate[{setb, setp}])\) \[DifferentialD]y\)\) == 
  pfa, {detThresh, initThresh}]

In[12]:= threshold = 
 FindRoot[Integrate[
    fSum[y] /. Catenate[{setb, setp}], {y, detThresh, \[Infinity]}] - 
   pfa, {detThresh, initThresh}]
   {detThresh -> 697.83}

The notebook doesn't look quite like the code above so I am also including an image. If it would help I can also attach the file.

enter image description here

POSTED BY: Mike Luntz
POSTED BY: Daniel Lichtblau
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
Attachments
Remove
or Discard