3
$\begingroup$

Forgive me if this question has been asked prior (I wouldn't even know where to start looking for an answer to this problem to be honest). I know the following code in Mathematica works:

temp = {x^2,Sin[x]}; (* Just a random list with functions inside *) f = Function[x,Evaluate[temp[[1]]]]; f[3] 

The code would output the appropriate 9 as required. However, the problem occurs when I try to use a similar logic within a Manipulate function as shown below:

Manipulate[ Module[{temp,f}, temp = {x^2,Sin[x]}; f = Function[x,Evaluate[temp[[1]]]]; {num, f[num]}], {num, 3}] 

Running the above code yields an output {3, x^2} and it doesn't change for any num. Any suggestions would be exceedingly helpful. For context as to why I'm doing this, I'm solving a differential equation within the Manipulate expression (where end conditions are manipulated by the controls). Using DSolve outputs the required functions in a list and I would simply like to graph them and their derivatives. If you know a better method of doing that, that would also be helpful.

Update

It appears that the problem is, in fact, with variable typing as shown below:

temp = {x^2, Sin[x]}; (*Just a random list with functions inside*) f = Function[x, Evaluate[temp[[1]]]]; f[3] Manipulate[ Module[{temp, f}, temp = {x^2, Sin[x]}; f = Function[x, Evaluate[temp[[1]]]]; {Head[temp], Head[f], Head[f[num]], Head[f[3]]}], {num, 5}] {Head[temp], Head[f], Head[f[3]]} 

Note that the Head[f[num]] and Head[f[3]] within the Manipulate expression evaluate to Power whereas the Head[f[3]] outside evaluates to Integer (as expected). Using IntegerPart[] however still doesn't yield an appropriate answer. Any thoughts?

$\endgroup$

1 Answer 1

3
$\begingroup$

I misdiagnosed the problem originally, somehow assuming Manipulate was the culprit, when in fact it is Module, as @Kuba pointed out (thanks!). This is discussed in this Q&A:

Enforcing correct variable bindings and avoiding renamings for conflicting variables in nested scoping constructs

I would add that renaming the argument x to x$ in Function[x, Evaluate[body]] occurs whenever the body contains Module variables other than the Function argument(s).

Module[{temp, f}, temp = {x^2, Sin[x]}; f = Function[x, Evaluate[temp[[1]]]]; f] (* Function[x$, x^2] *) 

However, no renaming occurs in the following, even though x is a Module variable: the argument stays x and perhaps unexpectedly, the instances of x in the body are not renamed to the Module variable x$746197, even though the expression is evaluated first. (This is discussed in "I define a variable as local to a module BUT then the module uses its global value! Why?")

Module[{temp, f, x}, f = Function[x, Evaluate[{x^2, Sin[x]}[[1]]]]; {x, f}] (* {x$746197, Function[x, x^2]} *) 

Original answer:

Under certain conditions, localized variables are changed when code is inserted into the localized body:

Manipulate[ Module[{temp, f}, temp = {x^2, Sin[x]}; f = Function[x, Evaluate[temp[[1]]]]; {num, f[num], f}], {num, 3}] 

Mathematica graphics

Note that the function argument has been changed to x$, which does not match the x in the body. I'm not sure why; "Manipulate is a strange beast" has been said before.

Try this:

Manipulate[ Module[{temp, f}, temp = {x^2, Sin[x]}; f = Function @@ {x, temp[[1]]}; {num, f[num], f}], {num, 3}] 

Mathematica graphics

Related:

$\endgroup$
4
  • $\begingroup$ Thank you very much; out of curiosity, could you explain what the Function @@ {....} did, as opposed to the normal function call, to make it work as expected? $\endgroup$ Commented Mar 20, 2018 at 3:30
  • $\begingroup$ @Tired_College_Student The list {x, ...} (= List[x, temp[[1]]}) is evaluated before the head List` is replaced by Function. So the body is not changed after Function is in place, but before. If the body is changed after, the parameter x is renamed x$. Manipulate reprocesses its code, rewriting its variables, such as num, by adding $$ to them (e.g. num$$) and so forth -- it's somewhat complicated, too much so for a comment. I think somehow this causes the x to become x$ when inside the Manipulate. $\endgroup$ Commented Mar 20, 2018 at 3:37
  • 1
    $\begingroup$ "I'm not sure why" - unless I missed your point, because of the standard renaming: mathematica.stackexchange.com/q/20766/5478 $\endgroup$ Commented Mar 20, 2018 at 6:53
  • $\begingroup$ @Kuba I guess I was tired. I didn't check Module and assumed it was Manipulate. The Q&A you linked mainly discusses Module[{x,..}, Function[x, Evaluate[..]]], or so it seems to me; but the renaming of x occurs whenever the Evaluate[..] contains any Module variables, whether there is a naming conflict or not. Nonetheless, this seems to be dupe. $\endgroup$ Commented Mar 20, 2018 at 11:46

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.