# [Mathematica] : Mathlink/Evaluation of a function using NMinValue/NMin

Tags:
1. Jun 30, 2014

### Hepth

I have a function that is defined using a variety of things, some matrix algebra, some mathlink functions, etc. But they are all defined to evaluate when called with the parameters :

chi2[mb, vmc, v1, v2, v3, v4, 0.1066, 0.219]

gives me a number back. I can even do a table over some range of parameters and it always returns a value, no matter how fine my grid becomes.

But when I run something like :

Code (Text):
NMinValue[chi2[mb, 0.9882, 0.4536, 0.1485, 0.2981, -0.142279, 0.1066, 0.219], {mb, 4.6 - 0.2, 4.6 + 0.2}, AccuracyGoal -> 5]
Mathematica gives me :
Code (Text):
NMinValue::nnum: The function value 0.584316+<<49>>+<<1>> is not a number at {mb} = {4.66099}. >>
though

Code (Text):
chi2[4.660987123189611, 0.9882000000000001, 0.4536, \
0.14850000000000002, 0.29810000000000003, -0.14227941068376537, \
0.1066, 0.219]
gives me a value, 120.067.

So I don't know why it is complaining about that point.

I believe it has to do with NMinValue trying to evaluate the expression before it runs its minimization, and due to Mathlink it cant return a value or functional form unless its passed the parameters first. Like how you can specifiy SymbolicPreprocessing in NIntegrate.

I tried Evaluate[] over the chi2, but that doesn't work.

I can't really give a sample code, its much too difficult. But does anyone know if you can force a function to be evaluated at each given point?

I can also plot the function over the range of mb, it is just a simple parabola with a minimum right where I expected it. Plot has no trouble evaluating it.

Does NMinimize use algebraic derivatives? Does it try to preprocess functions before passing it a test argument?

This is all in Mathematica 7 for the moment. I can try 8 and 9 later, but not for a bit.

2. Jul 1, 2014

### Bill Simpson

Yes, Mathematica does all sorts of things in the evaluation process that can break things which expect constant numeric values and get symbols.

Try changing your definition to use m_?NumericQ for each of your parameters m and see if the problem goes away.

Doing that means your function is in some ways undefined for anything but constant numeric arguments.

3. Jul 1, 2014

### Hepth

Yes, due to the mathlink to some external Fortran code it is undefined unless given numerical inputs. It'll just return Failed otherwise.

I already set a property of the mathlink function as numerical, but maybe I must do tht to each input as well. I'll check when I get back to my computer.