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

AI Thread Summary
The discussion revolves around issues encountered when using the NMinValue function in Mathematica with a custom-defined function, chi2, which relies on matrix algebra and Mathlink functions. The user successfully retrieves numerical outputs from chi2 with specific parameters but faces an error when attempting to minimize the function, indicating that the function value is not a number at a certain point. This problem is suspected to stem from NMinValue evaluating the function before the minimization process, particularly due to the Mathlink integration. The user explores potential solutions, including the use of Evaluate[], and considers whether NMinimize preprocesses functions or uses algebraic derivatives. A suggestion is made to define parameters with m_?NumericQ to ensure they accept only numerical inputs, which may resolve the issue. The user acknowledges the need to check this approach, given the function's dependency on numerical inputs for proper evaluation.
Hepth
Science Advisor
Gold Member
Messages
457
Reaction score
40
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:
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:
NMinValue::nnum: The function value 0.584316+<<49>>+<<1>> is not a number at {mb} = {4.66099}. >>

though

Code:
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 can't 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.
 
Physics news on Phys.org
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.
 
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.
 

Similar threads

Replies
6
Views
4K
Replies
1
Views
2K
Replies
1
Views
2K
Replies
2
Views
3K
Replies
2
Views
3K
Replies
3
Views
9K
Replies
3
Views
3K
Back
Top