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 am trying to solve for a variable which appears in the limits of an integral, rather like in the following;

Clear[f, a, x]
f[a_] := Integrate[x^2 + a x, {x, 0, a }]
f[Power[6, (3)^-1]]
NSolve[5 == f[a], a, Reals]

This works absolutely fine. But the integral I really care about is a mess, and so has, of course, no nice closed form. So I try the following;

Clear[f, a, x]
f[a_] := NIntegrate[x^2 + a x, {x, 0, a }]
f[Power[6, (3)^-1]]
NSolve[5 == f[a], a, Reals]

and this does not work. Instead I get NIntegrate::nlim: x = a is not a valid limit of integration. In both of these examples, the third line evaluates the function f[a] fine. I also tried

f[a_?NumericQ] := NIntegrate[x^2 + a x, {x, 0, a }]

which fails with NSolve::nsmet: This system cannot be solved with the methods available to NSolve.

I rather hoped the link below would answer my problem, but of course it refers to Integrate, not NIntegrate.

http://math.stackexchange.com/questions/38012/compute-unknown-limit-from-known-integral-in-mathematica

I'd be very grateful for any suggestions.

share|improve this question

3 Answers 3

up vote 4 down vote accepted
  1. When a is a symbol in f[a_] := NIntegrate[x^2 + a x, {x, 0, a }] you won't get the result.
  2. Defining f[a_?NumericQ] :=NIntegrate[...] it can't work in NSolve[5 == f[a], a, Reals] since a is assumed to be a Symbol therein.

You can use

FindRoot[f[a] - 5, {a, 1}]
{{a -> 1.81712}} 

or you should define f this way:

f[a_] := Integrate[x^2 + a x, {x, 0, a}]
share|improve this answer

Use FindRoot[]

Clear[f, a, x]
x0 = Power[6, (3)^-1];
f[a_?NumericQ] := NIntegrate[x^2 + a x, {x, 0, a}]

(a /. FindRoot[f[a] == 5, {a, 1}]) == N@x0

(* True *)
share|improve this answer

What I would suggest is to do a scan of f[a] over a range of a's that you're interested in. You define an interpolation function to smooth out these values, then either FindRoot or NDSolve f[x] == 5.

share|improve this answer

Your Answer

 
discard

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

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