Mathematica Stack Exchange is a question and answer site for users of Mathematica. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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.

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

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}]

enter image description here

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])  *)
share|improve this answer
    
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]] – marcom Jan 31 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 *)
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.