4
$\begingroup$

This question already has an answer here:

I was hoping to be able to use MMA's minimization power to work with an external process. I want to minimize the function 'TryThisNumber[x_]' which sends the value of x to something external and gets back a result from that external object. I want to find the number which minimizes the returned result. But ... I can only talk to the external process using strings. So, assume I have a function SendNumberToProcess[m_String] which does the actual communication with the process, I try:

TryThisNumber[x_]:= ToExpression[SendNumberToProcess[ToString[x]]];

and then,

FindMinimum[{TryThisNumber[a],0<a<10},{a}];

The problem is that ToString[x] in the above is just evaluating to the symbol, a, not a numerical value, and thus I'm not actually able to send a number to the external process. Any ideas?

Update. Presumably the problem is that FindMinimum has the HoldAll attribute, but this attempt doesn't work either:

TryThisNumber[x_]:= ToExpression[SendNumberToProcess[ToString[Evaluate[x]]]];
$\endgroup$

marked as duplicate by J. M. is away Apr 11 '18 at 13:51

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

  • 1
    $\begingroup$ Have you tried TryThisNumber[x_?NumericQ] := (* stuff *)? $\endgroup$ – J. M. is away Sep 21 '12 at 16:26
  • $\begingroup$ Thanks, tried that but makes no difference. It's presumably because FindMinimum etc have the attribute HoldAll. I thought maybe this would work, but it doesn't: TryThisNumber[x_]:= ToExpression[SendNumberToProcess[ToString[Evaluate[x]]]]; $\endgroup$ – Cuboid Sep 21 '12 at 16:33
  • 1
    $\begingroup$ It seems you forgot the NumericQ[] in your new definition... $\endgroup$ – J. M. is away Sep 21 '12 at 16:37
  • 3
    $\begingroup$ Dont forget when you define the function with the NumericQ pattern, the old generic argument definition is still there. Be sure to clear it.. $\endgroup$ – george2079 Sep 21 '12 at 16:44
  • 2
    $\begingroup$ "I also wanted to ask what exactly is going on with the ?NumericQ construct, or rather, why specifically does it solve this problem." - See this. In short, the routines will first attempt a symbolic analysis of your objective function. If the function you want to optimize cannot be subjected to such analysis, then you need the _?NumericQ in the definition. $\endgroup$ – J. M. is away Sep 22 '12 at 8:41
4
$\begingroup$

Thanks to J.M. and george2079, this works:

TryThisNumber[x_?NumericQ] := ToExpression[SendNumberToProcess[ToString[x]]];
$\endgroup$

Not the answer you're looking for? Browse other questions tagged or ask your own question.