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.

In case I want to know whether a given function $f(t)$ have some property, I tried to write something like this:

IsSuppFun[f_[t_]] := Resolve[
ForAll[t, 0 <=t <= 2&&t\[Element] Reals,
 f[t] + D[f[t], {t, 2}] >= 0]]

Which means, if the given function satisfies the condition: $f(t)+f''(t)\geq 0$ for all $0\leq t\leq 2$, then return TRUE, else return False.

The problem is that it is not work as I supposed, for example, if I define

F[t_]:=t^2-3

then the output is:

IsSuppFun[-3 + t^2]

If I separate the code as

Resolve[ForAll[t, 0 <= t <= 2 Pi && t \[Element] Reals, F[t] + F''[t] >= 0]]

Which will get the Right Answer!

Where did I go wrong?

Solution is use the HoldAll attribute for the function IsSuppFun, Please see below for the answer!


there is my another problem in the same line: If I have tried to add another condition as:

SetAttributes[IsSuppFun, HoldAll]
IsSuppFun[f_[t_]] := 
Resolve[ForAll[t, 0 <= t <= 2 && t \[Element] Reals, (f[t] + D[f[t], {t, 2}] >= 0)&&(f[0]==f[2])]]

then with the same test function:

F[t_] := t^2 - 3

the output is not as desired True or False, but as:

\!\(\*SubscriptBox[\(\[ForAll]\), \(t\)]\(! \((0 <= t <= 2 &&  t \[Element] Reals)\)\)\)

May be I should change the last question as (to make things clear and simple):

SetAttributes[{IsSuppFun}, HoldAll]
IsSuppFun[f_[t_]] := Resolve[
ForAll[t,
0<= t <= 2 && t \[Element] Reals,
f[1] >= 0]
]

with the test function as:

F[t_] := Sin[t]

then the output of

IsSuppFun[F[t]]

is True; But if I have change it as

SetAttributes[{IsSuppFun}, HoldAll]
IsSuppFun[f_[t_]] := Resolve[
ForAll[t,
0<= t <= 2 && t \[Element] Reals,
f[1] <= 0]
]

Then the same test function gives neither True nor False. (I Suppose it False!) Why?

share|improve this question
    
I think the problem is specifying the function's argument in IsSuppFun. Try : bigF[t_] = t^2 - 3; IsSuppFun[bigF]. –  b.gatessucks Oct 19 '12 at 10:38
    
van abel, I think you are still confusing the second and third arguments of ForAll perhaps? In your added example you are essentially doing: Resolve[ForAll[t, 0 <= t <= 2 && t \[Element] Reals, False]] because F[0]==F[2] is False. –  Mr.Wizard Oct 19 '12 at 11:21

3 Answers 3

This answer intends to answer both parts of the question. Originally it answered only the first part. Below is the original answer. Scroll down for the second part.


I interchanged the third and second argument of ForAll and gave the function IsSuppFun attribute HoldAll, and it worked!

So I wrote

SetAttributes[IsSuppFun, HoldAll]
IsSuppFun[f_[t_]] := 
 Resolve[
  ForAll[
   t,
   0 <= t <= 2 ,
   f[t] + D[f[t], {t, 2}] >= 0
   ]
  ]

(*testcase*)

f[t_] := t^4

Then

IsSuppFun[f[x]]

Evaluates to True.


Second part

I removed the t \[Element] Reals, because it seemed redundant, or possibly wrong syntax. As it turned out, the new function worked.

SetAttributes[IsSuppFunGE, HoldAll]
IsSuppFunGE[f_[t_]] :=
  Resolve[ForAll[t, 0 <= t <= 2, f[1] >= 0]];

(* testcases*)
f[t_] := Sin[t];
g[t_] := Sin[t] - 2;
h[t_] := Cos[t] + 1;

Given these definitions,

{IsSuppFunGE[f[x]] , IsSuppFunGE[g[x]], IsSuppFunGE[h[x]]}

evaluates to

{True, False, True}

The question may arise if Mathematica is still using real numbers, as this is now not specified. The fact that the expression

Resolve[ForAll[t, 0 <= t <= 4, t != Pi]]

evaluates to False, may add confidence that it does indeed use real numbers (already).

share|improve this answer
    
Jacob, you can select your block of code in the editor and click the { } symbol above it to format your code. –  Mr.Wizard Oct 19 '12 at 10:44
    
Ok, I will try. Thanks! –  Jacob Akkerboom Oct 19 '12 at 10:47
    
Don't miss this: mathematica.stackexchange.com/editing-help –  Mr.Wizard Oct 19 '12 at 10:48
    
Yes, I have made some mistake in the first edition, in which I have misplace the second and third parameter of ForAll. –  van abel Oct 19 '12 at 10:48
    
@Mr.Wizard thanks, I have checked it out. Now, as our answers are equivalent (I guess t \[Element] Reals only makes a difference if it is put before the inequalities), I suppose I should delete my answer. Correct? –  Jacob Akkerboom Oct 19 '12 at 11:09

You may be able to get what you want by setting a Hold attribute on your function:

SetAttributes[IsSuppFun, HoldAll]

IsSuppFun[f_[t_]] := 
 Resolve[ForAll[t, 0 <= t <= 2 && t \[Element] Reals, f[t] + D[f[t], {t, 2}] >= 0]]

f[t_] := t^2 - 3

IsSuppFun[f[t]]

False

share|improve this answer
    
That works, Thanks! –  van abel Oct 19 '12 at 10:46
    
Sorry, there still some problem, if I replace f by F in the test case, then the output has changed! –  van abel Oct 19 '12 at 10:51
    
@vanabel your comment got cut off -- I changed F to f just as a matter of habit, but I forgot to try it the other way first. I'll do that now. –  Mr.Wizard Oct 19 '12 at 10:53
    
@van abel it seems to still work the same for me. Perhaps you could to do a ClearAll[IsSuppFun, f, F, t] and test it again? –  Mr.Wizard Oct 19 '12 at 10:55
    
Yes, I have tested again, it works for me too! Thanks, but there is another problem, if I have tried to add a condition to the third parameter, why it not works? :(f[t] + D[f[t], {t, 2}] >= 0) && (f[0] == f[2]) –  van abel Oct 19 '12 at 11:02

I would use this Convert an expression to a Function as follows

 IsSuppFun[F_] := Module[{t,f= extractPureFunction[F]}, Resolve[
      ForAll[t, 0 <=t <= 2&&t\[Element] Reals,
      f[t] + D[f[t], {t, 2}] >= 0]]]

so that I don't have to worry about which variable is used.

The credit for the extractPureFunction that I use goes to Daniel Lichtblau

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.