How to test whether a function is positive over the entire range of an interval?

I would like to test whether a function is positive over a given interval. Say I have f[x_] = -x^3 + x^2 + 7*x and wanted to know whether it is positive for all x in the interval [0,4]?

It can easily seen by plotting the function that it is not, but I would like to have a more formal test in the form of "TrueForAll[f[x] > 0, {x,0,4}]".

It is probably a trivial problem, but I haven't managed to figure it out myself. So I am grateful for any advice.

• Reduce[ForAll[x, 0 <= x <= 4 \[Implies] -x^3 + x^2 + 7*x > 0]]? (Or FullSimplify instead of Reduce.) Jan 30 '16 at 19:56
• @Michael I think we don't need Implies here: Reduce[ForAll[x, x <= 0 <= 4, f[x] > 0]] Jan 30 '16 at 20:05
• @Szabolcs I forgot about that form. I hardly ever use ForAll.... Jan 30 '16 at 20:09
• @Szabolcs You have a great solution. Why not post it as an answer? Jan 30 '16 at 20:56
• @Pavlo I was waiting for Michael to do it. Jan 30 '16 at 21:33

To find the intervals for which f[x] is positive

f[x_] = -x^3 + x^2 + 7*x;

g[x_] = Piecewise[{{f[x], f[x] > 0}}, I];

Plot[{f[x], g[x]}, {x, -3, 4},
PlotStyle -> {Directive[Red, Dashed], Blue}]


FunctionDomain[g[x], x]

(*  x < (1/2)*(1 - Sqrt[29]) ||
0 < x < (1/2)*(1 + Sqrt[29])  *)

% // N

(*  x < -2.19258 || 0. < x < 3.19258  *)


EDIT:

Or, more succinctly

FunctionDomain[Piecewise[{{1, f[x] > 0}}, I], x]

(*  x < (1/2)*(1 - Sqrt[29]) ||
0 < x < (1/2)*(1 + Sqrt[29])  *)

• Thanks everyone for these extremely helpful answers and comments. Bob Hanlon's answer is great because it provides a more comprehensive picture of the function's characteristics, although it does not perform the True/False test I was looking for. I have found that it can easily be combined with @Michael's and @Szabolcs' approach, however: xpos = FunctionDomain[Piecewise[{{1, f[x] > 0}}, I], x]; Reduce[ForAll[x, 0 <= x <= 4, xpos]] Jan 31 '16 at 19:28

I like the answers using Reduce and FunctionDomain. Here's a numerical possibility that uses Minimize to find the global minimum on the domain and tests to see if it's positive.

f[x_] = -x^3 + x^2 + 7*x;
0 <= First@Minimize[{f[x], 0 <= x <= 4}, x]
(* False *)


Alternatively, if needed, you can use NMinimize:

NMinimize[{f[x], 0 <= x <= 4}, x]
(* {-20., {x -> 4.}} *)
0 <= First@NMinimize[{f[x], 0 <= x <= 4}, x]
(* False *)