# Prove (or check) an expression is positive given constraints on variables?

I'm trying to figure out whether an expression is always positive given positive parameters. When the expression is complicated, I can't do this by eye. Is there any way to make Mathematica prove (that is, check) if j is positive for positive c, d, k, ton, toff, V?

j=-2 c d k toff ton - d^2 k toff ton - 2 c k toff^2 ton -
2 d k toff^2 ton - k toff^3 ton - 2 c d k ton^2 - d^2 k ton^2 -
4 c k toff ton^2 - 4 d k toff ton^2 - 3 k toff^2 ton^2 -
2 c k ton^3 - 2 d k ton^3 - 3 k toff ton^3 -
k ton^4 + (Sqrt[k] Sqrt[ton] (toff + ton) Sqrt[
d + toff +
ton] (2 c + d + toff +
ton) \[Sqrt]((c + d) k ton (c + toff + ton) (d + toff + ton) +
4 c d ((d + toff + ton) (k toff + (toff + ton)^2) +
c (k toff +
d (toff + ton) + (toff + ton)^2)) V))/(2 Sqrt[(c +
d) (c + toff + ton)]) + (Sqrt[k] Sqrt[
ton] (toff + ton) Sqrt[(c + d) (c + toff + ton)] Sqrt[
d + toff +
ton] (k ton (d + toff + ton) (2 c + d + toff + ton) +
4 d ((d + toff + ton) (k toff + (toff + ton)^2) +
2 c (k toff +
d (toff + ton) + (toff + ton)^2)) V))/(2 \[Sqrt]((c +
d) k ton (c + toff + ton) (d + toff + ton) +
4 c d ((d + toff + ton) (k toff + (toff + ton)^2) +
c (k toff + d (toff + ton) + (toff + ton)^2)) V))


I have many more expressions like this. I have tried putting in random values of the parameters and I do (so far) always get positive values. But I'd prefer something more convincing than a Monte Carlo argument for this (and other) complicated expressions being positive for any positive inputs. Thoughts?

-

Let's define:

f[c_, d_, k_, toff_, ton_, V_] := "the expression equal to j"


Instead of using toff, ton and V I'll use x, y, z. Moreover we define:

assumptions = c > 0 && d > 0 && k > 0 && x > 0 && y > 0 && z > 0;


In case of simpler functions we would try to do something like this:

Reduce[ f[c, d, k, x, y, z] > 0 && assumptions, {c, d, k, x, y, z}]


Although I favor exact symbolic results it would be quite inefficient to prove symbolically that f[c, d, k, x, y, z] is positive when its arguments are restricted by assumptions. In fact much faster way would harness certain numerical functions. Since we would like to prove that f[c, d, k, x, y, z] is positive there should be an extremal value of the function given positive arguments.
Therefore we can exploit NMinimize with appropriate constraints, it's the fastest way for such an involved expression.

NMinimize[{ f[c, d, k, x, y, z], assumptions}, {c, d, k, x, y, z}]

{5.05906*10^-12, {c -> 2.52667, d -> 14.2925, k -> 0.273797,
x -> 5.88427, y -> 6.14607, z -> 0.          }}


We've found that the minimum is a positive number for real numbers constrained by assumptions. Thus we are ensured that f[c, d, k, x, y, z] > 0 for all positive arguments. Moreover the result is returned in less than a half of second while with Reduce it would take at least a few minutes.

-
Another idea to avoid assumptions: NMinimize[j /. (Thread[# -> #^2]), #] &@Variables[j] replaces all variables by their squares first. –  Jens May 2 at 23:59
Awesome, thanks so much for your help. Two questions: 1. if we assumed z>0, why is it returning v=0? Shouldn't that be explicitly prohibited? 2. I'm getting not quite the same result: {-9.09495*10^-12, {c -> 2.52665, d -> 14.2924, k -> 0.274061, x -> 5.88441, y -> 6.14624, z -> 0.}} The parameters are the same, but the function value is different (and negative). It's also extraordinarily small, so do we chalk this up to round-off error? Thanks for your time! –  vector07 May 3 at 17:22
@vector07 NMinimize yields numerical approximations so z -> 0. means that the minimum is at 0 (within the default precission) however for z > 0 the value of f should be greater. If you find some inconsistency of the result you should provide your input to the original question editing it. I suppose you've done some mistake with your input. I checked my result with another functions an it was always positive. –  Artes May 3 at 18:18
Think it's just roundoff error. Thanks. –  vector07 May 3 at 18:27